2IMGCdrP@@@ )4   "D}, M ) TiTWiWg2 Ԣ` H i`iK ԩ`GៀL` HK!HKH@L,0 )i/ XA)Lb +)D\]g_ ?/"p@͸  ɜUUɛ`ff  ܪ330 ˩ʙppʙppp˩pwp̺ppwwwwp&Xb0qqwqqwqwqwwqwqwwwwwwwqwqqwqwwwqwwqwqwwqwqqwwwwwqwwqqqqqqqqqqqwqqqqqqqqqwqqqqqqqwqqwqwwqwqwqwwqwqwwwwwqqwqqwwqqwwwqwqwqqwwqqqqqqqqqwqqqqqqqqqwqqqqqqqqqqwwwwqwwqwwwqwwqqwwwwqwqwqqqwqqwwwqwqwwqqqGSINF.22ݸ;$' @AWGS.TA0851 ͸ T.J.MORRIS͸ ѶARTICLESu˸3ݸ:'GSINFOSI-ܸMINISTEL %ݸ;FINDER.DATAɘѶpܸP.MANET۸ܸ*GSINFOS.22AԸ Ը ICONSB۸#%INFOSAFINDER.ROOTܸ-pܸ~  !"#$%&'()*+,-./01234Micol Advanced BASIC Version 4.0 - Par Philippe BONNAURE Aprs l'article que j'avais cris dans le GS Club 19 propos de Micol Advanced BASIC 3.6 (Micol Advanced BASIC), voici un nouveau chapitre avec la parution de Micol Advanced BASIC version 4.0 de Micol System. De manire tre le plus prcis possible au sujet de ce langage de programmation, je reproduis et traduis ci-dessous la lettre mailing envoye aux utilisateurs de Micol Advanced BASIC. ----------------------------------------------------------------- Cher utilisateur de Micol Advanced BASIC, Micol System est fire d'annoncer la parution de Micol Advanced BASIC 4.0 pour l'Apple IIGS, la version la plus complte de Micol Advanced BASIC. En Mars 1990 nous avons livr la version 3.7.2 de Micol Advanced BASIC pour l'Apple IIGS. Depuis cette date, des utilisateurs tel que vous, nous avez fait part de vos suggestions sur la manire d'amliorer Micol Advanced BASIC et nous vous avons cout. Le rsultat de ce dialogue est la version 4.0 de Micol Advanced BASIC. UN MANUEL TOUT A FAIT NOUVEAU --------------------------- Le manuel de la version 4.0 a t compltement rorganis et rcrit. Le nouveau manuel est vraiment particulier et comporte les points forts suivants. Il est : - Complet : -------- Le nouveau manuel ralise une description complte de chacun des aspects de Micol Advanced BASIC. - Bien organis : ------------ Le manuel a t organis aussi bien pour le programmeur novice que pour le programmeur expriment. Le manuel est articul en 6 parties distinctes, chacune d'entre-elle expliquant un aspect particulier du langage en commenant par des travaux pratiques simples pour les dbutants jusqu' la ralisation de programmes en mode DeskTop (Dans le style du Finder d'Apple) pour les programmeurs expriments. - Ecrit clairement : --------------- Chaque aspect du langage est expliqu clairement. Aucun utilisateur de Micol Advanced BASIC ne doit resentir de difficults pour comprendre ce que ralise chacune des fonctions. La plupart des fonctions sont accompagnes d'exemples qui expliquent leurs emplois. L o cela s'avre ncessaire, certaines fonctions sont dcrites pas pas pour en faciliter la comprhension. - Une rfrence pratique : -------------------- Le manuel n'a pas t conu dans le seul but de n'tre qu'une description de Micol Advanced BASIC, mais c'est aussi un manuel de rfrence facile utiliser lorsque vous avez besoin d'informations. La table des matires et d'index sont trs dveloppes et ont t tudies de faon ce que l'accs aux informations soient le plus facile possible. Vous n'aurez aucune difficult trouvez ce que vous cherchez. - Facile lire : ----------- Les textes choisis l'ont t pour leurs simplicits. La typographie est are. AJOUT A L'EDITEUR DE TEXTE ----------------------- L'diteur de texte de la version 4.0 de Micol Advanced BASIC a dsormais la facult de sauvegarder les fichiers au format ASCII. Ceci peut tre pratique si vous dsirez utiliser votre traitement de texte favorit pour diter des programmes. De plus de nouvelles commandes ont t rajoutes et permettent de : - Sauter au mot suivant. - Sauter au mot prcdent. - Effacer jusqu'en fin de ligne. - Effacer jusqu'au dbut de ligne. - Effacer la ligne courante. COMPLEMENT AU LANGAGE DE PROGRAMMATION ------------------------------------- MODULE DE CHARGEMENT POUR LE BOOT AU NIVEAU DU FINDER ------------------------------------------------ Auparavant si vous souhaitiez avoir des programmes Micol Advanced BASIC bootable partir du Finder, vous deviez convertir vos programmes par un utilitaire en de volumineuses applications GS/OS. Cela n'est dsormais plus ncessaire, maintenant le petit programme de chargement du module Micol Advanced BASIC permet de lancer directement un programme par un double click sur son cone au niveau du Finder. Vous avez cependant toujours la possibilt de crer des applications S16 si vous le souhaitez, mais pourquoi le faire ? LES ENTIERS "LONG" ----------------- Dans les prcdentes version de Micol Advanced BASIC, les entiers ne pouvaient avoir qu'une valeur comprise entre + ou - 32767. Dsormais en utilisant une simple option du compilateur, les entiers peuvent avoir une valeur comprise entre + ou - 2 147 483 647. Mme les nombres rels "courts" ne vous donnent pas une aussi grande capacit. Ces entiers s'excutent au niveau de la machine la mme vitesse que les entiers dit "courts". 16 COULEURS EN MODE 640 SUPER HAUTE RESOLUTION GRAPHIQUE (SHGR) ---------------------------------------------------------- Auparavant, sans l'utilisation de la Toolbox, vous ne disposiez que de 4 couleurs en mode 640 SHGR. Dsormais avec la version 4.0 vous disposez de la mme capacit en couleur qu'en mode 320, mais avec une rsolution deux fois plus importante. LES COMMANDES GS/OS ------------------ Aussi puissant que puisse tre Micol Advanced BASIC, certaines commandes ne peuvent tre ralises que directement sous GS/OS. Auparavant seul les programmeurs en assembleur avaient cette possibilit, dsormais toutes les commandes du systme d'exploitation sont virtuellement votre disposition au niveau du BASIC. LES TABLEAUX BOOLEENS ------------------- Les structures de donnes de Micol Advanced BASIC sont plus compltes avec la possibilt de crer des tableaux de boolens. Les tableaux de boolens vous permettent de mmoriser de multiples choix ou dcisions (Un lment de tableau boolen n'occupe qu'un octet en mmoire) pour les utiliser ultrieurement. L'utilisation des variables boolennes en gnrale t revue. L'HEXADECIMAL EN LITTERAL ----------------------- Si vous avez besoin de spcifier une adresse, ou autre chose, en hxadcimal et que vous ne souhaitiez pas la convertir en dcimale vous mme, alors spcifiez simplement le nombre en hxadcimal et laissez faire le travail par le compilateur. Par exemple crire : Adresse_Hex = $C0A0 est lgale sous Micol Advanced BASIC. CONVERSION D'ALIAS ----------------- N'avez-vous jamais voulu changer un mot rserv par un autre mot de votre choix ? Ou encore dclarer une constante dans votre programme au lieu d'utiliser une variable cet effet ? Vous pouvais dsormais raliser cela en utilisant des alias. Par exemple si nous voulons modifier le mot rserv "HOME" par "Efface ecran ". "HOME" n'est pas trs significatif n'est-ce pas ? En utilisant les alias au dbut de votre programme, dclarez simplement que "Efface ecran" quivaut "HOME". Ds lors tout ~Efface ecran sera considr comme une instruction "HOME" et acquirera ses proprits. Les alias ont un tel potentiel, qu' la limite, il vous permettront de redfinir votre propre langage. Virtuellement n'importe quel mot peut remplacer un mot rserv. Nous esprons que l'alias deviendra l'une des inovations les plus populaire de Micol Advanced BASIC. CDA PRIMAIRES ET SECONDAIRE ------------------------- Auparavant, chaque CDA que vous ralisiez sous Micol Advanced BASIC tait trs volumineux, ceci tait d au fait qu' chaque fois une copie du Run Time tait inclus dans le CDA. Cela n'est plus le cas maintenant. Un seul CDA, le CDA primaire comportera cette copie du Run Time, que les autres CDA, les CDA secondaires, partagerons cette copie du Run Time. De ce fait les CDA secondaires seront trs compacts. LES EXEMPLES DE PROGRAMMATION --------------------------- La version 4.0 est livre avec un jeu de complet d'exemples dmontrant les aspects fondamentaux du langage. Il y a mme un petit jeu crit sous Micol Advanced BASIC. De plus quelques exemples sont l pour dmontrer les possibilits d'criture en mode Desktop sous Micol Advanced BASIC. Si vous devez crire des applications en mode Desktop, vous trouverez ces exemples trs utiles. ET BIEN D'AUTRES CHOSES ENCORE .... ----------------------------- Une grande quantit de modifications mineures ont t ralises tel que de meilleurs crans d'aides ou un cran de formattage plus amical, ces modifications sont bien trop nombreuses pour tre dcrites ici. Bien sr tous les bugs connus ont t corrigs. Nous pouvons honntement dire que Micol Advanced BASIC est un langage complet et fiable. Nous n'avons, ici, fait que mentionner les nouveauts par rapport la version 3.7.2. Si vous disposez d'une version plus ancienne, vous aurez bien sr encore plus de nouveauts dcouvrir. OFFRE DE REMISE SPECIALE ---------------------- Comme utilisateur enregistr de Micol Advanced BASIC vous pouvez recevoir la version 4.0 (Logiciel + Manuel) pour seulement 49.95$ US plus 10$ de frais de port (15$ hors Amrique du Nord). Ceci reprsente un prix trs bas. Le prix de base de Micol Advanced BASIC tant de 159.95$ US. Cette offre est valable jusqu'au 31 Mai 1992.(NDLR: Aie! Aie!) LE LANGAGE ASSEMBLEUR ET VOTRE APPLE IIGS -------------------------------------- N'oubliez pas non plus Micol Macro, notre macro assembleur maison. Micol Macro est dsormais disponible pour les utilisateurs de Micol Advanced BASIC pour 49.95$ US. Micol Advanced BASIC IIGS et Micol Advanced BASIC IIe ou //c ont exclusivement t crits sous Micol Macro, ainsi vous comprendrez mieux sa puissance. Un chapitre dans le manuel de Micol Advanced BASIC lui est consacr qui vous explique comment intgrer un programme assembleur Micol Advanced BASIC. L'association de Micol Advanced BASIC avec l'assembleur produit des effets tonnants. MICOL ADVANCED UTILITIES ----------------------- Avec la version 4.0 de Micol Advanced BASIC, vous pouvez aussi obtenir Micol Advanced Utilities pour le prix de 19,95$. Micol Advanced Utilities a t entirement crit sous Micol Advanced BASIC par son auteur. Pour tout achat de Micol Advanced Utilities vous recevrez le source de ce programme. Ca sera pour vous une bonne manire d'apprendre la programmation structure sous Micol Advanced BASIC et de disposer ainsi d'un utilitaire disque puissant. Pour commander vous pouvez utiliser votre carte bancaire (Visa ou MasterCard) ou pour obtenir des renseignements complmentaires, appelez le (416) 495 6864 pendant les heures ouvrables (nota, le numro de FAX est (416) 496 9190) . Bien sincrement, Steve Brunier. Prsident. Adresse : Micol System Inc. 9 Lynch Road Willowdale Ontario Canada M2J 2V6 ----------------------------------------------------------------- Ceci conclut la lettre mailing de Micol System. Prsentation matrielle de Micol Advanced BASIC ------------------------------------------ Le logiciel comporte deux disquettes, l'une contenant le programme lui mme, l'autre tant compos d'exemples en tous genres facilitant l'apprentissage de la programmation sous Micol Advanced BASIC. La documentation comporte 270 pages en anglais au format A4 reli par une spirale mtallique. Elle est crite dans un anglais facile comprendre (Niveau seconde). Pour utiliser Micol Advanced BASIC il faut au minimum : - Un Apple IIGS ROM 01 ou 03 avec un minimum de 768K de RAM. - Un Apple IIe avec une mise niveau GS + ROM 01 et un minimum de 768K de RAM. - Un lecteur de disquettes 3.5 - Un cran monochrome capable d'afficher 80 colonnes en mode texte. - GS/OS (Fournit sur la disquette programme de Micol Advanced BASIC) En option il est conseill d'avoir : - Une imprimante - Plus de mmoire par l'intermdiaire d'une carte d'extension - Un second ou plusieurs lecteurs de disquettes 3.5 - Un disque dur - Un cran couleur Il est noter qu'une version 8 bits de Micol Advanced BASIC existe aussi pour les Apple IIe et Apple //c. Les sources des programmes ecrits sur Micol Advanced BASIC IIe et //c sont facilement transportables sur IIGS aprs une simple recompilation par le compilateur 16 bits de Micol Advanced BASIC IIGS. Pourquoi un langage BASIC aujourd'hui ? ----------------------------------- La question que l'on peut se poser est : Pourquoi un langage BASIC sur Apple IIGS alors que d'autres langages tel que le Pascal ou le C existent et peuvent sembler meilleur ? Pour rpondre cette question je remontrait quelques annes en arrire. L'engouement pour les Apple IIe et //c , d'aprs moi, a t d au fait que ces machines taient et sont faciles d'accs. Le dbutant comme le "Pro" pouvait laisser libre court son imagination pour dvelopper ses programmes. Le dbutant utilisant le "bon vieux" BASIC AppleSoft, le fou d'assembleur dveloppant ses routines soit par le mini-editeur assembleur intgr, soit directement en langage machine par le CALL-151. Le virtuose des jeux alliant les facilits du BASIC au prouesses de l'assembleur pour nous faire rver devant des jeux d'arcades poustouflants. Les revues tel que Pom's, Tremplin micro, etc... avait leurs pages pleines de programmes AppleSoft ou assembleur, qui permettait aux nophytes de pouvoir lentement s'initier aux mystres de la programmation et progressivement devenir des "pro" de la prose AppleSoft ou assembleur. Le langage BASIC permettait cela, d'une part parce qu'il tait intgr dans la machine, et d'autre part par la simplicit de sa syntaxe. En effet le Pascal bien qu'existant sur ces machines, n'a pas tellement sucit l'enthousiasme, si l'on se rfre ces revues et au nombre d'articles dits dans ce langage. Avec l'avnement de l'Apple IIGS, le BASIC AppleSoft n'a pas volu, on trouve toujours les numros de ligne, un langage un peu trop pauvre pour une machine o le graphisme et le son sont mis en valeur et surtout, c'est toujours un langage 8 bits sur une machine pouvant travailler sur 16 bits. Les programmeurs amateurs et dveloppeurs sur cette machine, se sont alors retourns vers des langages compils pouvant au mieux tirer parti de leur machine 16 bits. Or seul le Pascal, puis le C se trouvaient en bonne place. Ces langages alliant la rapidit des programmes compils la souplesse des programmes structurs (Procdures, plus de numro de ligne etc..). Notre "pauvre vieux" BASIC AppleSoft ne pouvait pas rivaliser avec ces langages de haut niveau. Hors les personnes qui avait fait le passage du monde de l'Apple IIe ou //c, vers celui du IIGS n'avait pas d'autre solution que d'apprendre un nouveau langage et donc une nouvelle syntaxe, une nouvelle formulation et une nouvelle manire de penser pour programmer en Pascal ou en C pour tirer profit du moteur 16 bits de leur Apple IIGS; ou bien alors il leur fallait se resigner programmer en AppleSoft mais pourquoi sur un IIGS? un IIe/c faisant tout aussi bien l'affaire. Pour un dbutant il n'est pas toujours facile "d'attaquer" la programmation par des langages tel que le Pascal ou le C. D'o peut tre la diminution progressive de programmes et donc la diminution des articles consacrs la programmation sur IIGS en BASIC, puis la disparition progressive de ces trs bonnes revues qui ont fait les heures de gloire de l'Apple IIe/c faute de matire premire : Les programmes. Les revues ne pouvaient plus faire partager aux gens l'initiation la programmation, les trucs et astuces, le plaisir de voir comment on fait, de l'essayer soit mme, puis d'essayer de faire mieux etc..., car une fois de plus rare tait les sources de Pascal et de C dans toutes ces revues. C'est pourquoi je pense que Micol Advanced BASIC permet de retrouver cet aspect de l'Apple, la syntaxe de base de son langage est la mme que celle de l'AppleSoft : simple. Pas besoin donc d'appendre partir de zro de "nouveaux mots Anglais" pour dvelopper sous Micol Advanced BASIC, vous connaissez l'AppleSoft, alors vous savez dj programmer 80% sous Micol Advanced BASIC. Que sont les 20% apprendre ? Ce sont les nouveaux mots permettant d'utiliser le graphisme et le son donc les possibilit de votre machine. Ce sont quelques connaissances de la ROM et pour finir l'apprentissage de la programmation structure, qui lorsque l'on y a got ne vous donne plus envie d'utiliser les GOTO. Si la connaissance de l'anglais vous pose des problmes, alors, avec les alias de Micol Advanced BASIC transformez ce langage dans votre langue maternelle et programmez avec elle. Vous voulez rutilisez vos bons vieux programmes AppleSofts dvelopps sur votre Apple IIe/c, moyennant de petites modifications, ils tourneront, compils, et en 16 bits sur votre Apple IIGS. Micol Advanced BASIC est moderne puisqu'il offre les avantages du Pascal et du C : Modularit, procdures, passage variables par adresse ou par valeur, plus besoin de numro de ligne (Mais on peut toujours les garder si l'on veut, ceci a t fait pour que l'on puisse facilement transposer les programmes crit en AppleSoft). C'est mon avis un bon tremplin pour, par la suite, passer au Pascal ou au C. Pour ceux qui sont interesss cela leurs permettra de pouvoir changer des trucs et astuces l'intrieur du Club par la programmation et par la diffusion des sources de programmes et d'exemples (ceci faisant cruellement dfaut, ou tant trop rare, en Pascal et en C) et permettrait ainsi de donner une nouvelle impulsion la programmation sur GS. C'est galement un moyen de dcouvrir les entrailles (ROM et Priphriques) de leur machine et pouvoir enfin donner libre cours leur imagination et dominer leur Apple prfr en abordant cette machine de manire plus aise. Les possibilits de Micol Advanced BASIC ------------------------------------- Celles-ci vous sont dmontres par le petit jeu Puz (A noter que ce programme crit en SHGR 320 aurait pu l'tre aussi en SHGR 640 Micol supportant les deux rsolutions SHGR). Je ne pourrais pas, bien sr, vous donner ici toutes les possibilits de Micol Advanced BASIC cependant la liste des mots rservs sous Micol Advanced BASIC vous permettra d'apprhender les capacits du langage : ABS, ADDR, ADDRESS, ALIAS, AND, APPEND, ASC, AT, ATN BEGIN, BELIEVE, BELL, BKCOLOR, BLOAD, BSAVE, BYE CALL, CASE_OF, CAT$, CHAIN, CLEAR, CLOSE, COPY, COLOR, COS, CREATE DATA, DATE$, DELAY, DRAWSTR, DECLARE, DELETE, DIALOG, DIM, DISPLAY, DO, DOUBT, DUNNO ELSE, ELSE_DO, END, ENDCASE, ENDDO, ENDFUNC, ENDIF, ENDPROC, EOF, EXP FALSE, FILE, FLUSH, FOR, FORMAT, FN, FRE, FREEMEM, FUNC GET, GET_MEM, GOSUB, GOTO, GR, GS_OS HCOLOR, HGR, HGR2, HLIN, HPLOT, HOME, HTAB IF, INCLUDE, INDEX, INKEY$, INPUT, INSERT$, INSLOT, INSTRUM, INT, INVERSE LEFT$, LEN, LET, LINK, LOCK, LOCK, LOG, LOWER$, LRETURN MENU, MID$, MOD, MOUSE, MOV_MEM, MS_TEXT, MUSIC NEXT, NOISE, NORMAL, NOT, NOTRACE, NOTICE OPEN, ON, ONERR, ONLINE$, OR, OUTSLOT PDL, PEEK, PERFORM, PLOT, POKE, POP, POS, PREFIX, PREFIX$, PRINT, PRTON PROC QUIET READ, REM, RENAME, REPEAT, RESUME, RESTORE, RETURN, RIGHT$, RND, ROPEN, ROUND, ROUTINE, RUN SCRN, SEEK, SEGMENT, SGN, SILENCE, SIN, SQR, SPC, SPEED, STEP, STOP, STRACE, STR$ TAB, TAN, TEXT, THEN, TIME$, TO, TOOLBOX, TRACE, TRUE UNTIL, UNLOCK, UPPER$, USING VAL, VALUE, VLIN, VTAB WARNING, WAVE, WEND, WHILE, WINDOW, WOPEN Ce que ne fait pas ou pas encore Micol Advanced BASIC ------------------------------------------------ Micol Advanced BASIC dans la version 4.0 ne "sait" pas crer de NDA, une prochaine version devrait peut tre le permettre. On ne peut pas utiliser l'accentuation dans le programme source, en effet le "e" accent grave et le "e" accent aigu correspondent aux accolades ouverture et fermeture (Clavier US) qui servent Micol Advanced BASIC pour dlimiter le commentaire. Par contre la saisie des caractres accentus dans un programme Micol Advanced BASIC que l'on excute ne pose pas de problme. Conclusion: A propos du domaine public GS CLUB 237 ----------- Comme parfois un bon exemple vaut mieux qu'un long discours, vous trouverez dans le dossier MaBug.Demo de la disquette GS Club 237 un petit programme de jeu crit sous Micol Advanced BASIC. Il est accompagn du source complet du programme. Un petit mot sur MaBug (Pour Micol Advanced Basic User Group) qui est un Groupement d'utilisateurs Micol Advanced BASIC, ces utilisateurs sont aussi bien Amricains que Canadiens avec parmis eux quelques Francophones (Qubcois) et ils sont les ralisateurs de ce jeu. Le dossier MaBug.Demo comporte les fichiers suivants: - Puz16.S16 qui est le jeu lui mme et qui est directement excutable partir du finder sans avoir besoin de Micol Advanced BASIC 4.0. - Puz16.Lnk qui est le fichier obtenu aprs compilation et gnration des liens du fichier texte Puz16 (Voir plus loin). Il faut avoir Micol Advanced BASIC 4.0 pour lancer ce fichier directement partir du Finder, mais rassurez-vous, vous n'aurez pas le faire et il ne fera rien de plus que Puz16.S16. Ce fichier a permis la cration de Puz16.S16 par l'adjonction d'une copie du Run Time de Micol Advanced BASIC. Ceci explique pourquoi il est plus volumineux que Puz16.Lnk. Avec Micol Advanced BASIC 4.0 le fichier Puz16.Lnk suffit faire fonctionner l'application d'o un gain trs notable en place sur la disquette ou le disque dur (toutes les applications dveloppe sous Micol Advanced BASIC allant chercher le Run Time au mme endroit). - MaBgpuzpic qui est fichier $C1 contenant l'image de titre et une icne de personalisation du jeu. - MaBugpuzspec qui est fichier texte contenant les variantes du jeu. Ces fichiers (Sauf Puz16.Lnk) doivent toujours tre dans le mme dossier ou rpertoire pour que le jeu puisse fonctionner correctement. Se trouve galement dans ce dossier : - Read.Me qui est un fichier texte, qui comme son nom l'indique, il convient de lire pour en savoir plus sur le jeu et ses concepteurs. - Source est un dossier qui contient 5 autres fichiers : - Puz16 qui est un fichier texte contenant le source du programme Puz16 et qui aprs compilation permet d'obtenir le jeu Puz16.Lnk puis Puz16.S16 par adjonction du Run Time. - Puz16.routine qui est un fichier texte contenant le source des sous-programmes qui seront inclus Puz16 au moment de la compilation. - MaBug.lib qui est fichier texte, contient lui aussi des sous-programmes qui seront inclus Puz16 au moment de la compilation - ClrHiBits.ML qui est un fichier texte, contient le source d'un programme crit en assembleur Micol Macro et qui permet de remettre zro le bit de poids fort d'une serie d'octets en mmoire - ClrHiBits.ML.B est un fichier contenant le code machine gnr aprs compilation par l'assembleur Micol Macro du fichier prcdent. Ce code sera inclus Puz16 au moment de la compilation par Micol Advanced BASIC 4.0. Tous les fichiers textes sont ditables par un traitement de texte quelconques. En ditant ces fichiers vous verrez comment a t programm ce jeu et comment est organis Micol Advanced BASIC 4.0, vous pourrez ainsi juger vous mme de ses qualits ouAWGS.TA08v͸ ' '*AWGS.TA.08P6 '  5&RELIEFSC5-ICONES.RELIEFSF ^׶) |׶) 5FINDER.DATAPj p+ 5SCIENCEQ&͸ 5LETTRE6.J.REYP    5789:;<=>?@AB0?)^]@ o G@PyHP(dHPP (   ~ 14 avril 1992 9:111999dQ7-%P("(  Q7-%P("(  P @7nP?7nP%EMU @@@#+S[ 0P0 d l t       @ P@'PX@$((0^!((0^ APPLEWORKS.GS - Trucs et Astuces - 8me partie - Mars 1992    Dans cette livraison de GSINFOS, je vous propose de travailler essentiellement sur le module graphique d'APPLEWORKS.GS:   1) Il est souvent utile de pouvoir tracer des arcs de cercle ou d'ellipse vectoriss d'ouverture quelconque, alors que les outils du module graphique n'offrent que le quart de cercle ou d'ellipse. Pourtant la fonction existe dans AWGS: vous apprenez comment la mettre en uvre.   2) Comment donner l'illusion du relief en jouant sur la palette graphique? C'est bien pratique quand on veut faire ressortir l'cran des informations particulirement intressantes. L-encore, les outils du module graphique vous donnent cette possibilit.  r  3) Suite de la chronique "La science et AWGS"! On vous explique ici comment fabriquer un document comportant du texte, des formules de maths et des graphiques. Attention, vous avez besoin des fontes SYMBOL et VECTORS qui sont jointes cet envoi...    --------------------------------   1) Comment fabriquer des arcs de cercle ou d'ellipse d'ouverture quelconque dans le module graphique?   AWGS ne met disposition dans ce module que l'outil quart de cercle (ou d'ellipse) qui fournit donc une ouverture de 90 avec un rayon de dpart horizontal ou vertical.  o  oSi on souhaite obtenir un autre angle d'ouverture, il reste bien sr la possibilit d'utiliser la gomme qui est disponible dans la palette d'outils. Malheureusement, effacer avec la gomme est une opration de type bitmap ce qui signifie que si vous imprimez le nouvel arc de cercle sur une laser Postscript, cette opration sera ignore et vous retrouverez le quart de cercle en entier!   Il existe une autre possibilit qui conserve le caractre vectoriel de l'objet arc de cercle. Pour la mettre en uvre, il faut passer par le tableur en lui demandant de dessiner le "camembert" d'une srie de nombres astucieusement choisie.  zSupposons par exemple que vous souhaitiez dessiner un arc de cercle d'ouverture 30, le rayon de dpart tant orient 10 de l'horizontale. Entrez alors dans une feuille da calcul vierge les 3 nombres 100=90+10, 30, et 360-(100+30)=230. Demandez (menu "Data" ou "Donnes") le graphe "camembert" de ces 3 nombres que vous aurez slectionn. On obtient un disque comportant un secteur ayant les caractristiques recherches: il suffit de slectionner ce dernier et de le copier-coller dans votre dessin. Vous remarquerez que ce secteur est en fait constitu de 3 objets sparables: l'arc de cercle proprement dit et les 2 rayons qui le limitent. Comme il s'agit d'un objet vectoriel, vous noterez aussi qu'on peut faire varier l'paisseur et la couleur du trait de l'arc de cercle ainsi que la couleur de remplissage du secteur. Exercez-vous!      i2) Est-il possible avec AWGS de donner l'impression du relief dans un dessin?   La rponse est oui et il y a plusieurs manires d'y arriver.   La premire, la plus fatiguante, est de dessiner par vous-mme le relief en question. C'est souvent fastidieux et le rsultat n'est souvent pas terrible.   La deuxime est d'exploiter la technique du "dithering" utilise par le module graphique d'AWGS. Cette technique permet d'obtenir 16 couleurs avec une dfinition de 640X200 pixels, alors qu'en ralit seules 4 couleurs sont disponibles.  xSi on regarde de plus prs les pixels des 16 couleurs de base disponibles, on remarque en effet qu'il y a des pixels "gauche" et des pixels "droit". C'est en jouant sur cette constatation qu'on arrive donner trs facilement une impression de relief en mariant des objets " gauche" avec des objets " droite" (le rve des politiques!).  Comme un dessin en dit plus long qu'un discours, reportez-vous au fichier RELIEF. Vous comprendrez immdiatement l'intrt de la chose. Exemple concret d'application: allez-voir le fichier ICONES.RELIEF et constatez que vous n'avez pas besoin sur ce plan du systme 7 du Mac!  o  p3) Chronique "La science et AWGS"  A  7Vous trouverez dans le dossier SCIENCE un kit qui permet d'diter des documents caractre scientifique comportant textes, graphiques et formules. Avant toute utilisation, ouvrez le fichier LISEZ.MOI et notez que l'usage de ce kit est rserv aux utilisateurs qui matrisent trs bien le module graphique et le module de PAO. ((0^   ((0^   DE0 )@#l4b@$Pz(d$PzP (  zp =Had =Had===d=dH=H=fofo~Les pixels "gauche" <EL<EL|Les pixels "droits" "R "R 'F 'F,8 ,82*2*66j 7j j |EFates glisser un des rectangles de droite sur ceux de gauche jojox,pour observer l'impression de relief GHIJKLMNO0 )@ prHm @ Sans.titre1 (GR)$PzN$Pz8HN[^adgjmpsv|^nt} OW`hqy'14>EO M zp TinTin h+h+XlPoLLh+v|?tv|~?ht~?hj?*jl?+l??Px=h+?A-.7?C156?F234??\?6<C<<l?<<&<#<$<%D$B$<">#B"@">#2&4%2#2"4#8"6"4&4'8&6&4",'.&,",&,'2&0&,&'*&(&"('*&("( !&Nnp??pr?@rt?Atv?Bvx?Cxz?Dz|?E|~?F~??`=1jF0f`??tudio??? <wwwww<<UUUU<z?0 /:R/:Rtrtt/:R/R?0?1?7PR?88:<>@BDFHJLNP?:8:<>@BDFHJLN??=/:R?33333333333313333333333331?35UU33=1<3UU33=333=31<5SUU3333=31 F    $C K S  ' 4 4L  T  \ oO d '_  g '3  ; 4X  `      T \ d " l t |  R Z b  h|    '!((0^((0^!PP0^**0^ `P0^ x0^((0^lll KIT SCIENTIFIQUE POUR APPLEWORKS.GS  T(GS.INFOS)  T  T  a  a  a  a  a  aCe kit a pour objet d'utiliser les remarquables capacits d'intgration d'APPLEWORKS.GS pour vous permettre d'crire des textes scientifiques, comportant graphiques et formules et de les afficher l'cran tels qu'ils seront imprims. Pour ceci, les modules de traitement de texte, graphique, tableur et mise en page sont utiliss, avec l'aide de fontes spcialises et de bibliothques prdessines de symboles graphiques.  T  T  TPour mettre en uvre ce kit, vous devez avoir une trs bonne connaissance de l'usage du module graphique et de mise en page. Moyennant quoi, vous pourrez raliser des documents qui soutiennent la comparaison avec les logiciels de PAO existants sur Mac-Intosh ou sur PC, condition que ceux-ci ne soient pas trop volumineux. L'impression se fait sans problme sur IMW// (bien sr, une LASERWRITER donnera de meilleurs rsultats plus rapidement, mais elle n'est pas indispensable). La documentation jointe vous permettra d'apprcier les rsultats.  T  T  TLa configuration minimum exige est de 1,2 Mo de RAM avec deux lecteurs de disquettes. Un disque dur et 2 Mo de RAM sont conseills ainsi qu'une carte TRANSWARP ou ZIP GSX.  v  v  vAvant toute chose, vous devez recopier dans le dossier FONTS du systme d'exploitation GS/OS 5.0x les fontes GENEVA, SYMBOL et VECTORS. Vous trouverez ces fichiers sur la disquette jointe.  T    EDITION DU DOCUMENT :  a  a  aLe document scientifique que vous souhaitez diter doit tre mis au point en plusieurs tapes:   1. Reprez tout d'abord les graphiques que vous souhaitez raliser. Editez-les dans le module graphique en utilisant au maximum les outils de dessin vectoriels. Constituez un fichier par graphique.   2. Reprez ensuite les formules de plus d'une ligne de haut (fractions, matrices, intgrales...). Assemblez ces formules dans le module graphique en utilisant la bibliothque de symboles graphiques prsents sur cette disquette (Maths et Physique) ainsi que les fontes spcialises SYMBOL et VECTORS. Constituez un fichier par formule.   3. Reprez enfin les fonctions y = f(x) dont le graphe est reprsenter. Utilisez la feuille de calcul FONCTION de AWGS.TA07 qui vous permet de la reprsenter graphiquement dans le module graphique. Mettez aussi contribution les accessoires du fichier graphique GRAPHE. Constituez ainsi un fichier par graphe de fonction.    z  z4. Tapez en traitement de texte le corps du texte de votre document scientifique. Les fontes GENEVA, SYMBOL et VECTORS sont votre disposition. Les tableaux de rsultats ou de chiffres sont constituer en utilisant les tabulations.   5. Enfin, et c'est l qu'APPLEWORKS.GS montre ses extraordinaires capacits d'intgration, assemblez le tout dans le module de mise en page. Pour ceci, suivez les lignes directrices suivantes:   - Editez la page matresse (master-page) avec des guides pour le texte. Ensuite, fates autant de rservation sur les pages courantes qu'il y a de textes intercals entre formules et graphiques. Laissez une place suffisante pour ces derniers lments. Chanez ces rservations.   - Importez le corps du texte (tape 4) et modifiez la taille des rservations ci-ncessaire, en cohrence avec la position des graphiques et formules.  r  f- Importez (copier-coller) une par une les formules et les graphiques. Rajustez ventuellement taille et disposition relatives des rservations.  d  i- Enfin, tracez, si ncessaire, les cadres des tableaux.  c  c- Sauvegardez le tout et imprimez-le en "Better Text". Si vous avez une IMW//, soyez patient.  c  r  i *** REFERENCES :    aVoici maintenant une brve description des fichiers votre disposition sur la disquette jointe.    FONTES :   La fonte GENEVA est utilise dans les bibliothques de symboles graphiques (voir ci-aprs). Les fontes SYMBOL et VECTORS sont spcialises pour l'dition de symboles scientifiques.    MATHS et PHYSIQUE :   Si l'criture de votre document ncessite l'dition de formules mathmatiques ou physiques compliques, notamment hautes de plus d'une ligne (fractions, matrices, ...), cette bibliothque utilise dans le module graphique vous aide assembler votre formule en mettant votre disposition des symboles prdessins dans le domaine des Mathmatiques et de la Physique. Ce symbolesabcdefghijklmnopqrstCollects par Dalat, les messages d'erreur du GS mis jour ------------------------------------------------------------ CODE NAME DESCRIPTION SYSTEM FAILURES CODES 0001 pdosUnClmdIntErr Unclaimed Interrup (ProDOS 16) 0004 divByZeroErr Division by Zero 000A pdosVCBErr Volume control block Unusable (ProDOS 16) 000B pdosFCBErr Bad File control blk (ProDOS 16) 000C pdosBlk0Err Block zero allocated Illegally (ProDOS 16) 000D pdosIntShdwErr Interrupt with I/O shadowing off (ProDOS 16) 0011 wrongOSVErsion Wrong GS/OS Version 0015 segLoader1Err Segment Loader error 0017 sPackage0Err Cannot load a package 0018 Package1Err Cannot load a package 0019 Package2Err Cannot load a package 001A Package3Err Cannot load a package 001B Package4Err Cannot load a package 001C Package5Err Cannot load a package 001D Package6Err Cannot load a package 001E Package7Err Cannot Load a package 0020 Package8Err Cannot load a package 0021 Package9Err Cannot load a package 0022 Package1OErr Cannot Load a package 0023 Package11Err Cannot load a package 0024 Package12Err Cannot load a package 0025 outOfMemErr Out of memory 0026 segLoader2Err Segment Loader error 0027 fMapTrshdErr File map destroyed 0028 stkOvrFlwErr Stack Overflow 0030 psInstDiskErr Please insert disk (File Manager alert) 32-0053 Memory Manager ERRORS 0100 stupVolMntErr Cannot mount system Startup volume Tool Locator Codes 0001 toolNotFoundErr Specified tool set not found 0002 funcNotFoundErr Specified routine not found 0110 ToolVersionErr Specified minimum version found 0111 messNoteFoundErr Specified message not found Memory Manager Codes 0201 memErr Unable to allocate block 0202 emptyErr Illegal operation on an Empty handle 0203 notEmptyErr Empty handle expected for this operation 0204 lockErr Illegal operation on a locked or immovable block 0205 purgeErr Attempt to purge an unpurgeable block 0206 handleErr Invalid handle 0207 idErr Invalid user ID 0208 attrErr Illegal operation with specified attributes MISCELLANEAOUS Tool Set Codes 0301 badInputErr Bad Input parametres 0302 noDevParamErr No device for input parameter 0303 taskInstlErr Specified task already in Heartbeat queue 0304 noSigTaskErr No signature detected in task header 0305 queueDmgdErr Damaged Heartbeat queue detected 0306 taskNtFdErr Specified Task not in queue 0307 firmTaskErr Unsuccessful firmware task 0308 hbQueueBadErr Damaged Heartbeat queue detected 0309 unCnctdDevErr Dispatch attempted to unconnect device 030B idTagNtAvlErr No lD tag available Quickdraw II Codes 0401 alreadyInitialized QuickDraw II already initialised 0402 cannotReset Never used 0403 notInitialized QuickDraw II not initialized 0410 screenReserved Screen reserved 0411 badRect Invalid rectangle specified 0420 notEqualChunkiness Chunkiness not equal 0430 rgnAlreadyOpen Region already open 0431 rgnNotOpen Region not open 0432 rgnScanOverflow Region Scan Overflow 0433 rgnFull Region full 0440 polyAlreadyOpen Polygon already open 0441 polyNotOpen Polygon not open 0442 polyTooBig Polygon too big 0450 badTableNum Inva1id color table number 0451 badColorNum Invalid color number 0452 badScanLine Invalid scan line number 04FF Not Implemented Desk Manager Codes 0510 daNotFound Specified DA not avaible 0511 notSysWindow Window pointer is not a point a window owned by an NDA Event Manager Codes 0601 emDupStrtUpErr EMStartUp already called 0602 emResetErr Cannot reset Event Manager 0603 emNotActErr Event Manager not active 0604 emBadEvtCodeErr Event code is greater then 15 0605 emBadBttnNoErr Button # specified is not 0 or 1 0606 emQSiz2LrgErr Size of event queue is greater than 3639 0607 emNoMemQueueErr Insufficient memory available for queue 068l emBadEvtQErr Event queue damaged-fatal system error 0682 emBadQHndlErr Queue handle damaged-fatal system error Sound Tool Set Codes 0801 noDOCFndErr No DOC or RAM found O811 docAddrRgnErr DOC address range error O812 noSAppInitErr No SoundStartUp call made O813 invalGenNumErr Invalid generator number O814 synthModeErr Synthesizer mode error O815 genBusyErr Generator already in use O817 mstrIRQNotAssgnErr Master IRQ not assigned O818 sndAlreadyStrtErr Sound Tool Set already started O8FF unclaimedSndlntErr Unclaimed sound interrupt error (reported through System Failure Manager) Apple Desktop Bus Tool Set Codes 091O cmndIncomplete Command not completed O911 cantSync Cannot synchronize with system O982 adbBusy ADB busy (command pending) O983 devNotAtAddr Device not present at address O984 srqListFull SRQ list full Integer Math Tool Set Codes 0BO1 imBadInptParam Bad input parameter OBO2 imIllegalChar Illega1 character in string OBO3 imOverflow Integer or Longint overflow 0B04 imStrOverflow String overflow Text Tool Set Codes OCO1 badDevType Illegal device type 0C02 badDevNum Illegal device number 0CO3 badMode Illegal operation 0C04 unDefHW Undefined Hardware error 0C05 lostDev Lost device : device no longer online 0C06 lostFile File no longer in diskette directory OCO7 badTitle Illegal filename OCO8 noRoom Insufficient space on specified diskette OCO9 noDevice Specified volume not on-line OC0A noFile Specified file not in directory of specified volume. OCOB dupFile Duplicate file : attempt to rewrite a file when a file of that name already exists 0C0C notClosed Attempt to open a file that is already open 0C0D notOpen Attempt to access a closed file 0COE badFormat Error in reading real or integer number 0C0F ringBuffOFlo Ring buffer overflow : characters arriving faster that the input buffer can accept them 0C10 wriTeProtected Specified diskette is write-protected 0C40 devErr Device error : device failed to complete a read or write correctly. Window Manager Codes 0E01 paramLenErr First word of parameter list is the Wrong size 0E02 allocateErr Unable to allocate window 0E03 taskMaskErr Reserved bits not clear in wmTaskMask field of WmTaskRec Control Manager Codes 1001 wmNotStartedUp Window Manager not Initial Print Manager Codes 1301 missingDriver Specified driver not in the DRIVERS subdirectory of the SYSTEM subdirectory 1302 portNotOn Specified port not selected in the control panel 1303 NoPrintRecord No print record specified 1304 badLaserPrep Version of LaserPrep file in LaserWriter is not compatible with this version of Print 1305 badLPFile Version of LaserPrep file In DRIVERS subdirectory of SYSTEM subdirectory is not compatible with this version of Print Manager 1306 papConnNotOpen Connection cannot be established with the Laser-Writer 1307 papReadWriteErr Read-write error on the LaserWriter 1321 srartupalreadyMadeLLD StartUp call already made 1322 invalidCtlVal invalid control value specified Lineedit TooI SeT Codes 1401 leDupStrtUpErr LEStartUp already call 1402 leResetError Cannot reset Line Edit 1403 leNotActiveErr LineEdit not active 1404 leScrapErr Desk scrap too big to copy Dialog Manager Codes 150A badItemType Inappropriate item type 150B newItemFailed Item creation failed 150C itemNotFound No such item 150D notModalDialog Frontmost window not a dialog wIndow Scrap Manager Codes 161O badScrapType No scrap of this type Font Manager Codes 1B01 fmDupStartUpErr FMStartUp call already made 1B02 fmResetErr Cannot reset the Font Manager 1B03 fmNotActiveErr Font Manager not active 1B04 fmFamNotFndErr Family not found 1B05 fmFontNtFndErr Font not found 1B06 fmFontMemErr Font not in memory 1B07 fmSysFontErr System font cannot be purgeable 1B08 fmBadFamNumErr Illegal family number 1809 fmBadSizeErr Illegal font size 180A fmBadNameErr Illegal name length 180B fmMenuErr FixFontMenu never called 180C fmScaleSizeErr Scaled size of font exceeds limits _ARTICLESv˸3' '%TRUCS`'۸۸u)MICOL.BAS//[۸'۸'u.RESSOURCES2.MWv9nܸܸu-AWGS.TA08.TXTܸ0ܸ0u/SUR.FICHIERS.YKE:ܸܸu+SOLIDARSOFT ܸܸu)PRESSE.22'J۸۸uFINDER.DATAr۸7pܸ1u'ANNONCEܸܸu)EDITORIAL۸۸u)DERNIERES:ܸ+ܸ+u)LE.23.MAIXv ܸ:ܸ:uwxyz{|}~------------------------------------------------------------------------- J.DESTELLE UTILISER LES RESSOURCES DU GS . 2 ========================================================================== Cet article comme ceux de la mme srie, est destin dmystifier la "ToolBox" du GS. Il s'adresse tous ceux qui s'intressent un tant soit peu la programmation. ------------------------------------------------------------------------- RESOURCE MANAGER ET LA GESTION DES RESSOURCES ------------------------------------------------------------------------- Dans un prcdent article, nous avons expliqu quoi servent les ressources, sans approfondir la faon prcise dont elles sont traites par la ToolBox du GS. Nous allons maintenant rentrer un peu plus dans le dtail, et faire connaissance d'une manire approfondie avec Resource Manager. Auparavant nous rappellons rapidement quelques notions essentielles prcdemment voques. 1. LES NOUVEAUX FICHIERS ________________________________________________________________________ Le GS/OS a introduit une nouvelle forme de fichier de type "extended", tout--fait analogue au type standard de fichier du Mac. Ces fichiers sont en fait doubles, et comportent deux "branches" ("forks") : - la branche "donnes" (data fork), qui est rigoureusement identique aux fichiers prcdemment utiliss, et qui peut contenir n'importe quoi, sous n'importe quelle forme, en fonction du type de fichier choisi. - la branche "ressources" (resource fork), qui est structure d'une manire spciale, et contient uniquement des ressources, et les moyens de ranger et de retrouver ces ressources. Cette branche du fichier est entirement gre par "Resource manager" qui court-circuite GS/OS d'une manire trs efficace. Le fait qu'un fichier soit "tendu" ou non ne peut tre dtermin qu' sa cration, et ne peut pas tre modifi ensuite. Le paramtre "storage-type" d'un tel fichier est $05, alors qu'il est de $01 ou $02 pour les fichiers "standards". Tout nouveau fichier peut sans inconvnient tre cr sous cette forme, mme si on laisse la branche de ressources vide. ________________________________________________________________________ 2. LES RESSOURCES ________________________________________________________________________ 2.1 QU'EST-CE QU'UNE RESSOURCE ? Une "Ressource" est une ensemble de donnes regroupes dans un format dfini: paramtres d'un menu, d'un dialogue, d'une fentre, texte d'une fentre d'alerte, police de caractres, icne, segment de programme, ou tout autre chose. Le format des donnes peut tre quelconque. Il n'est pas connu de "Ressource manager". C'est l'application qui le dtermine. Il existe quelques formats "standards" employs par les outils du GS. Chaque ressource est dfinie par - son "type" : numro d'ordre donn son format; - son "I.D." : numro d'identification d'une ressource de type donn. Ces deux lments dfinissent compltement la ressource pour Ressource manager, et lui permettent de la retrouver et de la manipiler sans avoir besoin d'en connaitre le format. ________________________________________________________________________ 2.2 TYPES DE RESSOURCES. Le type de ressource ("res.type") est un nombre entier (deux octets). On l'crit en gnral sous sa forme hexa. Apple dfinit les types suivants: $0000 Type non valide (ne pas employer) $0001-$7FFF Type autoriss pour les applications $8000-$FFFF Types rservs pour le systme. ________________________________________________________________________ 2.2.1 Types Standards. Parmi les types rservs, Apple a dfini un petit nombre de types que nous appelons "standards" , qui sont utilisables par les nouveaux outils du systme 5.0. Ces types s'tagent entre $8001 et $8030. Ce sont les types que vous rencontrerez le plus souvent en employant l'analyseur de ResDoctor. Par exemple, le type $8006 concerne des ressources de chaines Pascal "rPString". Chaque ressource est dans ce cas uniquement compose des octets de la chaine, c'est dire l'octet de longueur suivi des octets des caractres de la chane. De mme, le type $8004 dsigne les ressources "rControlTemplate", qui contiennent dans un ordre bien dfini la totalit des paramtres d'un contrle: Bouton, Ligne diter, Barre de dfilement, ... Dans ce cas particulier, le format de chaque ressource pourra tre diffrent suivant le genre du contrle. Mais de cel, Ressource manager ne s'occupe pas; c'est l'application de le grer. ________________________________________________________________________ LISTE DES TYPES DEFINIS PAR APPLE ________________________________________________________________________ Type Nom de la ressource ________________________________________________________________________ $8001 rIcon $8002 rPicture $8003 rControlList $8004 rControlTemplate $8006 rPString $8007 rStringList $8008 rMenuBar $8009 rMenu $800A rMenuItem $800B rTextForLETextBox2 $800C rControlDefProc $800E rWindParam1 $800F rWindParam2 $8010 rWindColor $8011 rTextBlock $8012 rStyleBlock $8013 rToolStartup $8014 rResName $8015 rAlertString $8016 rText $8017 rCodeResource $8018 rCDEVCode $8019 rcDEVFlags $801A rTwoRects $801C rListRef $801D rCString $8020 rErrorString -------------------------------------------------------------------------- Pour connatre le contenu d'une ressource, il faut disposer d'une application qui puisse les analyser. "Analyser" signifie dcomposer (ou "dsassembler") l'ensemble des donnes de la ressource en ses divers composants et leur donner le nom de paramtre qui les dsigne. Des diteurs de ressources comme Derez, Genesys, ou ResDoctor peuvent faire ce travail. Les ressources dont le format est inconnu ne peuvent videmment pas tre analyses. _______________________________________________________________________ 2.2.2 Types non standards. Ils sont laisss l'initiative du programmeur. ResDoctor se rserve d'utiliser pour l'application les numros de types compris entre $7800 et $ 78FF. Le type $7800 est employ pour des ressources spciales contenant les spcifications de format d'autres ressources, ce qui permet la cration d'autant de types nouveaux analysables qu'on le dsire. ________________________________________________________________________ 2.2.3 Noms des types. Les noms donns ici aux types de ressources sont ceux qui sont employs dans les notices de rfrence, et les langages de programmation les plus utiliss, mais ne sont pas utiliss par Res.mgr. Dans le Mac, les types de ressources sont dsigns par des mots de 4 lettres et non des numros. La facilit d'employer des 'noms de ressources' du mme genre est offerte par le Ressource Manager du GS, mais leur dfinition et leur emploi est laiss l'initiative de l'application. ________________________________________________________________________ 2.3 LES I.D. DES RESSOURCES. ________________________________________________________________________ 2.3.1 Attention la confusion. Nous emploirons dans ce qui suit le terme 'ID' pour dsigner le "Resource ID", bien que cel puisse prter parfois confusion. En effet, parmi les paramtres d'une ressource, il peut se trouver un paramtre dsign par le mot "ID", comme par exemple le numro d'identification d'un Item de menu ou d'un contrle dans un dialogue. Il faut bien se garder de confondre cet 'ID' avec celui d'une ressource. C'est le numro sous lequel l'application dsigne l'objet en question, et non pas le numro de la ressource. Parfois, les deux numros seront identiques, mais pas forcment. ________________________________________________________________________ 2.3.2 L'I.D. L'ID d'une ressource ("Res.ID") est un entier long (4 octets). C'est un numro d'ordre quelconque donn par l'application la ressource. Toutefois: - ce numro doit tre unique, pour le type de ressource, dans le fichier de ressources concern; - il doit tre choisi dans la plage autorise (1 $8000000): $00000000 non valide (ne pas employer) $00000001 $07FEFFFF autoriss pour l'application $08000000 $07FFFFFF rservs pour le systme $08000000 $FFFFFFFF non valides (ne pas employer) En gnral l'ID se rapporte un objet dont la dsignation se fait plutt dans les sources de programmation en systme dcimal. Les ID de ressources du GS paraissent donc le plus souvent devoir tre manipuls par le programmeur sous forme dcimale. C'est ainsi que le trate l'analyseur de ResDoctor. ________________________________________________________________________ 2.3.3 Choix de l'ID. La fonction "UniqueResourceID" de Res.Mgr peut fournir un ID disponible pour un type donn. Cependant, la dtermination de l'ID doit tenir compte de plusieurs facteurs, dpendant de l'emploi que veut en faire le programmeur. Dans le Mac, les ID des ressources suivent une rgle stricte: deux octets dsignent la ressource (principale) laquelle la nouvelle ressource appartient. Les deux autres octets dsignant un numro d'ordre parmi les ressources de ce type appartenant la ressource principale. Il existe des fonctions premettant de trouver directement ainsi toutes les ressources affilies la mme ressource principale. Ce systme n'existe pas ( cette date) pour le GS. Le programmeur pourra donc s'inspirer ventuellement de ce systme (mais ce n'est pas obligatoire) pour obtenir un classement des ressources en fonction de leur appartenance, dans l'index de la res-map, et dans les listings. Il devra galement penser que plusieurs fichiers de ressources peuvent tre grs simultanment par Res.mgr: il suffit que l'application les ait ouverts. Dans ce cas, Res.mgr cherche une ressource donne par son type et son ID, dans tous les fichiers ouverts (s'il ne la trouve pas tout de suite). Il pourra donc y avoir confusion dans certains cas entre deux ressources de mme type et de mme ID appartenant deux fichiers diffrents. (Res.mgr prendra la premire trouve. Voir ci-dessous: mode de recherche). ________________________________________________________________________ 2.4 L'ATTRIBUT D'UNE RESSOURCE. A chaque ressource est associ un flag d'attributs sur deux octets, non contenu dans la ressource, mais prsent dans le "reference-record" de la ressource concerne, dans l'index du rpertoire.(voir ci-dessous: structure du fichier-ressources). Les fonctions GetResAttr et SetResAttr de Res.mgr permettent de modifier directement ce flag, mme si la ressource n'est pas charge. Nous dsignerons dans ce qui suit ce flag par le nom "Attribut". Son utilit est tout--fait comparable celui utilis par Memory Manager pour les handles. Il sert dfinir un certain nombre d'options concernant la faon dont Res.mgr doit grer la ressource en mmoire. Le tableau ci-dessous donne la liste des possibilits qu'il offre. ATTRIBUT D'UNE RESSOURCE ________________________________________________________________________ Dsignation Bit Valeur Commentaires ________________________________________________________________________ atttrLocked 15 $8000 Bloc-mmoire de res. "locked"; attrFixed 14 $4000 Ne peut tre dplac; reserved 12-13 toujours 0; resConverter 11 $0800 Il existe une routine de conversion; resAbsLoad 10 $0400 Charger un emplacement fix; attrPurge 8-9 Niveau de purge : 0,1,2,3; resProtected 7 $0080 Verrouillage: pas de copie sur disque resPreload 6 $0040 Res. charge l'ouverture du fichier resChanged 5 $0020 bit 1 si ressource modifie; attrNoCross 4 $0010 ne doit pas chevaucher 2 banks; attrNoSpec 3 $0008 n'utilise pas la mmoire spciale; attrPage 2 $0004 aligne en dbut de page; reserved 0-1 toujours 0. ________________________________________________________________________ Remarque: En fait, le plus grand nombre de ces possibilits n'est que rarement utilis, puisque res.mgr se charge de surveiller les ressources qu'il a charges en mmoire, et est plein de soins attentifs leur sujet. ________________________________________________________________________ 3. LA GESTION DES RESSOURCES ________________________________________________________________________ 3.1. STRUCTURE DU FICHIER-RESSOURCES. Nous dsignerons dans ce qui suit par le terme "fichier-ressources", aussi bien que par la dsignation anglaise d'origine "res-fork" la branche ressources d'un fichier de type extended, quoique ce ne soit pas proprement parler un fichier au plein sens du terme, mais seulement une partie annexe d'un fichier. Plusieurs fonctions de Resource manager permettent de manipuler ces fichiers, de les crer, les ouvrir et les fermer, d'aller y chercher des ressources, les modifier, en ajouter, en supprimer ,...etc... Une application n'a pas en principe se soucier de la manire dont le fichier-ressources est constitu. Cependant, il est bon de comprendre sa structure. Le fichier-ressource est compose essentiellement des ressources elles-mmes ("resource data") et d'un rpertoire ("resource-map"). La "Resource map" ou "Res.map" est tenu jour de faon permanente par Res.mgr, et comporte toutes les donnes utiles au rangement et la recherche des ressources dans le fichier. Lorsqu'on ouvre un fichier-ressources, res.mgr charge en mmoire le rpertoire. Les ressources sont crites l o il y a de la place dans le fichier. Seul le premier bloc de tte ("header") occupe un emplacement fixe. Il comporte les renseignements suivants: (l'origine des offsets se trouve au 1er octet de la res-fork). Format du "Header" ________________________________________________________________________ Offset Format Dsignation Commentaires ________________________________________________________________________ $00 Long rFileVersion Version: GS:0 ; Mac: >127; $04 Long rFileToMap Offset de la res-map; $08 Long rFileMapSize Taille, en octets, de la map; $0C 128 octets rFileMemo Disponible pour l'application. ________________________________________________________________________ Le res-map comporte elle-mme un "header" suivi de deux tableaux: la liste des emplacements libres du fichier ("map Free list") et le rpertoire des ressources (map-Index). Format de la "Map" ________________________________________________________________________ Offset Format Dsignation Commentaires ________________________________________________________________________ $00 Long mapNext Handle vers fichier suivant; $04 Word mapFlag Indique si la map a t modifie; $06 Long mapOffset identique rFileToMap du header; $0A Long mapSize Taille actuelle de la map; $0E Word mapToIndex Offset entre dbut map et index; $10 Word mapFileNum No du fichier donn par GS/OS; $12 Word mapID ID du fichier donn par res.mgr; $14 Long mapIndexSize Nb total de rfrences dans l'Index; $18 Long maxIndexUsed Nb de rfrences utilises ds Index; $1C Word mapFreeListSize Nb de blocs libres utiliss; $20 Array... mapFreeList Tableau des blocs libres; $xx Array... mapIndex Tableau de "references-records". ________________________________________________________________________ Blocs libres: Dans le tableau MapFreeList, chaque emplacement libre est reprsent par un record de deux paramtres: Format d'un bloc libre ________________________________________________________________________ Offset Format Dsignation Commentaires ________________________________________________________________________ $00 Long blokOffset Position du bloc libre; $004 Long blkSize Taille du bloc libre. _________________________________________________________________________ Le tableau le plus important est le rpertoire (Index) qui fournit les adresses des diverses ressources, ainsi que quelques donnes les concernant. Format d'un record "Resource Reference" dans l'index ________________________________________________________________________ Offset Format Dsignation Commentaires ________________________________________________________________________ $00 Word resType Type de la ressource;(1) $02 Long resID ID de la ressource; $06 Long resOffset Offset de res. (0=dbut res-fork); $0A Word resAttr Attribut (voir ci-dessous); $0C Long resSize Taille de la res. dans le disque;(2) $10 Long resHandle handle sur res. en mmoire.(3) ____________________________________________________________ ____________ Remarques: (1). Resource manager range les rfrences de l'index dans l'ordre croissant des types, puis dans chaque type, dans l'ordre croissant des ID. En cas de besoin, il est facile de retrouver le record de rfrence d'une ressource en parcourant le tableau d'index au moyen d'un diteur de blocs. (2). La taille en mmoire d'une ressource n'est pas forcment la mme que dans le disque pour deux raisons: - l'application a pu modifier la ressource aprs son chargement; - il peut exister une "fonction de conversion" qui, automatiquement transforme la ressource au moment de son chargement ( par exemple: dcompression d'un image). (3) Ce paramtre n'a videmment de valeur qu'en mmoire. ________________________________________________________________________ 3.2 GESTION DES FICHIERS-RESSOURCES ________________________________________________________________________ 3.2.1 Initialisation de Resource Manager. Resource Manager est automatiquement charg en mmoire ds le dbut de l'application. Il se rserve les pages de mmoire dont il a besoin. Lors de sa fermeture, au moment de quitter l'application, il referme tous les fichiers-ressources qui sont rests ouverts. ________________________________________________________________________ 3.2.2 Manipulations du fichier. Les fichiers de type "tendu" peuvent tre manipuls par GS/OS et on pourrait ventuellement ouvrir la res-fork seule d'un tel fichier avec l'une des fonctions de GS/OS. Cet outil allouera au fichier ouvert un numro d'identification (ID 'GS/OS') ncessaire pour sa fermeture. Toutefois, si on dsire travailler sur les ressources de ce fichier, et pas seulement le recopier, ce procd n'est pas bon: il faut utiliser les fonctions de Resource Manager: - "OpenResourceFile" ouvre le fichier concern, et charge la map em mmoire. Il fournit un numro d'identification ("ResFileID") qui lui est propre et servira de repre par la suite. Cette fonction peut concerner un fichier "tendu" quelconque, mais ne s'occupera, pour 'instant que de sa res-fork. Elle ignorera la "data-fork". Une fois le fichier ouvert, ses ressources deviennent accessibles par Res.mgr, et il devient le premier fichier pris en compte dans la squence de recherche si on dsire charger une ressource. ________________________________________________________________________ 3.2.3 La squence de recherche. Resource manager peut ouvrir successivement plusieurs fichiers-ressources et il est ainsi possible de disposer la fois d'lments provenant de plusieurs fichiers diffrents. Le fichier-ressources du systme ("systemfile") est ouvert ds l'initialisation, et reste toujours ouvert. Lorsque Resource mgr est appel pour charger une ressource, il effectue une recherche dans les res-maps qu'il a en mmoire, jusqu' y trouver une ressource ayant le type et l'ID recherchs. La squence de recherche commence par le dernier fichier ouvert, puis l'avant-dernier, etc...et se termine par le fichier-systme. Il est possible de modifier l'odre de recherche en utilisant la fonction "SetCurResourceFile" qui met en premire ligne le fichier indiqu. On peut galement dfinir le nombre des fichiers explors gr^ace la fonction "SetResourceFileDepth" qui retourne le nombre de fichiers explors avant son intervention. ________________________________________________________________________ 3.2.4 Enregistrement. La fonction "UpDateResourceFile" permet d'enregistrer sur disque les modifications effectues en mmoire sur l'ensemble des ressources d'un fichier. "CloseResourceFile" enregistre les modifications intervenues depuis l'ouverture, rcrit la nouvelle res-map sur disque et referme le fichier. ________________________________________________________________________ 4. LA GESTION DES RESSOURCES ________________________________________________________________________ 4.1 CHARGEMENT D'UNE RESSOURCE. Lorsque le fichier-ressources a t ouvert, Res-manager peut retrouver rapidement toute ressource contenue dans ce fichier ou dans l'un des autres ouverts, grce la fonction "LoadResource" qui admet comme arguments le type et l'ID de la ressource, et retourne un handle sur le bloc de mmoire contenant la ressource. Si la ressource ne se trouve pas dj en mmoire, Res mgr la recherche, lui alloue un handle, et retourne ce handle votre programme. ________________________________________________________________________ 4.2 UTILISATION DE LA RESSOURCE. Vous pourrez alors utiliser les donnes contenues dans cette ressource, et mme manipuler la ressource, la modifier, changer ventuellement sa longueur. Si vous dsirez que les changements soient reports dans le disque, vous devrez utiliser la fonction "MarkResourceChange" et la ressource sera enregistre la prochane occasion. L'utilisation principale de la ressource sera toutefois le plus souvent une utilisation statique, c'est--dire sans modification. Par exemple, l'emploi d'une chane Pascal pour un affichage, ou bien l'utilisation d'une ressource comme "template" par l'un des outils du GS, ou comme un "record" (collection de donnes de format varis classes dans un ordre dfini). Il n'entre pas dans le cadre de cet article d'exposer toutes les possibilits d'emploi, qui sont innombrables. Tout programmeur expriment a souvent t confront la multiplicit des petits fichiers auxiliaires ncessits par une application un peu complexe. Rduire, quand c'est possible ces petits fichiers l'tat de ressources rendra leur accs infiniment plus pratique et plus rapide que par GS/OS. Ressource manager est en quelque sorte un "magasinier" rapide et efficace, qui tiqute votre ressource avec le numro que vous avez choisi, la range, et vous la redonnera instantanment quand vous en aurez besoin. Vous n'avez pas vous proccuper du mode de stockage. Seul vous intresse le contenu du paquet que vous lui avez confi. Ce contenu, vous le dfinissez en crant le "format" de votre ressource, ou bien vous utilisez un format standard. Mais cel n'est pas l'affaire de Res.mgr. C'est votre problme. La ressource tant repre en mmoire par son handle, votre application peut en utiliser les donnes. Vous pouvez les lire, les recopier, les et les modifier. Attention toutefois ne pas considrer ce handle comme un handle ordinaire ! Il appartient Res.mgr, qui veille jalousement sur lui et a seul le droit d'en disposer. Si vous voulez l'utiliser comme un handle ordinaire, il faut le "dtacher" de Res.mgr en utilisant la fonction "DetachResource". La ressource reste alors en mmoire dans le mme bloc, mais res.mgr ne peut plus s'en occuper. ________________________________________________________________________ 4.3 CREATION D'UNE RESSOURCE. Resource Manager n'a pas de fonction qui cre directement des ressources. Vous pouvez le faire avec une application spcialement conue pour cel: un "Compilateur de ressource" ou bien un "Editeur de Ressource", comme ceux que comporte ResDoctor, ou bien crer votre propre application pour le faire. Vous pouvez galement inclure dans votre programme des procdures qui ajoutent des ressources nouvelles un fichier existant, (ou bien en suppriment). Les fonctions "AddResource" et "RemoveResource" de Res.mgr sont l pour cel. ________________________________________________________________________ 4.4 AUTRES FONCTIONS DE RESOURCE MANAGER. Nous ne pouvons tudier ici dans le dtail toutes les fonctions de Res Mgr. Consultez ce sujet la GS ToolBox Reference, vol.3. Nous nous limiterons citer quelques outils parmi les plus utiles. "GetResourceAttr" vous permet de connatre l'attribut d'une ressource et "SetResourceAttr" de le modifier. La modification effectue ne sera utilise qu' la prochane utilisation de la ressource par LoadResource. "GetResourceSize" vous donne la taille de la ressource dans le disque. Pour avoir sa taille en mmoire, appelez la fonction "GetHandleSize" avec comme argument le ResHandle fourni par LoadResource. Il peut y avoir une diffrence importante entre ces deux donnes, si la ressource est soumise une fonction de conversion pendant le chargement. "SetResourceID" pourra modifier l'ID de la ressource. A employer avec prcaution ! ________________________________________________________________________ 4.5 INTERDEPENDANCE DES RESSOURCES. Il est trs frquent notamment dans le cas des ressources standards, qu'une ressource d'un certain type fasse rfrence, parmi les donnes qu'elle contient des ressources d'autres types. Par exemple, une ressource "rmenuBar" fait appel plusieurs ressources "rmenu", qui font appel elles-mmes quelques ressources des types "rmenuItem" et "rPString". Le programme qui utilise la premire ressource (dans notre exemple, il s'agit de l'outil "Menu manager") a donc besoin, dans un ordre prcis , de l'ensemble complet de toutes les ressources ncessaires. La cration des fichiers ressources, de mme que leur modification, doit tenir compte des ces relations. C'est pourquoi la gestion des ressources demande de la part du programmeur beaucoup d'ordre et de mthode, sans quoi il risque fort de ne pas s'y retrouver. ________________________________________________________________________ 4.6 LES ERREURS FREQUENTES L'emploi de ressources conduit parfois des blocages de programmes principalement lorsque Res.Manager ne dispose pas des ressources recherches. Quand il s'agit de blocs de paramtres utiliss par les outils du GS, la fonction en cours d'excution s'arrte, et, si on a pris la prcaution de prvoir un message d'erreur, un numro d'erreur $1E06 risque d'apparatre. Il peut se faire simplement que le prfixe utilis pour retrouver la ressource en question dans le disque ait t perdu, pour une raison ou une autre. Veillez donc ce que votre application revienne toujours au prfixe qui lui a t attribu. Il pourra vous arriver aussi des accidents fortuits qui auront supprim ou abim l'une de vos ressources dans le disque. Comme Res.mgr rcrit souvent dans le disque ce qui a t modifi en mmoire, ce n'est pas du tout impossible que cel arrive, surtout quand vous exprimentez de nouveaux programmes qui ne sont pas au point. Pensez donc vrifier vos ressources si un ennui de ce genre survient. La meilleure prcaution: sauvegarder souvent les fichiers de ressources, et aussi conserver un listing imprim de l'analyse des ressources, obtenue avec un analyseur comme celui de ResDoctor. Cette application a t conue pour vous assister dans ce cas. Nous avons pass en revue, dans cet expos, les points les plus importants concernant la gestion des ressources par ResManager. Nous disposons maintenant des connaissances essentielles pour aborder le ct pratique de leur utilisation. ʦSalut C'est moi, SLG, sur votre disquette. Je suis l pour vous expliquer le rsultat de mes diffrents essais et cogitations sur la digitalisation des sons et leur reproduction sur GS. AVERTISSEMENT 1: j'utilise la carte de digitalisation qui est livre avec HyperStudio ainsi que le logiciel Sound Shop qui lui est associ. Je n'ai PAS ESSAYE d'autres cartes. Il est possible que les difficults (s'il y en a) rencontres avec d'autres cartes ou systmes soient diffrentes. De mme, pour digitaliser, j'utilise uniquement Sound Shop. Il est trs pratique, puissant et complet, surtout partir de la version livre avec HyperStudio 3.0 ou 3.1. La versatilit de Sound Shop est surtout utile quand on fait beaucoup de digitalisations ou manipulations de sons. Le matriel supplmentaire que je cite dans cet article (de marque Tandy), je l'ai choisi pour des raisons de cot et de qualit (au sens large: besoins personnels, possibilits du matriel, connaissance antrieure de la marque...). Ces choix n'engagent que moi. Si vous tes bricoleur ou non, si vous avez dj des quipements ou non, quel que soit votre cas, j'espre que rien ni personne ne vous empchent de faire comme vous le souhaitez. AVERTISSEMENT 2: Les explications techniques que je donne ici sont approximatives mais suffisantes pour rsoudre ou comprendre la question qui nous (me) intressent. Premire difficult: LE BRUIT En ralisant mes premires digitalisations avec le micro livr avec HyperStudio, un problme est immdiatement apparu, le bruit. Mais qu'est ce que c'est le bruit ? dit une petite voix tremblottante. Dans les appareils lectriques ANALOGIQUES qui transforment le son (amplificateur, magntophone, radio ...), des signaux parasites (non souhaits) peuvent venir se mlanger votre signal (le son qui vous intresse). Ces signaux parasites qui constituent le BRUIT peuvent tre par exemple: - le souffle d'un magntophone cassette ou les crachements et craquements d'un disque vinyle. - le souffle d'un tuner FM ou le bruit d'une radio "Grandes Ondes" - la "ronflette" de l'alimentation de votre appareil: une sorte de grsillement basse frquence (100 Hz) - le bruit de fond d'un amplificateur que l'on peut entendre en rglant le volume au maximum alors qu'aucune source musicale n'est branche. - les parasites provoqus par une perceuse lectrique (ou nuclaire, comme on dit maintenant) ou par une calculette sur une radio "Grandes Ondes" On dit appareil "ANALOGIQUE" lorsque le signal (votre son) est transform (ou stock, dans un magntophone ou un disque vinyle) sous une forme qui ressemble (analogue) au signal naturel (une composition de signaux sinusodaux). Par diffrenciation, on dit appareil ou traitement "NUMERIQUE" (ou digital) lorsque le son est transform (numris) en une squence de bits (vous savez ce qu'est un bit, hein ?) comme dans le cas des disques compacts laser ou des magntophones "digitaux" (DAT). Les signaux numriss sont moins sensibles aux bruits ou parasites car il faudrait qu'un parasite soit suffisamment "fort" pour changer un bit ( savoir un 0 en 1 ou bien un 1 en 0). Si c'tait souvent le cas, se saurait: on aurait bien des problmes sauvegarder nos donnes sur disquette. En revanche, dans les appareils analogiques, les signaux (sons) se trouvent sous leur forme naturelle. Et c'est sous cette mme forme que se trouvent galement les signaux parasites. Il est donc trs facile aux parasites de s'ajouter (se mler) aux signaux "utiles". Donc, avant de numriser notre son, on est confront aux problmes de bruits. Une autre notion importante est le "rapport signal/(lire "sur")bruit". Plus la quantit de bruit est importante, plus le rapport signal/bruit diminue (est dgrad). Que faites vous quand vous regardez une mission de tl et qu'il y a du bruit dans la pice ? Vous augmentez le volume sonore (du tlviseur et non pas en criant "vos gueules m..., j'aimerais bien pouvoir regarder une mission tranquille"). Donc vous augmentez le volume sonore et ce faisant, vous augmentez (amliorez) le rapport signal/bruit pour un meilleur confort d'coute. Une autre analogie: Vous avez une voiture bruyante et un autoradio. Quand vous tes coinc dans les embouteillages, votre voiture n'est pas trop bruyante et le volume de l'autoradio est un niveau disons "moyen". Mais ds que roule bien, votre voiture fait plus de bruit et pour entendre aussi bien votre mission de radio, vous devez rgler votre autoradio "plus fort" . Mais pourquoi il nous ennuie avec toutes ces explications ? Pourquoi ? - Parce que votre ordinateur (son alimentation, ses circuits), les cartes qui se trouvent dans les slots, votre moniteur produisent beaucoup de bruit. - Parce que votre microphone, la sortie auxiliaire ou magntophone de votre radio ou de votre chane HiFi ne sont pas trs "puissantes" (leves). Donc, on a un mauvais rapport signal/bruit (on entend le bruit produit par l'ordinateur qui vient se mlanger la parole ou la musique). Il faut donc augmenter le rapport signal/bruit. Soit en augmentant le niveau du signal (son), soit en diminuant le niveau du bruit. -Pour augmenter le niveau du signal avant qu'il arrive votre carte de digitalisation, il faut insrer un amplificateur entre votre source sonore et votre ordinateur. J'ai choisi comme amplificateur, une petite table de mixage 2 voies d'entre stro (ou 4 entres mono) et une sortie stro (ou 2 mono) de marque Tandy (moins de 300 FRF). Cette table de mixage est alimente par une pile de 9V. Cette table de mixage a des entres "micro" ou "ligne". Les entres "micro", comme leur nom l'indiquent, servent brancher des microphones. Les entres "ligne" servent connecter des magntophones ou des sorties "auxiliaire" d'amplificateurs de chanes HiFi. Vous branchez la sortie de la table de mixage sur la prise d'entre de votre carte de digitalisation. Le fait de disposer de 4 entres mono sur la table de mixage permet de raliser des mlanges: une voie sert enregistrer une musique de fond, une autre voie sert ajouter la voix d'un commentateur. Les deux autres voies peuvent servir rajouter des "effets spciaux". Mais l'essentiel ici est surtout de pouvoir AMPLIFIER UNE voie: le signal digitaliser. - Pour augmenter le rapport signal/bruit, on peut aussi essayer de diminuer le niveau du bruit qui vient perturber le signal. Malheureusement, on ne peut pas faire grand chose pour . Le GS et ses priphriques font du bruit difficile liminer sans bidouiller. On peut essayer d'loigner au maximum du GS les cables audio, de ne pas tenir le microphone proximit du moniteur (surtout si c'est un microphone bobine mobile, prfrez lui plutt un microphone electrets qui absorbera moins les rayonnements du moniteur, pour des raisons de principe physique de fonctionnement). Il faut aussi conserver son blindage au GS, donc laisser le capot ferm. Les interfrences entre les alimentations de diffrents appareils lectriques interconnects sont aussi cause de bruit. La table de mixage Tandy est intressante car elle est alimente par pile. Elle fait ainsi tampon (isolateur) entre votre source sonore et le GS. Sinon, si vous reliez directement une source sonore votre GS, il est prfrable qu'elle soit alimente par piles. La carte de digitalisation HyperStudio a aussi une caractristique intressante: elle ne s'enfiche pas dans un slot du GS mais elle se fixe la face arrire du GS ( l'intrieur). Elle tire son nergie lectrique du connecteur "fan" (ventilateur) qui se trouve l'arrire de la carte mre du GS. Ainsi, son alimentation est plus "propre" (moins affecte de bruit) que si elle tait connecte dans un slot (o elle ramasserait tout le bruit qui "trane" dans les circuits d'alimentation, bruit produit par les autres cartes installes dans le GS et qui est moins gnant quand on travaille en digital comme je l'ai indiqu). On peut aussi brancher la carte HyperStudio sur une pile 9V comme indiqu dans le manuel (de la version 2.1) plutt que dans le connecteur "fan" pour tre sur d'avoir une alimentation trs propre. Si on digitalise pendant de trs nombreuses heures, il peut tre prfrable de choisir deux batteries de 6V (du genre pour lampe de camping ou de secours) montes en srie: on obtiendra alors 12V. On pourra aussi placer une capacit en parallle cette "pile" de 12V. Ces piles durent vraiment trs longtemps. Voil. C'en est presque fini pour ce qui concerne le bruit. Pour rsumer: - insrer un amplificateur entre votre source bas niveau (micro, magntocassette, chane HiFi) et votre carte de digitalisation (peut-tre est-ce inutile pour Audio Animator ???) - utiliser de prfrence un amplificateur simple, aliment par piles - pour les enregistrements de la voix "en direct", l'aide d'un micro, utiliser plutt un micro electrets. Deuxime difficult: LA DIGITALISATION Et l, on est bien embt, car effectivement, ce qu'on doit faire pour enregistrer nos sons sur le GS c'est de la digitalisation (de ces sons susnomms). Comme indiqu plus haut (analogique et numrique), la digitalisation consiste transformer la forme naturelle (analogique) d'un signal en une forme digitale (numrique) que l'ordinateur peut traiter facilement. Ici, un peu de mathmatiques s'impose. 1- un son est dcomposable en une suite (addition) de signaux sinusodaux (sinus) de frquences connues. (si vous ne savez pas ce qu'est la fonction sinus ou un signal sinusodal, voyez votre encyclopdie favorite si continuer vivre ainsi dans l'ignorance vous insupporte) 2- un thorme dont j'ai oubli le nom nous dit: on peut connatre entirement un signal sinusodal de frquence F si on l'chantillonne la frquence 2*F. Ici, on va beaucoup parler de frquences parce que les sons sont des phnomnes vibratoires caractriss par leur frquence (son aigu, son grave, son strident...) et leur intensit (ou force ou volume: gazouillis d'oiseau ou bruit d'un Concorde au dcollage). Que veut dire "chantillonner" ? Eh ben veut dire mesurer l'amplitude (la valeur) du signal (le son) des instants bien dtermins et ranger la valeur mesure quelque part. Donc le thorme nous dit que si l'on chantillonne (digitalise) la frquence "2*F" un son dont la frquence maximale (la plus aigue) est "F", on connatra tout de ce son. Et donc on sera capable de le reproduire correctement. Ceci est presque vrai. En pratique, si on veut tre capable de bien reproduire un signal dont la frquence la plus grande est "F", il faudra digitaliser une frquence de "2*F + DEC". "DEC" veut ici dire dcalage. Par exemple, dans les standards professionnels o l'on souhaite tre capable d'enregistrer des frquence "F=20 000 Hz", on digitalise "2*F + DEC = 44 000 Hz". Dans ce cas, DEC = 4 000 Hz. (Hz (lire Herz) est l'unit de mesure des frquences - le Herz est l'inverse d'une seconde: 1 Hz correspond une priode de 1 s, 5 Hz 5 priodes par seconde, 1 000 Hz une priode de 1/1000 s) Maintenant que l'on sait la frquence de digitalisation optimale que nous indique la thorie, il nous faut dterminer cette frquence pour les enregistrements qui nous intressent. Il est important de bien choisir la frquence de digitalisation pour 2 raisons: 1- Il faut une frquence suffisamment leve pour enregistrer correctement les composantes les plus aigues de notre son. 2- Il faut essayer de ne pas digitaliser une frquence trop leve pour le signal qui nous intresse, afin de ne pas gcher de la place en mmoire vive ou sur disquette. En effet, mettons que, par exemple pour enregistrer de la parole, on digitalise 10 000 Hz. Alors, chaque seconde de digitalisation occupera 10 Ko (10 000 octets) en mmoire. Si on avait digitalis 20 000 Hz (= 20 KHz (lire kilo Herz)) alors que c'est inutile, on perd 10 Ko de mmoire par seconde (10 Ko = 20 Ko - 10 Ko). Il faut donc savoir quelles sont les frquences maximales intressantes ou utiles des signaux (sons) que l'on veut enregistrer. Il faut aussi connatre (enfin !) quelques caractristiques de l'oreille humaine. Les frquences audibles peuvent tre ranges dans 4 catgories: - les sons graves de 20 200 Hz - les sons mdium de 200 1000 Hz - les sons aigus de 1000 10000 Hz - l'extrme aigu de 10 KHz 20 KHz. Il faut aussi savoir que la zone de sensibilit maximale de l'oreille va environ de 800 Hz 8 KHz et qu'une voix de soprano couvre un spectre de 200 3500 Hz. Un jeune enfant peut entendre des frquences comprises entre 20 Hz et 20 KHz (20000 Hz). Un adulte dont l'oreille a t abme par les bruits de la vie courante ou des pratiques difficilement avouables comme l'coute de hard rock trs fort niveau et pendant trs longtemps (ou les musiques de boites de nuit) entendra avec difficult (et seulement s'ils sont jous trs fort) les sons au-del de 10 KHz. Ceci n'est pas trs grave car peu d'instruments produisent des frquences si leves. (En revanche, couter de la musique trs fort et trs longtemps (ou un marteau piqueur) EST TRES GRAVE car cela produit une baisse de sensibilit de l'oreille aux alentours de 1 4 KHz, frquences qui sont utilises pour la parole. Bref, on devient progressivement sourd.) Donc, je disais, seuls les instruments comme le piano, l'orgue, les percussions, le triangle, la flte, le violon produisent des sons de frquence suprieure 10 KHz. Et ils ont (les sons) plutt peu d'nergie ces frquences. Et en plus, vous ne les entendez probablement pas !!! Bref, on se fout des sons au-del de 10 KHz. De plus, il faut savoir que les radios FM ne reproduisent pas les sons au-del de 15 KHz et sont vectoriss ce qui signifie, qu'avec l'aide de la palette graphique, vous pouvez changer leur couleur (Opt-clic souris). Les fichiers correspondants s'appellent MATHS et PHYS: copiez la palette qui vous intresse dans la page graphique qui vous sert assembler votre formule, dgroupez les lments de celle-ci et dupliquez ceux que vous souhaitez utiliser.  s  s  sGRAPHES :   Une autre bibliothque de symboles graphiques prdessins vous aidant dessiner des graphiques scientifiques: lments d'axes avec cotes, flches d'axes, symboles d'angles ou de rotations, ... Ces symboles tant vectoriels, vous pouvez redfinir leurs couleurs (contour ou remplissage). ((0^  ((0^  UTILITAIRESv͸ ' Q'(BIB.PHYSS % % )BIB.MATHSSj44+BIB.GRAPHESS   FINDER.DATAj. p+ *BIB.CHIMIES::0 )@@ <(MY@22d(2(\33`HPJ(HP  'ppUpp tp $$tp?lt?pt?? pl plp p \Mcanique classique 7  /7/7 i 04Ԯ 0  -- C F> $1$18  i **` C P> '7'7  dt **į  d )*))//  = :Z >P>PP C OM> @R@Rx  :L:L C > IYIYȰ  dt <L<L  d KLKKBRBR,  = RZRZT i =S7W| =S  FSFS  i >P>P C F> GTGT  i rVrV rV$$rVRV?nR?rV?? nR nR  ,Maxwell =ZMXGY, MX  e QZQZT  =O=O|  r BRBR  div @R@R̬ C E> CUCU  = MNMM@ R>B@R(@R(X C B> B RB R  div B*R>B*R>  = 0  )  C rotE>    C B>  )=&& t   \  ))<    = - %B<+M(;j(:(:(  m 3;3;ܵ 0 % B<Y%079%0798 C E> ( ;%( ; ( :( :(  e 3;3; 0 (;%(:(:  m 3;%3;%@ 0 &(B<60?960?90 t 4(5<4:4(&*81&*81з  0*B10*B1  '9'9 C rotB> (:(: C j> 09094 = /8/8 +     $$????   S S@Notations &43@po&41: 42: &41:  e *83@*83@̢  &Z3h?? F&Z2b Z2b0 &Z2b  m *`3h*`3hX  3TKlo@VI_@VI_Ԥ 4 @`Kh:`Lh @`Kh  p 3Z?b-Z?bL8 3Z?b  m 7`@h7`@ht  ?T@l?j?T?6 >6 > C Z dZ dإ C P0b@P0b@ C > PXbbPXbb( C > f2x>f2x>P C > fVxdfVxdx C > /*NF1;:NEfR;:MA;:MA  e F>NEF>NE̫ 0 ;,M:;,M:  4p ?*@F?D?*/4A;/4A;  1 0 (@rrn@nHP(dHPP (  z3 < 8s$$????   N NtsAlgbre UVUU(*:(.:qq (*:  F1XWJw_ɱ)N1T)N1Tt i F*XF.XPt3(K=/(O=Dv0v 3(K=  J&R>J&R>lv i = 1 /.55-.55vv /.55 n ]hhs]hhsv C k*v5k*v5v N hhvz?khvskhvsHw N hrpzgrpzwpw hrpz * gJv]rrkJvUkJvUw N gTp]gTp]x + ZJh[:]JhV]JhVtx`x$$]JhV]JT?aTV?hJV?? R ZTb[ZTb[xx,,ZTb[ZT[?^TV?`TV?bT[?? 3 Y,k9Y,k9x  ` ffq j$$j?j?j?? f ff f ȃCalcul diffrentiel PfQPPfflfx, fl  m ););T  D &&| C rot> && C grad> &&̄ C > ~%~% C > <N<N C dl> <N<ND C dS> <N<Nl C n> );*:*:  d ););  W );m););4  t *:*:\  d -7-77I7I  SxoUaxbaaxSzeSze  ]zo]zo$  Sovclclt x abaaSeSe  ]o]o  So^clcl< t abaaSeSex  ]o]o  kzFowow 2 yzzyyzk|}k|},  u|u|T  k.{{ x zz̉ 2 owow 2 yzyyk}k}0  uuX  k{{ t zzЊ 2 owow 2 yzyyk}k}4  uu\  JJĪ JPy$$JFJ?F?J?? F F  yCalcul intgral 3S9`v?3S3S~  3S3S  3SH051GSCUhT GS  S 3S3S  3S3S  3S,#?3"S*3"S*  3S 3S D  ?E,?E,гRr/VAC`RrRr  RrRrЀ  RrRr  RrND`1xgqbt\H gq  W RrRr  RrRr  RrRrԁ  11   3 311    p  !3!3$  0   L  +  4D11z  "3"3z    hz  0 "4"4  -  4"U11{   " "{    l{  + "3 "3 {  "4"4{  - R rR r|  RrRr4|  R r(R r(|   "1.}$(0,$(0,ԩ  a  *. *.|  b "1*"1*  c(q9f(q4f(q4x~~$$f(q4f(2?j24?q(4?? R c2k9c2k9,,c2k9c29?g24?i24?k29?? 3 0 (@y@O2\}! ;HPJ(HP  'j l*  l l$$l?h?l??hh   Angles @\[\[[@[@ZI[Au-;7  ;:19-;j:;:::9(: T--@\@A@@A\[@AS&[-Z'-(,g(,+(()(('--Z5;*t6:;6:9667665;;ZDRnEInEIEHIIHHDRDaZ;Q^`RVb`RVRUVVUUQ^QkZ; Tj T- T|$$T?P?T??PP9 9̉,,926?26?9?9?? Axes  9 9 Axes %F*p%n)p.n%nD %n)p)F*p)F)n&E,!*E,*D*D&E*D&D(4F9p4F8H=F4FȈ 4F8H8F9p8n8F6E<:E<D::6:68i DDDDDDD~|DuDRDuPkNt_kNt_ 80 vD`v^Dn^won^wo 70 zClzjCrn{rn{( 60 xxP 45 x 30  20 ܗ 10 uBDBuBi:rKi:rK 90  h h ^   ^ ^$$^?Z?^??ZZ4544  $Flches */3*/.**/*.<D<DC<<=<<<D<DC<<=<<IQzIQIPQQPPIQIQIPQQPP)h$#$)($)O$#$)($ [te  [tk [tX$$[tpt?Wp?[t??WpWp = =Points D:I@D:I@DRIXDRIX8:=@8:=@8R=X8R=X8"=,\8"<*8&<"<*D"I,D"H*D&H"H*%$40%$40  * $R5\$R5\  :(D:(D  R,^R,^  #87D#87D  ").").  + O6\H BIB.CHIMIEAEFT BIB.GRAPHESEFT BIB.MATHS9AEFTHBIB.PHYS09AEFT0 !@*$ _ L@< Finder.DataGsHPK(HPP (  zp@+B*@@b+d*bb+@5T4R+@+R5d4R+b@RP@PdPb4Rm4m*)*)*43**43**)*1*05(k5j+*+*+54++54++*+2+1>N#>N#  CH P`!P`!$  HC >6NNh>6LH>6LHt  CH CDNNCDQN CDNN  2 P4dR]P4cKP4cKa  CH WEdRWEiR` a VAaK  3 (1Lg(1Lf(1*0((J1L0JJ( :8(8 L8J0(1L0J0(>bKv>bKv{`  C=O EXEMPLESv͸ ' Q')TECHNIQUETC M:M:(PHYSIQUET FM!M!FINDER.DATAj. p* %MATHST'66(GRAPHE.1S. _/!/! 0 \ro@2 GTjHP(dHPP ( r! ; w #bpo z }&^&F`xXq&^`x=x xt0 *   <R1/R /R +b *   <R1BN BN (Jt *   <R1(= (=  (6+ *  <R19E 9E (Ag(t,x)  <R12G 2G  (@f *  <R19E6 9E6 (A(x) *   <R192EZ 92EZ(A2dx - *   <R12G 2G  (@f *  <R19E 9E (A(x) *   <R1/TR_ /TR_ (GT *   <R1BZNj BZNj (JZ0 *   <R1,\8l ,\8l(4\t *   <R19fE 9fE+ f(t,x) *   <R19E 9E(Adx *   <R1&<2y &<2y(.< c = inf *   <R1/( /(  ((a *  <R1 &,D &,D ((&(t) *   <R ,, 1:F :F(B1 - *   <R14I 4I  (Ba *  <R1:F :F (B(t) *   <R13H 3H  (A[ *  <R13H 3H(A] * pp &&p, ,, , 1,6 ,6  +,f *  ,14@ 4@ (4i *  ,1T` T`  (Ta *  ,1^j ^j (^i *  ,1BM BM  (B *  ,1lz lz (l- *   ,1 (1 - *   ,1 ((1 *   ,1 (- *   ,1 () *   ,1 (g( *   ,1+ +() *   ,1@N @N(@- *   ,1"* "*  ("] *  ,1bj bj(b[ *  ,1j j (j1 - f( *   ,1 () *   ,1  (a *  ,1 (i *  ,1  (d ,d  ,1 +i  ,1 )j  ,1 (d ,d  ,1 +i  ,1 )j  ,1   (] *  ,1*4 *4(*f *  ,129 29 (2j  ,1x x(xj = 1 *  ,1| | (|S  ,1  ([ *  ,1| | (|i-1  ,1Pb Pb +S  ,1T[ T[ (Tn  ,1Hf Hf(Hj=i+1  ,1   (f *  ,1  (j phpkjjlnflq^ ( 555 (avec l'aimable autorisation de l'auteur) hkp.TZ/XV@pD    `,=>X 1e'̘@̘3@̘@̘3@̘̘3@̘"@̘3@222 xavec:  f* c compacit du mlange (rapport du volume solide sur le volume total)  al*  f distribution granulaire du mlange, dfinie par une fonction d'intgrale 1 sur R.  ra*  a (t) compacit propre des grains de taille t, i.e. compacit du mlange monodimensionnel seul.  un* f et g fonctions d'interactions, traduisant respectivement les effets de desserrement ou de paroi exerc par la classe x sur la classe t. Ces fonctions sont dtermines exprimentalement sur des mlanges  es binaires.  La classe dominante est celle pour laquelle le minimum en t est atteint. Une prsentation quivalente du modle est de dfinir des contraintes d'impntrabilit, traduisant l'encombrement exerc par les diffrentes classes sur une classe donne: qpTZXVP>XN^???~?~?~   @pP.XT-Tp^^??????? JJJ EXTRAIT D'UN TEXTE SCIENTIFIQUE DANS LE DOMAINE DE LA PHYSIQUE -PX0q 9 9 qh hh h   >>>>>>>>????????  <<    +z *   Q]+4x *   Q](YO *   GB\W  (UBl/4 *  G\(U-l/4 *  \q+l/2 *  h [[`wJ-`@F-`,wZ-`?0--Dqq2P 3T 1  transversale et perpendiculaire Cv> a , CB> 1 est une onde transversale, galement orthogonale Cv> a , dont l'expression est la suivante  :  1  1 CB> 1 = -CB> 0 (V 1 /u)e@ i(Ck>.Cr> -  w t) , avec u = v a .   ?V - 6) Cartes du champ magntique:     Dans le premier cas, les lignes de champ sont des droites puisque CB> 1 est parallle CB> 0 .  Dans le deuxime cas, si on prend l'axe des z parallle CB> 0 et l'axe des x CV> 1 , on obtient dans le plan (x,z):  st  x B x = -B 0 (V 1 /v a )Re[e@ i(kx -  w t) ] = -B 0 (V 1 /v a )cos (kx -  w t) ,  s, B z = B 0 .    gnLes lignes de champ s'obtiennent en intgrant le systme:  en   dx/B x = dz/B z , soit:   dz/dx = -v a /(V 1 cos (kx -  w t) ) .  on  t On peut prendre t = 0, car cel revient une translation le long de Ox. Si on appelle l la longueur d'onde associe (k = 2p/l):     2pV 1 (z - z 0 )/(lv a ) = Log|tg(px/l + p/4)|  on  neLa ligne de champ qui passe par O a l'allure suivante : (toutes les autres se dduisent de celles-ci par des translations paralllement Oz, et au cours du temps, l'ensemble des lignes de champ se translate paral-llement Ox avec la vitesse de phase v a ).  on wE,\GRAPHE.1AESEFT\MATHSQUEEESEFTPHYSIQUEEESEFTH TECHNIQUEESEFT !"#$%&'()*+,-0 c@HP(dHPP (  ~ w #a$ z }&^&8l&^`x=x 0 \rL;h;>+8<=@<`/   m1(92 SERIES INFINIES ET INTEGRALES   s(d'aprs le dictionnaire encyclopdique des mathmatiques; diteur MIT Press Cambridge Massachusetts ) Zg  ``ćP PP P 1e e  +e f(m) = *  Pb  (Pm=1*   Rf (RS *   Va  (VN *   VZ* *   ( *    (C *  (2 *   (p *   (i *  (1 *  P "  (p   ) cot(   )p  8 ) z)f(z)dz - Res{  8@ )\p  B\ ) cot(  \d )p  f ) z)f(z)}    +(z=a +n< _vh_vhN@ PN@ P$m  +Pf(x+  i%| )xw  w$ )) = f(z)dz *  (1 *  * (#w *  N@ " . (# *   +  ('x *   (x+*    (w *  IW (Sr=1*   ,9(6m*   =P  (J+ *  0S (H *   7L  (Ew *  <O (IB *  <O(I( *  ;P (Ix *  <O (I) *  ;P (ID *  BS  (Mw *  <O  (If *  7E  (A(r-1)*   < O"  (I (x) *  4P* (H) *  <*O=  (I*+R *  C9O@  (M9m BU  (Or! *  7C  (Ar N@"F 5Q (I( *  CO  (Mr ccy  (qc=-w * $dNwadNa?gNT?wTa?? (qN+R *  k]wd  (u]m N@ 1`x `x + *   s|  (~|0  [~h(f~1  [o C +B *  bm  (lm k~  + m! *  N@ "m ]p(j( *  \q (jx *  ]p (j-z) *  dw(q(x+ *  cx (qw *  dw (qz)dz, *  ao  (k(m)*   dw  (qf * d (4z^ C4z^ CV  (Pf(m) *  :z] (RzS *   4~D  (?~N *   =M(Hm *   CV  (P(-1) *  Qz^  ([zm=1*  < T^}4T^}4Pzt zzt zt 1   +1 *  zt1  (2  zt1  )p  zt " 1   +n=-  zt1  (f(2 *  zt1  (p *  zt1  (m) = *  zt1$/ $/ ($ *   zt1z.: z.:  (.  zt1,> ,>(,-  zt1CS CS  (C)e *  zt1Od Od  (O-in *   zt1`h `h  (`t  zt1do do  +d *  zt1kt kt (kt  zt1.= .= (.f( *  zt1:D :D (:t  zt1  (- zt1  (m=  zt1  (S  zt1z z  ( zt1" "+f- zt1    ( S  zt1z z  (Ȉd ZZxy y3y y 1* *  (n=  y1+< +<  ) -  y1  (m=  y1  )-  y1  (q *  y1  ((x) = *  y1 (e *  y1  (- *   y1  (p *  y1   ( = *  y1  (m *   y1} } (2 *   y1     ( 1 *  y14? 4?(4e *  y1Wj Wj  (W /x *   y1h h  (h = x *  y1~ ~  (~-1/2 *   y1   (q  y1BN BN  (Bp *  y1JT JT  (Jn *   y1}PZ }PZ (P2 *   y1  (S  y1  ( x *   y1 0  0 ( S  y1  C (/x *  y " 1  (x  y1  (1 *  y1  ((  y1 ))  y1z z  (  y1y". y".(" tZh^d LsȈZh^d (ttZOh^Nd ܈LsZ^ (tZh^d ܈LZahM^`d 5   _,;AgIv::: G  T ' P^PjPjPFNPFPFOPFPFPFkkk Dans le calcul numrique de fonctions, on utilise quelquefois la formule d'Euler-MacLaurin: 111 ?o C B m (x-z) = CB m (x-z+1), x@?>>?>>=>===>==<>=<<=<<<=<<<=<<;<;; ; <; ;;<;;;<$;;":#<+;#:):*;2:*:0:1;::1:8:8;@:8:>:@;H:@:F:G;O:G:M:N;W:N:U(/(/ 0 2*:12*:18 1 8:886866j8:j88686688Q:88P8P6Q8P6P6Q8j:Q8i8j6k8j6j6~~~, ~88    UWUU UWXVX 849:8884889V8T888VX8VVR_R_в 2. d$m1d$m1 .5  1. ''p  T/ (6(6  q 0606Գ  E >K/>K/$ C /3R COCOL  v |  x e   x p  2  (e -1) $  x L  2 ||   D  /T L  q   E  avec x= 8t[U=F=FCHALEUR MASSIQUE KTKTDES SOLIDES 8t[8t[FONTESv͸ ' Q')GENEVA.249". ! 8)GENEVA.20I 5- 8)GENEVA.12V 0{ 8)GENEVA.10]0{ 8*VECTORS.12c  ̮8)SYMBOL.24m)$*8)SYMBOL.12ȁ9 *8FINDER.DATAɉ0. p+ 8)GENEVA.18Ȋ U8)GENEVA.14Ȗ 5- 8)GENEVA.09ȟE U38)SYMBOL.18ȥa*8:;<=>?@ABCDEFGHGeneva w "@""@p#>"  I q`@"A!C|@~P00@ @q  !$B@@$p ~b @8@8#@@" $ " 0 @@@!@$<   0H@ 0c @"bAB# B !! ap !D``@ƀD@ $$ BD P@ @ @@$ \ $ $@ P @@0@ !U@A  A@ !D  D($H`$$@ @#@@ @@@ H  @@@ (P$@ !&@"D @@DP8 `D$ $@@@A@@ H@|GxFpy<><w<< $r"@x@ !@$ @xA @@g@pB"!@@D(@@ @"   D@"*!HB B! B@ `"$00L0DB!B!B $ @ @0!$  ! !A x(C @"B@BHx@$@ @   D"  @"  XH @""00 (  H H P $ @@ !D A @@ ( P@@$@  B@ @    (B @P"  P ! A"0 ( H H P   @@!D' @C@@DB @ &DB@,@@B@$@A@A  ` AB8` 0  !@ A!0`p0 0 0  !7!!(c 0AEEB@|D! @ /D@@ (@0D@@ @ !   A" ` 0 @  @@ 0h0 0 0   @ 0!@A99D0  @ /! @@0AD@ @ @ !  A" ( 0 ? DD  @@ 0!b00 0   @a0 cHPx@@ @?OBH@ O@ @ @   "" D ` 0  DD @@ F0`& `0@0 0   @a@  0 @P!  @ A20 A@ @ @   "A@DA` 0 H DD@!H &0( 0@0 0   @3a !@ (c ` @@ @ 0B s@ @@  @@ "A@A ` 0 H ((!@!H %P0 0@0 0  "@ a@' @$`  @@ 0 D$  @ @  @@T@AA!  @P PH((!$ H0 ( H H  $@0 P @@@$@ ! @ P( H$@@@$   $ $@! < @" XH0((@$ ph  HH H`@0x0@  D@AB  ! P@ D `P`   !@d2P` 0!HB F! @HP@A  cjB!!B) B @H  a( $@ `ƀB@`x  ~? |G &?@A x'x#<<< !xpxC `8I >0@   0+:;@ES\_ijs )5AMWamyz.9DNR\`fvz  *2<GXbmw|}#-7AKUY\bgq{ )8FJO\o{(2=>HX_l{ $1<Th                             JKLMNOPQRSTUGeneva g pN"" @ @<A@ !  @ @  " `@  A#?? <x?LjPGD  p@<!$Bq"$B$\B B x>@xAx @8 *'BID $#@  B@ HHH! @bJ  @B@@"BB"BBC c @ @ B  @! Hd 5U$FH@A@H@@)  x  (P( AA Q@  @@`$  @ @FD  Hd*$F@@H@I @    P(  A `   @`$  @ @HD  Hd5U$B @? A  D  `  " @o;N^} P(<<<<<<<<<<<' ```I0@P$!@?D 8!@ "  p *$!A@ B @! D` `  @XHHhDQQ!a!! @H(BBBBBBBBBBB"!(```HL@ $ @ @H D D!A@ @" @ 5U$!@@!@  O ?$CNWYbckux"*2<FGQ[cpz #+3;CJRZ]aily !)4>HPX`hpx !+5?JZjy} %-9GS\]gw~ '4?Sc                                                                                     WXYZ[\Geneva t =p2@(L@ Bi0 ! D`JTN~aI ~w<z0/| 1@  q(fRUE+ xtZ~z@3<$D@d"0H -@0 a1C0 0 1  "c IQ& @*1B@a` AP H`2B0 0 EQ}gywF1(RS .s9s+9sKQ!!%@!'O1w$Hap"h@ }OCHO4BM0 0IJDcS'38F1*(RS 1c1e,1c5P{R\̤@ "DTJq$Ha/ %*(`ޟ8B $D#SF#0F*DR@DK /{1e(1c8QRЀ)$$DIxG b(ac-"@a E*(`4B DD$#S#0rEJDDK 1c(1cPЀ" "DDDHB2I$(abS" D`2B p DD$#SF#0 EDEE G 1c%(1c{̀B )!!DDKB2* Ra0HA%C  a1B p,PA$cS&#0LH G 1c1e(1g9QQ!!!IDH$ h)$ a"@H <9DAz /@/xA$|S#yqHꀃ{s(sִv>xHfw\t& p0 @ @ @x@@ D "p 8@  #&,1389>DFLRY_ekqwxz~#(-/469ACHMRW\`ejlotv #(-2469<AFKPUZ_dinquz  )056;CFLSY_ffmtz                                 ^_`abGeneva  i 6)&T20  IF0IH8M0N1I@.]o8<0 w@L\)[H!Lml3D8Š:$hs'n~IH1! D#DF011bH#BAScH@E nDP@T@H@I2VPQBB B0*1`H$ D۟/nn{o1@)Pcff333m329FeT(LHDBO-$(C`n\Bjh QD:5} C$1\HTED&fe&SL1@)PcL̤ffS32GZD.U$"F"T2R$b (tS~T_HTB$b}&Se*TI) F0cww<ffS32;FxUJ"D/G $ČD3)PD!}F8 0H"$&ba&S*TIE@LDD$ffS32FdHe$"RBDR% eHHDSIHaD@cDF8 0HB&fe&SL$(@F1L̤ffS32E DH"RDRR"ČDBFbHC~9||:7Gt\G~S,nxb)@F.\ww;33$Y8#Imt$s`0@ @     #&+0267;@BGLRW\afklnqvy~ "&*.26:<?CELPTX\`dgkpw| #).38>FNVX[`hoy~ !).357<CGQY                  defghijklVectorsC  _0"x 0t088o|"03w~8qw9w>}  @x>` 0 =8|~7~|{ /|<<803p;~w8008qCcwa Ϗ0 l|0ьv `|?~yy3; ϟ>|z|ϟ>|33 &`>fc q ?9ysッ>c7ÿ0a33`6x8 #| ý<30<9|3<< <3gy̶yy3<;mk߿~c< &o3f'fc= ?^ w;o;<ٌ3fffo9o^e8 >pp;we(sϻ8=ـp<33z0 ~g?3>džy߿~{>|>|>~003}g8>330  @3< `<@/@xq0`#F` 0 `< @ xY` xp<<<x0!),/28=DINW]ciou{  &,2<BHNRY]dkpv|  ")37?FLSZahox %+3:BHNU[cjpu{  ''/5?GPV[cnv#,4:CIR]es{                               nopqrstuvwxyz{|}~Symbol q`?  p 0 & 0` &8 0` ?`Fp 0`  `@>@8@F 0`PB'x#pc?~|0@"0x "@8|`4ps   0`B s &ap000a` 0`00`0`Ø 3Ï` 0@   AP!h8p```` I0c ````C` 0` b0,3s008`L 0,80``0 Xa 0@x Apy`01@( (00B0~@ 0` `0L52  000a8c`  ,8` ` Xa 300 80  8 Ax}$00(  ( B@P 0` @ AX0 0`<00aL `  `,,` ` a0 xg sYp3 &  g@ |"|=`0 B010a '!%# DBR  P 0P`i X039`0002L`  0`L&` b`a0 yF6M~0 1 8ba0@>??0^9`3  C00%#  BR  P 0L@@%@00c0`0``  xX0L#`L b fa c`0 xp& Ec61  1p```00 ̀? ?Oმ  C0"#A " B" P 0PBGq3`x ``?` 8#0L!`À` 4ag0 0,8 F#61@,1 ``C`` ̀ Gq   C0"#A " B" 0 0`A@f3` f8`@00` `  !!`@ <a ,0l F#61  ,10``` ̀F0 9 P!aK  @Cps`  B B 0 0`A@r?5_6 1`000`  ! `L a` 8`g F"61  ,10`` ̀}0 @?Y ?C` @ dB  0 0`@?c9 6 `0`08& `  @ d`  @` 8`l F61L10`` ̀a0  P@@xp9  C0 $D   @0@0`@ À16``0008#c`  À@ 4` ` ` p`x F61pL10`` ̀ "}@xx00   '! $D  D@0@0`Pŀ1 16``` 08A`  0 ` ` @` p`x F6180 1  `aA ̀!9I !@?|<   00@(( (@0@0`P0 1 0b```` 00`  0a 0``0 `  0 XD6Y30O a0`d1C1p 0>*0000`3  @((  (@000@0` 0@ a8 00Ç`@ 0qf`  `qa 0`0` `p0L73`3x??~~ 0 f``p %````a`1000a@ 0 @@````?00` `p| ``0???~??~?pX3`6x0<?0 ?<``p<bc@0    Bp00` @0 00` @ @"00`@0 @0@0`D#1?c @0 `@ !  @0 @ @"|@0 @"$( (7HPV\cnp|~ 0=L[gw".<KTdr$*5AMYdo|                                   "%6AOZgs *6ASTlz%4CR^jz/<R_hn~ #$,26<<                                        Symbol   D@  0$1f@R?> pH$qA$J#0p @ >$BCDJ#WF`'8?73!9~KGϿN πl@$"A @BH$Bxy1BDF#P2pDcLP!$I C $Q@ @@# B ) 4̀`@ BH$1]DF#2I $|%)@B HQ`CdDgBlK7>{H:J@ [#;@$ b(`~2a'?dBH!H$s2B1DF#ȢS >g <䝀J DR @$C)U I8d2dT_0d󏿾#HGp8"b(P @HHBHK%KB"1DF#P"ʟ(!"DF$$@I* ׄ" _@JV Hb!2dT@ /@$ ` Ad00 0 RBP@ HsB1DF#%1 ("g I!|$!I "@UHb!2dT" / B TGbBؙh00 1P@RdBP@ HK2"1DF#P%2(1" $P$ $" h+THHb!2dT@/k 8 ΒA P(@@I! B ?K$DB1_DF#W} g8.r'9~c9?8q?obgatG&w͛8@8?! AL>/'! B !HDxx1͉D#0 @@0@@@R@  )@GC@@0@@@R@  B``@@A@ #'*-29;ABDILQV[`ejotuw} &*29BIKSU\bgot{                                   !$+29@LW^hosz #+3;CIOW^fnx  "&'+/047:==                                       Cx6 L GENEVA.092AEFTL GENEVA.10ESEFTL GENEVA.12ESEFT(L GENEVA.142AEFT2L GENEVA.182AEFT<L GENEVA.20ESEFTFL GENEVA.24ESEFTAX SYMBOL.092AEFTKX SYMBOL.122AEFTUX SYMBOL.182AEFT_X SYMBOL.242AEFTfn VECTORS.09AEFT1| VECTORS.12AEFTGenevaQ a 8@  H "AGP ( " $ #$ !@@D p  @Hq8 ?~ǐ ? @ '@#  A@ ( P L ;>by < #@AxHAD "4($APP "  @@@ (@P0$$@DD@"$PSb"!J!ƀ@C !`DA@H!&AD  AX 0 C@0(0 "P @B AD @@@@ @00( Rr@< D @ D A@I@ &BD@A  P L0(@( BP @ ADAD@@@ ((Lq @0 @$=B #@P@ gU(@I@ "D(@@"@H( P(A   Q0@ AD"B\q !@` "@PD@J `( @`(@$$DA ߣ0 "A  0P` 8`!$H Q" 0  0` ) 0`' A"F$@?A# DA:@@`>A($qD~J 0 D  AB$$@ 0 0( "A 0P` 0 !" A "0 8pÇ ) 0`"@F @ "!B$ DAD!` A($r @J(F$@@AG$$@` 0 ?B"(@ 0P` 0!QAA A !0 ɓ&L 0`"gJ@c @BAA( Ag(q "!` A@DDB @J$D@B $e@` 0 B0%BPD@0P` 0QBB   (P  0`":@bF$@@Bx@(!A 0  D` A BG@J% @ AB@P(0 "PBPPD @D 0P` 0PQDB   0`  0` @RI@B("A  00@D@@ A@I@ % B@ AD@0(0 P @BPP @D! 0P` 0P B 0 h8pÁ  0`rp @P @$($A 00@B!@ A @I@  B""A  g PP   !@@$"BpP`$p ! HP d" ,XbB$ID$hѣ"  @0 dHA$HP@!!` !`"EH!A r< >Å !$? p  A   @ 0` ,-15=FHPQXadmv %.5@IS\gqz !(*7>ELSZagnw &-4;>AFJQX_fmt{%.4:CLS\fry)6=IOUWY`kt                                                                                                                             GenevaJ2@ddL$$   7s/?8<>``@`hAD ( !Ċ4Hq(#C"*  aQ"DHXD(ax*erD„B!p*"`aHB|( Q <@@J?  PB" $!@pApD (")a 0`B$QR@><< HP a E* D!D""{OD$Ђ?p@@ HQ 0BAF$ 0`hADBa 0`BT! EQE?HP a 3* !H„B "")8DHH@Q@@aH@"  0DA: $0pdAD"B! a 0`BQT ? a @HP a PxA! ""СJ%|$  @@`@" @ 0DA 0pbA D@D"! a 0`BPP P a @HP a * rAP@! "" !HH @@ QDA(H"@a!PhABB@DA#Ċ4Ha (# D @`(`BB84Q"DHPD(0!* B!! $"" # $ @@@A$@'9@x@~g <{pA@DAqӈva '.: G@`'<t?H#'Is?VIFG1Q1Dc c$`##@BAV!#@RAՍPBEH3$$bTB|$"I0PE  1f0D# "cU)E"۟/nn{1@R]ٙffMT;- >PRD/H%3E&@ TbQT*"I}09R|E Џt"McĊfe&SL*T) RՌfffffeRANG #JD$J *I Tc1W+I}0f"E ~! *0Dc" $(b}&Se*TIE@fffcRT;,>RD/H${Q ʐb'Q~"I0TREDE"'F1Dc $ D &fa&SL$(@cffff"!RŊBBJR%RBS I b$B|F"I09  9̠Gãt~ ]Eq D ?S,nx)@]sٝRffwwODpuD&I1DIs9߀ 8@@ @ !$).0459>@EJOTY^chiknsvz "&*.247;=DHLPTX\_chotx| #(-5=EGJOW^glpty~ #(00000000000059>BFHKNPUZ_dinsz     Symbol q` 08 0`6 300? s0 0a3< ><00016a? ?`s8n|?0<`7 >`| 30`07016;0? y ÜÎ8qÝw n0`sxf``|  ~`p9 30`cps10 6p;0`?p0|p8?Ü083l90`s8?f``烀  Ü9`83330g88q10>l07>|8|p88Ü`8cp?p90`syx|~sff`;`>``?  σ0 833``30310l=078~?;78|ÙwÝ 98sq0`~6w?9Ï̀f`>00m8 cfg9 flf3l00031pa10 l|n07|{ǜßvx78 wqǀ p9s0`sÿ3|?w9݀f`x`>`1综8 w< n00fl3l03?3 Ͱ8ac0 0l~0g0qp`c88 wÜqp9?0`qcp68~9݀f`͘a ?q68~09݁;c ?s ?|<0x 0?lfa63?= `a30 ~l0gqpÎÜqp0ap8c`10`qÇ|>v8~09݀ffx͘c? Ͱf`0 001 3g83c00n`0Ꮞq0s?Üq80qp80`qÝns|wf69f`>xc~` 1<80 spp013?088c00ø;90sÜ;`qpÎ8qÁ0`7Ýgs8>;f`a<00 78`?|8{1Ü9898003`Îp0xy0|???Üg`|㏟p|f```` ? |> ~>|``3`0`0p`f`` 0 `ـ0 0`0p`f``  `π80>0ppf` 0 <pJVbkt,6>DQ^lx                                                     8)SYMBOL.09ȴ $ 8*VECTORS.09Ⱥ ̮8Symbol    3P|Jd PLLTdH P L4Td^,ـGO;{@ Ȩ`Az R/=L$LdRy3Z"fA hBTD(JٔRfq@HA@@?RVe8!! IEB j3={Œ0@ RP¼fLڤLdOsy2j@UL(TRPDHmefʶIK?j) 9r B)N,bU@/UVں&LLTBWR|dHU(4R!@H]U*I,fIjV$?I_J1LbU_P0 ݖ&LLdlARJe$BUIDR$HeI*fIjV}Y)b$0ďrP&LLd^:Aߓ{[~m%)S9!!> HG&Ƴ]={# "O<fOҤh@ @@(  U  H` ``L   !   "%*,0137:>BFJNRVZ[]`dgjnuz "%*.36;?DIMQVZ^cfjpuy~#(.5:?EJOTY^chmrx}   "$&&      VectorsC   r I  7000va?~?<0 08c?3b@080x0 20x ;o{x0q ? lfv130i>pAߜ>0 ?'pp1w1zMo{a01{!{nv|8`[@Krq1?_~;o6|1?#63;?7;xMo{>!y~{{{ ɿy7M?g`0祑6{qw=q2&a{377ݿ.oMmv1{co{{ٶ{߱a^?m-ù0cM=6g 1660#f{f77$ofMod9{3o{ng?m ǼM=Ͽa06_0'pqFlj{f3w ovMkd᷼{o[[6}yolﱳ}m v?kMo1T0960 M00Çc1;lGd繟~qߏ{{{0l m fݮy>eox60  `  8 n  wl p8sXp  w 0  !$(-48=EJOTY^chmrwy{}~ "%*/49>BGLNRWYafkpuy} "',16;CHMRW]cgkosw~  &+25::@DKQW[`fnt| %+5;BISW[`fpz      1l UTILITAIRESEFT9HFONTESESRESEFTEXEMPLESRESEFTH LISEZ.MOILIEFTAPPLEWORKS.GS - Trucs et Astuces - 8me partie Dans cette livraison de GSINFOS, je vous propose de travailler essentiellement sur le module graphique d'APPLEWORKS.GS: 1) Il est souvent utile de pouvoir tracer des arcs de cercle ou d'ellipse vectoriss d'ouverture quelconque, alors que les outils du module graphique n'offrent que le quart de cercle ou d'ellipse. Pourtant la fonction existe dans AWGS: vous apprenez comment la mettre en uvre. 2) Comment donner l'illusion du relief en jouant sur la palette graphique? C'est bien pratique quand on veut faire ressortir l'cran des informations particulirement intressantes. L-encore, les outils du module graphique vous donnent cette possibilit. 3) Suite de la chronique "La science et AWGS"! On vous explique ici comment fabriquer un document comportant du texte, des formules de maths et des graphiques. Attention, vous avez besoin des fontes SYMBOL et VECTORS qui sont jointes cet envoi...T.J.MORRISv͸ ' '$ROSE/\- / (ROSE.BASr. . FINDER.DATAɗTѶp۸8)@ ,@ main @" """"")' ;8[i"H""@d:""""mHHHh "hh"HH"hh"hن{iH{iH "{iH "ᩴ{iH{iH "{iH "{iH{iH "ύэ"{iH "{iH "ᩴ{iH{iH "{iH{iH "ύэ"{iH "{iH "{iH "{iH{iH "{iH{iH "@{iH{iH "{iH{iH "ݍ"{iH "{iH "{iH "{iH{iH "d{iH{iH "d{iH{iH "{iH{iH "ݍ"HH<"""{i+k ;8[i"H"" """7""{i+kHZ;i{HH ;[ H "H"HH "hhiHH"iH ""HH H "hhe : ""kHH ;[""" " " " " d&)H "h "Ԣ"""HH"HH"HH"H"kHH ;[ed  +hhk"h3h5h5H3H(k ;[H"h=:8 +;i H Zk ;i  H Zk+;ik;8 ;[  e {i e d d 8 H H H H" i 芗HH "hhЭ2HHH "h ( H"" "  "    {ei   ;ei+kHHH ;[ K 'aHHH"h::H"  HH"+;ik ;[ e +;ik  k;8 ;[H({iH "h\ U) &H({iH "h.H({iH "h+;ik+ : ;i kHHH ;[i ȗ0 i +hhhkHH"h"kHH"8k0;8  ;[HH "h: ) d )" #   +;i 08k;8 ;[  i ) U JLe Ȁe Jw(ȀȘem+;ikH ;[ 8-:  +hk5h!@? ;[ 23  :T+  ;i k ;[H "h  "ȗȗȗ "+  ;i k@HH ;[H "h% ia  )+  ;i kHHHHHHH$"hk ;[H "h!""eJ +;ik ;[H "h" "+;ikHH ;[HH "h)+  ;i kHHH ;[HH"h!H "h  +;ik;8 ;[H$" "h4 H"h$H"hH"hE 8 !"# {% HHHHHH$"hhhh+ " !;i k ;[ %{ )+hk ;[H "h, % HHHHHHH$"hhhh{ +  ;ik;8 ;[ &$"{iH"d{i  )  + $#;i"k ;[H "hID#;8 "%';i!'& %) +;ik;8 ;[&$"{iH"d{i ) + $#;i"k ;[H "hc^);8 ";i5 )il& ) +;ikHHHH ;[H"h`H"hPH"h@;8 " :: "h+  ;ik;8 ;[ m"{iH)" ;[H "hA @ "/{iH "{iH(" +;ik;8  ;[>m) H"(  a{8  +  ;ik;8  ;[H"hNID 7m)  H"    +  ;ik;8  ;[H"h]XS Fm)  H", )8 0e   +  ;ik;8  ;[H "hhc^ H"hNID "^m) G8  8  "    e :  + ;ik;8  ;[H"hzu H"he`[ Zm )  @m) +8  8  e :  + ;ik;8 ;[dm)m )eRJ";  )  e )  +;ik;8 ;[dH"hql km\m 8H C  e :)   8 e ) +;ik;8  ;[d d m) m )  0  h)+  ;i(k;8 ;[H"hg "a@ɀM "HH"iH H"+  ;ikHHH ;[H"hC ɀ8 @+ e :  ȥ+;ikHHH ;[HH "h~HH"hg eKZ H H [k>8 eKZ H H [kH,"+ ;i k ;[H "h& !@8  eiX X)+;ik                                 H KZ 8X::HHH " cH H [kk;8  ;[(0 {iH{iHڢ "{iH#HmH"*iH " "+  ;ik ;[ 4 0 H{i H"+;ik ;[ ʆ&   H{i H"+;ik ;[  "+  ;i k ;[  "+  ;i k ;[  "+  ;i k ;[  " " HH"+  ;i k ;[" HH"+  ;i k ;[H mH"+;ikH ;[HHIH IH "h II +hk ;[H "h I+  ;ikH"h%  E +;ikcck8k H;[IIIIʀFf ee&IIhhhh+k H;[ I I ȥIIʀ&&ff !  8  FfFfͥ  IIIIzzzzzz+kIIkIIk##kkCCkIIk8 # zz(kk; , ;kkO D F E N G+@HL;8 ;["5m{iH" {iH""+"!;i k;8 ;[(d &^ $ (ɭ *Dm  dd{iH""+ (';i&k;8 ;[ m{iH""+;ik;8 ;[$Zm"C{iH"  & "d&d&F8"+"!;i kHH ;[ - + i   +;ik;8 ;[H&$""h ( m{iH ""+$#;i"k;8 ;[&m$Ym "C{iH"- *{iH"" {iH""+$#;i"k;8* ;[{iH"! .ȩDȩ1 ?{i#H"%'+ !%' ){iH"PH"H"H#"H""HH")  +#""+;i*k.D1;8L ;[d3dMRH{i3H"3m57{iH"y9d {i9 d {iH"M ;;{i<Hk"HH"{iH"33"Ma"+NPMO;iNk;8 ;[$ R i 6  d&d(#{iH""&(+ "!;i k;8 ;[d&d($ j i N ?{iH""%HHHHH "h&h(hh+ "!;i k;8" ;[( E i ) ɭ!ȷ#)*+$&#%;i$k;8 ;[ :  +k ikHH ;[ HHH "h " " " "+hhkHH ;[ 3 i  ȥ +  ;i k ;[  +{ei d : ȷ   +hzk+k;80 ;[>@ : 8:":"Bm  84 ) a{8    i Ȋ ">B@86"d>>@ :"<1 '{iH"{iH"<ȗ ɭ68 6ȥ8  ɰɭ6HHHH "h  Ȋ+2@1?;i>kHH ;[  "H ɭ#HHH""  М+  ;ik;8 ;["  ɭq %H({i H "h )){iH"$!" &$ %$%$&$"+ $#;i"k HH ;[" x  _  ɭɰFH "h1 " "+;ikHH ;[HH "h" "+ ;i k;8 ;[" t d  ɰOȷ t)kl mD&& && m  )   H")I  0  { )8)F6e  {{ I8?0= 5-  e H"+;ik???;8 ;["   ɰȷ {i dd )M  HHm" H"|"u :   iH " Ђ7 ԘԖ" ԘԖ 'H"+;ik;8  ;["  ɭ ɰȷ )0 H""Ȅ ex ")Y 1) :  9HH HH  A)H" e + ;ik;8 ;["  ɭ ȷ  {id $  m  y* )ece! H";e e     +;ik;8 ;[) e Ȁ"', ȗ Ȁ,ȥ , Ȁ    +;ik;8 ;[{i d )fe "8 ԒԐ" ԒԐ +H"+;ik;8& ;[%64{i%H{iH{i'H "{iH20.i H " ", %#64)%d,)4) %d,. ,::0,+(4'3;i2k ;8& ;[%,'{i%H2 1 '     64 {i4H{iHڢ ")  0ʀ)0 d'0 )eI,%{i%H{iH0. "+(4'3;i2k;8" ;[2?.*,( d {iH ""᪠ .:.!ȷ.#!!d#.HHHH,*#! "hhhh{iH"/(+e!e#{iH" d(*,{iH".*,{iH"j . .ȥ . ɰ!. {iH"".{iH""+$0#/;i.k;8 ;[)) H"h"daZ"" 0   ""3." )""+;ik P0P0 "k " "H "k ;8  ;[{iH)"i H:"{iH " 9HHg"{iH H H~"h";"+;i kH"kH ""h)k;8( ;[{iH)"  i d{iHV"᩼IH({iH "hɥ ¥{iHV")+;i(k;8  ;[{iH)"{iH "H{iH{iHO"h)  :"+;i k;8  ;[   <)e  2)   i9)e )H 2h 2܂+& )e 2 ȗ+ ;ikHHHHH ڢ$"zzh`;8 ;[$m) a{8 ʈ " ud F"@6ʈB"&ʈ "ȩ  i +"!;i k.CONSOLE .PRINTER .MODEM     w   #'<X@KNX_bXfiXmXquX"f#  3 8 ;X?BX [ X  }X  EHXLP[^Xbm XXXX 2MXov`z|~;+s.QU`eqjuhT T }8B?BFBY`^TaVfZi\TVxTUTV`Z F) B, D8 ;  > @   @ > : 4 4 & ( ** <. 2 <; B? DE DJ BP HT JZ J_ He <i :m p    & ( 0 , 2 . 4 6" 8D 4H 6L 8\ ,_ .k 0n 2s ,v . * , . : <   T        & I ) I ` T  T    t T  ! % vP   T  T  T  T  T T `LT lr`T ?EK^p|T T T FlKnxT T #=h@jIlSnjpqrlnjlonprp7`r}}lnlnln}`}<lAnoT `ln `^lcnT `KT clhn`T `>lCnT`T ln`,T DlIn^`T T ln`|T T lnln-l2nClHnk`T lnlnlnlnT "'4TT   (.7=N]cvlrzT NNNNNNNNN N NNNNNNN"N%N(N+N.N1N4N7N:N=N@NCNFNINLNSZb~[Z]n l r7  !;!b!!!`!58!`!!58!n!l"r7h"T "T $$$$%l%nA%$%l%n%$%l%n &$3&l8&n]&|b&~g&&$&&&&T 'l 'n5'$X'l]'nl'l'$'`(`('(W(0b(0l(0w(0(0(0((}(}((l(n) )J)0S)0o)})$)))!9)$+*.*F*!9g*$**,+5+8+D+J+M+S+Y+\+:_+b+:e+p+++++++,,++,s.,l,n,i?,i?%-!9(-!9C- +X-U%u-s.-!9...++. +. +/++?/:|/ +/',///////"/++0T >0 +L0',n0 0++0 +0++1M21M21K21K261l;1nb1f1581:1:/2 +Z2++2202 +2',$36J3"\33d3r73++4 +4',G4"V444444++b5le5np565 +6z6|6~6~7~7~ 76!7"67d7>7r7L7zQ7|8)8T:|]:~:$:'=;< ;<Q;;W;;q;'=;;;;;;;;=j>>j>$>j>@>j>>l>n>i?>i?0?=7?=}?:?=?= ;[ ):  +;ik;8 ;[     :  ie H ,@ _mainprog ;8[i""$$""v""+""""a""""a""","""""""""{i+k Xx$$(%X,X36X=@XD/HXORXY\X`/dXknXuxX|/XX.XX ;[ ):  +;ik;8 ;[     :  ie H  HH H"W+ H) H1 H" :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  )  ) ,@ _linetbls  ;[ ):  +;ik;8 ;[     :  ie H  HH H"W+ H) H1 H" :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  ) ,@ _datastmts ;[ ):  +;ik;8 ;[     :  ie H  HH H"W+ H) H1 H" :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  ) ,@ ~global  ;[ ):  +;ik;8 ;[     :  ie H  HH H"W+ H) H1 H" :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  )' Algorithme "La Rose", de Peter Maurer de AT&T ' Ref The American Mathematical Monthly Volume 94 pp 631 - 645 ' Traduit en Apple IIgs par Terry Morris ' Les seuls changements pour dessins differents sont N% et D% ' 1 <= N% <= 359 , 1 <= D% <= 359 Library "QuickDraw" Library "MiscTool" $EventTrapping ON Proc SetUpQd On Kbd goto Endprog N% = 4:D% = 43: Proc Algorithm N%= 6: D% = 97: Proc Algorithm N%= 5: D% = 97: Proc Algorithm _sysbeep Get$ a$ EndProg: _QdShutdown _MTShutdown End Def Proc Algorithm _ClearScreen(ScreenColour%) _moveto(320,100) A% = 0 Do A% = (A% + D%) mod 360 R = sin(((N%*A%) mod 360) * Pi/180):rem Pi = 3.14159etc T = A% * Pi/180 X% = R * sin(T) * 220 + 320:Rem Radians Y% = R * cos(T) * 100 + 100:Rem Radians rem If Peek( _lineto(X%,Y%) Until A% = 0 End Proc Def Proc SetUpQd Graf Init 640 Graf On ScreenColour% = 0 _setSolidPenPat(15) End Proc OPERATION SHAREWARE Pour tous les utilisateurs qui aimeraient bien payer les quelques sharewares qu'ils utilisent mais qui auraient des difficults traiter directement avec l'auteur du programme pour diverses raisons, Solidarsoft, qui reconnait dans le phnomne "shareware" quelque-chose de trs proche de ses ides et dsire le promouvoir, met en place ce petit service d'aide ouvert tous, membre ou non (ou pas encore!) de Solidarsoft. Pour cela, c'est trs facile: il vous suffit de remplir le formulaire qui suit ces instructions, et de nous l'adresser accompagn de votre chque au sige de Solidarsoft. Ce service est gratuit, mis en place avec le dsir de ne gnrer aucun profit pour Solidarsoft, mais aussi aucune perte. Aussi, et aprs des essais en vraie grandeur qui nous ont fait retenir les money-orders de l'American Express envoys par nos soins aux auteurs comme moyen de paiement le mieux adapt pour l'instant, nous vous demandons de suivre les directives de calcul suivantes: - compter le dollar 7 francs afin de se situer coup sur au dessus du cours du dollar la vente pour une priode raisonnable. - augmenter de 40 francs par tranche de 200 dollars le montant pay pour chaque shareware pour couvrir les autres frais occasionns par ce service: tablissement du money-order (30 F.), port, correspondance, etc... - Et bien sur, avant chaque paiement, prendre la prcaution de vrifier ici-meme ces valeurs fluctuantes... _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._ FORMULAIRE : PAIEMENT D'UN PROGRAMME SHAREWARE Votre nom:........................................................... Votre adresse:....................................................... ..................................................................... * Les renseignements ci-dessus sont destins l'auteur du shareware, pour le cas ou ce dernier dsirerait entrer en contact avec vous, par exemple pour vous remercier, ou vous informer d'une version rcente de son programme, ou encore faire connaitre d'autre sharewares) Programme pay:......................................Quantit:....... Pour quel ordinateur:................................................ Nom et adresse de l'auteur:.......................................... ..................................................................... Prix unitaire demand par l'auteur:.................................. Montant correspondant sur votre chque joint*:....................... * Pour un shareware en dollars, calculer son prix 7 francs le dollar puis majorer le rsultat de 40 F par tranche de $ 200. Pour un shareware en francs, majorer simplement son prix de 5 F. En cas de paiement de plusieurs sharewares diffrents, vous pouvez ne faire qu'un seul chque global, mais vous devez remplir un formulaire pour chaque titre, et faire ce calcul pour chacun. Si vous dsirez un justificatif de paiement, veuillez imprativement nous adresser une enveloppe timbre pr-rdige votre adresse, et remplir la partie -| LETTREREYREE.YK7SLG.SONSTREE.YK POMILLUSTREE.YKHUMEURMAITAS.YK LE.23.MAITAS.YK DERNIERESTAS.YKH EDITORIALTAS.YK\ANNONCEDATAS.YK\ FINDER.DATAS.YKZH PRESSE.22FTS.YK7 SOLIDARSOFTS.YK9SUR.FICHIERS.YK7H AWGS.TA08.TXTWS_RESSOURCES2.MWS MICOL.BASTAS2ES9TRUCSR.DATAS2ESREVUE DE PRESSE --------------- The StudioWare -------------- Un catalogue de Roger Wagner (printemps 92): ben, faut bien qu'il y ait des gens pour soutenir l'Apple II et R. Wagner est l'un des derniers proposer des logiciels pour cet ordinateur. Alors, ne boudons pas notre plaisir. Dedans, toutes les nouveauts de Roger Wagner Publishing: - D'abord, HyperStudio 3.1: on peut diter des boutons, voir la police avant de s'en servir, comprimer les sons pour avoir plus de mmoire, animer des images plus facilement, se servir de camras vido et de disques CD ( avec la Video Overlay Card d'Apple et le tout en Ntsc, c'est dire au standard amricain; en SECAM, allez vous faire voir), faire de nouvelles transitions entre chaque cran, employer des images en 320. Le pied, quoi! - The Graphic Exchange qui permet de convertir des images de tous formats. - Desktop Screen Saver ( un NDA) permet de mettre sur disque une image SHR ( Super Hi- Resolution). - Doo-Dads and flags: une collection de drapeaux, bordures, flches, etc. pour 14$ 95. ( Tiens, ils font comme dans les grandes surfaces: les prix sont toujours 5 centimes de l'unit suprieure, sauf qu'ici, il faut multiplier par 5, ce qui fausse un peut la donne). - Clip Sounds Volume One: des son pour HyperStudio avec une Xcmd, Disk Play ( Externe Commande) qui permet d'entendre le son que vous voulez mme si le message " out of memory " est affich. C'est ce qu'ils disent...19$ 95 - Bells and Whistles: des sifflements de trains, d'avions, etc.14$ 95 Bon! C'est un catalogue; je ne vais pas vous faire l'article. Il y a plein de choses intressantes mais il suffit d'acheter HyperStudio et de se faire enregistrer pour le recevoir. Si vous voulez que le IIgs vive... vous voyez ce qu'il vous reste faire. A ce propos, il y a un upgrade (une mise jour en bon franais) pour tous les possesseurs de la version 3.0: 10$ pour HyperStudio 3.1 30$ pour HyperStudio 3.1 + le systme 6.0 0$ pour HyperStudio 3.1 si vour renvoyez vous 6 disquettes d'HyperStudio 3.0 Si vous avez HyperStudio 2.1 45$ pour HyperStudio 3.1 65$ pour HyperStudio 3.1 + le systme 6.0 C'est honnte, non? Roger Wagner Publishing, Inc P.O. Box 710582 Santee, CA 92072 Demande... ---------- Le IIgs, c'est bien et je ne voudrais pas m'en sparer pour rien au monde. Mais avec une PC Transporter, on est quand mme srieusement limit. Avec une mmoire de 720 k, impossible d'avoir accs Windows. Or, que je sache, si Microsoft a essay de copier ( mal, il faut le dire) l'interface Apple, il faudrait qu'Applied Engineering se mette au got du jour. Un PC AT avec 3 mgas de mmoire, voil ce qu'il nous faudrait. Peut-tre que Brjoux pourrait intercder en notre faveur? Une carte permettant de se librer du MS-DOS et de tout grer la souris serait la bien-venue. Bon, je sais, un tel propos dans le cadre d'une revue ddi au IIgs est mal venue, mais il y a beaucoup d'utilisateurs de notre micro prfr qui se servent de cette carte. Allons, monsieur Brsard, aidez nous! A2 Central Mai 92 ----------------- Un super grand article sur Apple Share. Mais a ne concerne que ceux qui ont plusieurs ordinateurs relis entre eux et/ou une imprimante. Pour le commun des mortels possdant un IIgs, aucun intr^et. Enfin, on y apprend qu'on peut connecter des imprimantes PC telles que l'Epson. En voil une nouvelle qu'elle est bonne. Je n'ai rien contre Epson, ses imprimantes fonctionnent trs bien. Mais reli une Epson un Apple... Le systme 6.0: Il semble qu'il y ait quelques problmes pour l'installer sur un disque dur. Si vous ne l'avez pas dj fait, c'est que: 1- Vous n'avez pas de disque dur comme moi, 2- Vous ne le possdez pas encore. Ceci dit, et c'tait trs important ( idiot, serait plus exact- bon d'accord!), il y a quelques formalits respecter: - Si vous possdez un disque dur Vulcan d'Applied Engineering ou un lecteur Haute densit d'AE, faite une copie du disque d'installation. Ouvrez MINISTELv͸, ' 'XMINISTEL _'  ,MINISTEL.DOCi&Hݸ;ݸ; MESSAGEESSAIx FINDER.DATAɓj'pܸ  rFCS[ ,@ main S[ """")  ;8[i","HHb"h{i+k ;8[i"{i+k ;8[iH"hHHHHH"h8pI6""""{i+k(Erreur en chargeant un outil...Erreur # ;8[iHH"{i+k ;8[i8pI0U e 8 nSuiteQq*Lir0AnnulerHome00-Xx *Cc*EcrVvENVOI Statut Modem?Guide Edition CONFIGURATION Rception Options Aide *Ecr*GS 6 p3*RTel2*Lir Emission... -.@-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~pI0' :e Ⴋ{i+k ;8[i eH0"{i+;ik ;8[i{iHHH")(8pI7{iH{iH("hh{iH{iH")8pI09i)/i: {iHzz{iH"{iH{iH"H{iHY"h{i+;ik /^ Continuer / Interrompre  60/ Arret dans programme ;8[iHHHY"h{i+k ;8[iHHHY"h{i+k ;8[iHH"h:H+"h ""{i+k ;8[i{i+k ;8[iHHHHC"hH"""9"`"H"H"h*"""HH"h{i+k ;8[i d   ""{i+;ik ;8[i{iHHH!"۩  H/"hHH"h׆HH"h߆HH""" "H{iH"hl8H :"{iH"ע""բ""{i+;ik ;8[iHHa"h"{i+ ;i k ;8[idHHR"hنۥ<٦HH٢*"h݆ߥ݅٥߅ۥ{i+;ik ;8[i{iHHH")O8"z{iH "hh{iH{iH{iHi i "hh{iH{iH"{iH{iH"g g "e e c c a a {iH"{iH "{iH "_ _ "{i+;ik ( ( ;8[i{iۆۢ" 8pI0-i)ߥi8 HH{iH"{i+k ;8[i{iH"h{iH{iH"{iH{iH"hhHH{iH"{i+k ;8[i{iH"h{iH{iH"{iH{iH "hhHH{iH"{i+k ;8[i{iHHH"{iH{iH"{iH{iH"{iH{iH"hhHH{iH"{i+;ik2 ;8[i{iH"{iH"h{iH{iH"){iH{iH{iH{iH"{iH8uH"hhHH{iH"{i+;ik ;8[i{iHHH"ݢ)8pI0Mi)/i: ii蝹 ݂) HH{iH"{i+;ik ;8[i{iH+"8pI0uH"hi)Hi{eH ""i "h"h"h t HH{iH"{i+  ;ik ;8[i 8pIiH"h׆٩ե:8pI07բHצل"h Ղ{i+  ;ik ;8[i{iHHH")ݩۥ݅8pI0i)ש8pI8:pI%ۨ U8=pIz8pI )٥ۨ ۂK {i+;ik ;8[i{iHHH"):"ۥم8pI0Xi)H""h#"zH "heH:"ۂ{i+  ;i k ;8[i{iHe"{iH{iH"hhHH{iH"{i+;ikd ;8[iݥ8pI0i ݂ HH{iH"{i+;ik ;8[i"hنۥمեۅ"h{i+  ;ik ;8[i"hنۥمեۅקՅ{i+  ;ik ;8[i"hنۥمեۅקՅ{i+  ;ik ;8[iH"h{iH "" HH{iH!"{i+  ;ik ;8[i"h׆٥ׅӥمՠӪӅ{i+  ;ik ;8[i"h׆٥ׅم{iHԓԑ"h{iH{iH!"  HH{iH!"{i+  ;ik ;8[iߥ){i+;ik ;8[i"hنۥH+"{i+  ;i k ;8[i"hӆե׆+"{i+ ;i k ;8[i"hنۥ  {iH+"{i+  ;i k ;8[i{iHHH"{iӆբ)"h͆ϥͅץυץѢH+"{i+ ;i k ;8[i","{iHee("H{iHY"h{i+k'40/ Le Modem est introuvable. /^ O.K. ;8[iH"hH"h{i+k ;8[iddũ# ǩˆͥŅ{iH, ""WJ"2% éŏՏťÉa{i+k ;8[id ""{i+k ;8[i{iH "{i+k ;8[iկשن۩ݩ{iH ""{i+k ;8[i{iHHH")8pI0$i) "{i+;ik ;8[i"h{i+k ;8[iH"h "{i+k ;8[idӯd{iن۩ݩ{iH- "dϥ) ϥ{i+k ;8[iϯѩӆեץ{iH "" ۏݏ{i+;ik ;8[iHH0"hنH٢"h{i+  ;ik ;8[iHH0"hن٢"{i+  ;i k ;8[iHH0"h׆٠תׅ몠φѥυӥхHHӢ""hˆHӢ#"hɥɢ 8pI+HH{iHɢH+"HH{iH"{i+  ;ik ;8[i{iHHH"HHH0"hن۠٪م͆ϥͅեυ{iɆˢ)բ "٢%"٢"{i+  ;i k ;8[iHHH0"hن٢("٪م͆ϥͅեυբ"٢%"٢"{i+  ;i k ;8[i{iHHH"HHH0"hن{iH٢ "{i+  ;i k ;8[i{iHHH"{iH{iH"{iņǩɥ˥ѥͥ{iH ""G"{i+ ;i k ;8[i{iHHH"{iH{iH"{i{iH ""J{iH ""{i+;ik ;8[i{iHHH"{id{iH ""{i+;ik ;8[iѯӠՆׯٯ{iH ""{i+;ik ;8[i{iH "{i+;ik ;8[i{iHHH"{iH{iH"{e{iȊ{iH " "{i+;ik ;8[iM{iPH"{iPH#"2{iPH{iPH "P7{iPH{ifH"k{iNH{iPH"h{iNH{iNH"{iPH{iNH"h~~{iNH{iPH"h{iNH||zzMM88{iNH"{iPH{iNH"H{iQHY"hNN {iPH"{i+k/^Annuler / O.K. , et les resources et donnees qu'il contient. "60/Vous allez detruire "/^Cancel/ O.K. and its datas and resources! "60/You'll delete "" Choisissez le fichier a detruire File to be deleted ;8[i{iHHH"{iH""H"{i+  ;ik ;8[i{iHHH"{iH"ɯˠ͆ϥѥ{iH ""ՅťׅǯHH"pIV"h{iH "" H"{i+ ;i k ;8[i{iHHH"{iH"߯{iH "" H"{i+;ik ;8[i{iHHH""hdžɥDžåɅ{iH"˯dϥѥ{iH ""ZÅŅʅ{iH "" H"{i+;ik ;8[i{iHHH""hdžɥDž˥Ʌ{iH"ϯѩdd{iH ""Z˅ͅʅ{iH "" H"{i+;ik ;8[iͯϠцӥե{iH " "{i+  ;ik ;8[i{iHHH"{iH""H"{i+ ;i k ;8[iեץ٥ۥ{iH " "{i+  ;ik ;8[iեץ٥ۥ{iH " "{i+  ;ik ;8[i˥͠φѥӥdd{iH " "׏ُ{i+  ;i k ;8[i{iHHH"{iH{iH"t {i{iφ{iH "{iH"h{iH{iH"ddddddd{iH "{i+;ik ;8[iݩ{i{iH "{i{iH "{i+;ik ;8[iߩ{i{iH "d{i{iH "{i+k ;8[iݥ{i{iH "{i{iH "{i+;ik ;8[i{iHHH"{iH{iH"){iH")i)H "HH{iH"{i+;ik ;8[i{iHHH"{iH{iH"d{i߆{iH "{i+;ik ;8[iݩ~~{{vv{iH"{iH{iH"{iH"{iH"h{iH{iH"{i+;ik00000418030003601303042000C58D0D03690318ADFFC58D1403 ;8[i"""d"{iH ""{i+k ;8[i{iHHH"{iH{iH"ididid {iȊid ȊidHH "("liJd{iH{iH"h{iH{iH"HH{iH"iiJd{iH{iH"h{iH{iH"HH{iH"idHiJdiHY"hd_id/i2did.骠,liJd{iH{iH"h{iH{iH"HH{iH"iiJd||{iH{iH"h{iHeeccVV{iH"HH{iH"idHiJdiHY"hd{i+  ;ik /^ O.K.  " n'a pas de res-fork.60/ Le fichier " /^ O.K.  " .60/ No resfork in the file " /^ O.K.  " est introuvable. 60/ Le fichier " /^ O.K.  " . 60/ Can't find file " ;8[i{iJH "{iJH !"2{iJH{iJH "JI{iHH{i`H"H{iHH "hI{iHH{iFH"26{iJHk k "{iJHG G $"2{iJH{iJH "JI{iH{i`H"H{iH "hI{iH{iGH"2:- - {iH{iHH"h{iH* * ( ( {iH{iH"h{iH  {iH"{iJH{iH" {iH{iHH"h{iH {iH{iH"h{iH ~ ~ {iH"{iJH{iH"H{iKHY"h#HH6"hHiH "h"H{iFH"h8pIH{iGH"h8pI'H"HH""?6HH"8pI0H"H"HH""HH "HHH6HH"8pI0H"H"HH""dHHH"H"H"{iH"HH""HH""{i+k/^ Annuler / O.K. ".  va effacer celle du fichier " " #70/ Copier la res-fork du fichier "/^ Cancel / O.K. ".  will overwrite resfork of " " 70/ Copying resfork of "# Choisissez le fichier destination: Choose destination file Choisissez le fichier a copier: Choose source file. ;8[i{iHHH"{iH{iH"d2{iH" HiH"HiH"HH"HH"{i+;ik ;8[id{iH "{iHq q "2{iHH"8pI" HiH"HiH"HH"HH"{i+kNouveau nom fichier: New name: ;8[i8pI H"8pI H" "{i+k ;8[i{iHHH"t {i{i " " "{i+;ik ;8[i˥͠φѥӥ{iH """{i+  ;i k ;8[iP{iH  "{iH "H{iH"hI {iH""W$&[,.SSH{idH ""c H{iH "" H H{iH #" H{iH "" {iQH{iH"h{iQH{iH{iH{icH{iQHWHH"h{iQHvv{iQH[HH"h{iQHee{iHNN{iQH"{iH{iQH"++{iQH{iH"h{iQH((&&{iH  {iH{icH{iQHWHH"h{iQH{iQH[HH"h{iQH{iH{iQH"{iH{iQH"H{iHY"hS D{{yySSFF{iQH"{iH{iQH"A&&$${iQH"{iH{iQH"H{iHY"hQQ"USD^^{iQH"{iH{iQH"A''%%{iQH"{iH{iQH"H{iHY"hUSYWHH["pIW_[_W_H"hI^{iH"{iHHH H H"HH_"hHiH "h""Ud{iH"l{iH"S{iH":{iHvv "!80 H`Ng Ud{iHdd"l{iHJJ"S{iH22":{iH"!80 ^H`+ {iH"{iH"{iH{iQH{iH"h{iQH  {iQH{iH"h{iQH{iQH "{iH{iQH"{iH{iQH{iH"h{iQH{iQH{iH"h{iQHll{iQH "{iH{iQH"H{iHY"hQQLLSH "S,,UH "%WHH"pIH"hH"hHHHWHH"HH "HHHWHH"8pI"HH"HH""HHH"H"H"[HH"pIS%  UH "%H"hH"hHHH[HH"HH "HHH[HH"8pI"HH"HH""HHH"H"H"$&(*,.02 ""HH"{i+k&/^ Annuler / O.K. " ? Nom de destination: " " 70/ D'accord pour $/^ Cancel / O.K. " ? Destination name: " " 70/ O.K. to copier le fichier "copier la res-fork de "copier la data-fork de "copie totale de " copy file "copy res-fork of "copy data-fork of "total copy of "//^ Copie totale/Data-fork seule/Res-fork seule;Vous pouvez copier: les deux, ou l'une d'entre elles seule. 670/ Ce fichier comporte une data-fork et une res-fork../^ Copy both /Data-fork only/Res-fork only6You may copy: both, data-fork only, or Res-fork only. '70/ File with res-fork and data-fork. /^ O.K. ( Ce programme ne copie pas les dossiers. 60/ Ce fichier est un dossier. /^ O.K. % Copying directories not implemented. 60/ This file is a directory. /^ Annuler / Continuer  Access = $ Longr res-fork = Longr data-fork =   Storagetype = $ Aux.type = $Type = $ " "70/ Infos sur fichier a copier : "/^ Cancel / O.K.  Access = $ Res-fork length = Data-fork length=   Storagetype = $ Aux.type = $Type = $ " 70/ Infos about source file : "Choisissez le fichier a copier.Choose source file ;8[i-{i/H!! "{i/H!! "/n2!!{i/H{iPH ",n2!!{i/H{iPH "P{i/H{ifH"{i/H{iVH"{i/H"{i/H{i.H"{i.H "LG "1.{i/H"{i.H "{i+kNom du nouveau fichier ?Name of new file ? NameLess1.r NameLess1.r ;8[iHH H" "h"{i+;ik ;8[i{iHHH""{iHHH"{iH!"盛 {i+  ;ik ;8[i{iH!"{iH""H"h{iH"{iH"{iHHH"{iH!"몧 {i+ ;i k ;8[i>{iDH " z|~{iDH{iCH"{iCH"H"hIdd{iDH"{iDH""dd{iDH!"xDHHiH "h?{iEH?HH("?{i+  ;ik-SansNomUntitled ;8[i{iHHH" "߆{iH"h{iH{iH"h{iH{iH "{iH{iH"ttrrkkiiYY{iH"h{iHBB{iH"h{iH22{iH "{iH{iH"H{iHY"h{i+k/ O.K.  Nb de lignes: Nb caracteres:  Nom :  70/Infos sur le texte :/ O.K.  Lines count: Characters count:  Name :  70/Infos about text: ;8[i))@dDggSS{iH"{iH{iH"A2200  {iH"{iH{iH"H{iHY"h{i+k/^ Oui / Pas la peine "Voulez-vous la sauver auparavant ? 60/ Vous allez perdre ce texte !/^ Yes / No Do you want to save it ? 60/ You'll loose the text ! ;8[i{iH" "߆HHߦ"hHH "hHH HH{iH" "h"hHH "HH"hH ""1{iH"h{iH!" " "dd""{iHHH"h{iH{iH"{iH"H"hHH"pI0""HH""{i+k  5 /_:_HNYT_o_{_NY_WWWW_WW__++v(v( v(v(nv(v(b  dWiWu_WWW(_`d%(7Po_WW_W$W0_T_s___TYWW___ _NY +_?_C WO_[_i_m_y_}NY _PYRY__?_O_b_lRYqPY}________ __(_w_}YY__NYYY__cz   d  d   _   ~  ~  |  | ( < _P _T z W z a _ _`    d   ( d@ j w z    d 7 : @ Q 8 l   d    _!l e_   : r VZ|VZ_,_4 G Pl `_d  . r Y_! m  O [XZ_XZbXZx_ ZZ\ZZZZZ_ G_ ___MM<_[__TY_ _NYTY;Am(qtw,|.((___NY*_*hh'_+_7_;NY?lh$Y"Y~ h *X_*ss___NYdf_)_c_z____J_`_ __(_h_}____ '_E_}___NYNY`Z3Ia`Zu_y__NY`Z___NYbZdZ^Z D _H _T _X NY\  ^Z bZ dZ _ _ _ NY !_!`ZU!k!!_!_!_!NY!!fZ!^$!^$"";$";$"J"_m"q"fZ}"($"($" "&$"&$"$$"$$"$"$"#"#"""#"## ############!##$##3#L#k#_#6!$$$| $^Z$ $$$^Z(%_,%_8%_<%NY@%O%dZT%bZ]% p%^Z%dZ%bZ% %_%_%_%NY%%^Z% % &&^Z*&_.&_:&_>&NYB&I&^ZN& && &&^Z&_&_&_&NY&&^Z+'_/'_;'_?'NYC'J'^ZO' '' ''^Z'_'_'_'NY''^Z+(_/(_;(_?(NYC(J(^ZO( z(^Z(_(_(_(NY(() )h()^Z) a)_e)_q)_u)NYy))_)_)_)NY)3*_7*_C*_G*NYK*Q*bZW*dZ***_* +-+_y+_+_+_ ,_H,_m,_,,,8,R-,R-, 9----_-/./././ ./ ./././........"..%..(..+.....1..4..7..:..=..@..C..F..I..L..O..^.w..'..&/--/-4/-?/TS/_W/ // 0_0_0_ 0NY$0(0fZ>0i3A0i3V0 e0e3h0e3k0c3n0c3q0V3t0V3000C30C30 0030030.30.30!30!30181_1fZ13131 12121212121211 2222$2 322622922<22?22B22Q2g22_3fZ3:3:3393933_4/4b/T4q4fZ49494494944_55b/75T5fZ`59c59x5 595959595m95m95 5i95i95K95K9555'95'9 6 6$96$96"9"6"9%69(69=6 L68O68R68U68d6}66_6NY6 6W6_7_7_7NY7-727jZ:7NYX7]7hZe7NYs7jZx7 7_7,7bZ7dZ7jZ7^Z7| 7NY7hZ7 7jZ7 7_7,8_8hZ/8)78NYE8hZJ8 N8jZS8 g8_n8,u8hZ}8dZ8bZ8/)8jZ8 8hZ8 8p*8_8_8,<:U:^:^e:^:^:^:_:^:^:^:^:^:^:^:^:^:^:^:\:\::^:^;u[;u[&;*;^/;^;;_?;^D;^P;_{;^;^;fZ;<;<;;<;<;;u[;u[;^;^;_;_<_<NY <<^"<^&<^*<^.<^2<^6<^:<^><^B<^G<^[<]^<]n<r<^w<^<tZ<tZ<<^<^<_<^<^<_=jZ=jZ=  =hZ.=hZ3= :=jZA=hZH=,r==z\=|\=~\=\=\=z\=z\=_=_=_=NY=$>_(>_4>_8>NY<>@><i>fZ~>}O>}O>>]O>]O>>NY>:>u[>u[>>\>\>S=>\>\>\>\?\&?_6?\O?__?\d?\}?_?\?_?fZ?=O?=O? ?:O?:O?8O?8O?/O?/O@O@O@O@O"@O%@O(@N+@N@@8 O@NR@Ng@8 v@Ny@N@N@N@@@N@N@ @N@N@N@N@N@N@lN@lNAWN AWNAUNAUNABN ABN5A8 DA*NGA*N\A8 kANnANzAM}AMAAA_AfZAMAMAMAMAMAMAMBMB*B1BM4BM7BM:BM=B]M@B]MCBPMFBPMUBnBB_B<BfZB(MB(MB&MB&MBLBLBLBLB CCLCLCLCLCKLCKL"CL%CL4CMClC_C Ci; D] D]D%D\*D\/D\4D\9D^OD WDWpD_vDv\{Dx\D_D_DNYDD<DfZD LD LDDKDKDDKDKDEK EKE)E.E.ED0ED2ED4EDMEKPEKVEfEKiEKoEEKEKEEKEKEEEEBEE[EEtEEEE\E\EE]E]EEfZEsKFsKF -FpK0FpK3FnK6FnK9FUK[UZ>[[Z_Z^bZ^eZ)[hZ)[nZyZ^}ZUZZZZZ2_Z Z [^[J [[_CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# $4,<:IEUGWM]O_CL\ "_ ,@ ~global _CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# $4,<:IEUGWM]O_CL\  ,@ MiniCom1  ;8[i"hنۧ) )ץׅ{i+  ;ik ;8[i{iHHH")HHעHiH "hن{iH٥עH("" "H "{i+  ;ik ;8[iHH"hۆݠ۪ۅHHHH"{i+;ik ;8[iկd{iۆݩߩ{iH- "d44{iH"h{iH{iH"{iH{iH!"H{iH"h"{i+k Status = ;8[iөկש{iۆݩߩ{iH. "{i+k ;8[iHH%"h"h߆HH%"h"pI0{i+;ik ;8[i    "HH"""ooH0"h{i+k ;8[i{iHHH")8pI0Ii)) IH""Ⴗ{i+;ik ;8[iqqoomm{iH"{iH"{i+k R ;8[iHHHH""{i+k ;8[i. 8pI"{i+;ik ;8[i "{i+k ;8[i?8pIm8@J"8pI"8@8pI0 " " "''H "3"80 "ho808pI"{i+k ;8[ie (( aeu (H@80(aeiou ( eiu TCc (ABC$HxK "{i+k ;8[i:II{8@`-_O8pI+8pI0H"8'pI0"{i+k ;8[iI H"v""|"u"n"g8pI H"I80 / H` {i+k ;8[iHHiH "hHHiH "h{i+k ;8[iHHHH""h{i+;ik ;8[irP"pI%CHHHH"h  H "eʅHH"pI0 :.HHHH"h H "ʅHH"pI0 :HHHH"hHHHH"h"ʅHH"pI08pIN H"hH"hHHHH+""{i+;ik@  ;8[iͯϩթ{iцd"pIH"h%>{iH "" )H"{i+;ik ;8[iHHHH0"h3# ` HH""{i+k ;8[i{iH"h{iH{iH"{iH{iH"HHiH "h{iHHH"HH""HHHH0"h3# ` HH"" HHHH" "HH"""{i+k  Messages reus le  mW____ _A_f_44  A)?V__ _ ( *+%_)*.(=_K_OR\_`ejn}_hFTT7q:q=o@oCmFmUbTTUTT_U&UUUTU s2M(U$c$oTx"""''$ "$l ""TT$["w"""K"UU(&$   3 8X"p$U&&(((&"("G=& & * / / 1 3 5 7 9 ; = ? A C E G I K M O Q S U W Y [ ] ~ W _ T T T T W _ T T T T T T  T T  $ T) TO TS Te Tj Tn   T &   T T T  & T T     &   T T T   T T T T$ T3 8 $< TA TE H K &S  \ Tn Ts T|   T T T T T  $ T T T T T  " T T c T T T  * TI TN TV Tm  w T T T   T T T T T T _ s8 *e  {  _ _ _ NY    _ TTv_y_'v_*v_-T2T>_VYek twz}W_TTTT`TT_0_6T;TBv_Ky_Tv_Wv_ZT_Tk_rTwTTT_TT__CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN /6 ,@ MiniCom2 6 ;8[i!//,,{iH"{iH{iH!"l**''{iH"{iH{iH!"4%%""{iH"{iH{iH!"  {iH"{iH{iH!"{iH"{iH{iH!"{iH"{iH{iH!"T{iH"{iH{iH!"    {iH"{iH{iH!"{iH"{iH{iH!"{iH"{iH{iH!"t{iH"{iH{iH!"<{iH"{iH{iH!"{iH"{iH{iH!" ‚ ‚ ‚  {}ɈɉɍOɎɏɐɑɔGɕəɝɞɟg HH{iH!"{i+;ik *)(*KcHiHuHeCiCoCuCeCaAuAeAaBe ;8[iHH("HH"HH "dddd dHHHԿԽ"hïi H "i ť i i" i' "h("h8pI% H "Ņ"h:i) H "I)"hɥi iHHHԿԽ"h "h8pI0::"h2 8pIF Ţ eH{iH"8pI0HH"pI%{ {iHH"h{iH {iH"eH{iH"HH"pI08pI%b o o {iHH"h{iHb b {iH"eH{iH"8PpI0 _ HH""{i+k Fin  page  ==> page `  ;8[iJ J H H F F {iH"{iH"{i+k  ;8[i8pI    {iHH"h{iH {iH"{iH{iH"H{iHY"h߯8pI0t )8pIP )8pI0* e)ɥ{8 e)  {eH"7{iH e)H"h{iH" e)ɥ_I(<""""," ""%II% "߂C{i+k /^ O. K. / Annuler  pages du Minitel. Ce texte prendra  60/ ;8[i{iH  "  d   P 2 {iH{iH{iH "I>{iH{iH"{iH" "{iH"HHHHiH "hHH"H"HH""3#۩ HHHH0"h`{iHHH"" HHHH" ""{i+k Choisissez le fichier lire ;8[i{iH"h{iH{iH!"{iH{iH"h{iH"hh{iH{iH!". 8pI0()  0 ""{iH{iH"{iH!"HHiH "h""HH"h(HHHH0"hHH"h(HHHH0"hHH(""{i+k.00MsTel. ;8[i% IH""{i+;ik ;8[iH"hٯoeم"h88pIX{iHoH8 HoeHiHJ"{iHU"oeم{iHoH8 H٩"heHiHJ"HH"hՆׯHH"{iHU"oHH:""HH"{iHU"oHH:""eُoHH:"|"HH"oHH:"|"բ"{i+;ik ;8[i8pI'H0"h{iHo8H8 HoeHi HJ"HH"hنۯHH"{iHU"o8HH:"|"HH"{iHU"o8HH:"|"٢"8{i+k ;8[i8pI{iHH8 HHi HJ"HH"hۆݯHH"{iHU"HH:"|"HH"{iHU"HH:"|"ۢ"{i+k ;8[iIe"h"$)  " "I ""I ""2{iH"{iH" "y "o"b{iH"h{iH"";k   7 ; {i+k   ;8[iG"HH"HH "3"HH"HH "{iH"{iH"{iH"{iH"*3"{i+kBEBD ;8[iI`"HH"HH ""H"h"*3"N"HH"HH ""3"{i+k ;8[i{iH"{iH{iH"H{iHY"hn~~{iH"h{iH{iH"{iH!"H" "{i+k Le / ^ Annuler / Effacer dition !  en cours d' ,60/ Attention ! Vous allez effacer le texte ;8[i{iHHH!"H"hHH"h߆HH" ""H{iH"hr8H :"{iH"ߢ""ݢ"{i+;ik ;8[iHH"h݆ߩ H"h_&  ]  ,"E,"8!l @{i+k ;8[i H HH"HH"{i+k ;8[iHH{iH"h{iH"HH{iH"h{iH"HH{iH "h{iH"HH{iH "h{iH"HH{iH7"h{iH"HH{iH8"h{iH"HH{iH9"h{iH"HH{iH:"h{iH"HH{iH;"h{iH"HH{iH<"h{iH"HHHH0"hH("{i+k ;8[i{iHHH"hHiH{iH!"HiH"{i+ ;i k ;8[i " " "  "  "7 "8 "9 "HH{iH": "HH {iH"; "HH){iH"< "HH+{iH"{i+k ;8[iH""HH"""HH ""{i+k ;8[i H HH"{i+k ;8[iH"{i+k ;8[i H HH "J"{iHJ"H{iH"HH""{i+k ;8[iHH"hH" H"h+XHH "=,"0 |{i+k ;8[i"gHH"h"EB?"85"%%"%%""""""""3"*3""Ii 3"HHHH0"hH("HHHH0"hH("q 3""HHHH0"hH("HHHH0"hH("""""8x40p j%H`#######%%%%%%j#####M$P$;%B%%%I%%%%%%%#%###$ $F$%%%%%%%%%%%%c# ,"{i+kMessages MinitelMessages Minitel ;8[i)))){iH"{iH!")))){iH"{iH!")))){iH"{iH!")))){iH"{iH!" ) ) ) ){iH"{iH!")))){iH"{iH!"))))){iH"{iH!"(((({iH"{iH!"(((({iH"{iH!"(((({iH"{iH!"(((({iH"{iH!"(((({iH"{iH!"(((({iH"{iH!"(({iH"{iH!"{i+k 00N40NXDXE9h9gHFEDCBA ;8[i{iHHH"{iH""{i+;ik ;8[i{iHHH"T* )8pI0i{iH{iHi)H"h{iH{iH"{iH{iH"{iH""{i+;ik ;8[iIHH"HH "HH"h(HHHH0"hH("HH"h(HHHH0"hH(""{i+k ;8[iHH"HH ""HH"h(HHHH0"hH("HH"h(HHHH0"hH("{i+k ;8[i&"傂""""""""|"o"b""Q"H"h"8""H"h0000{iH7"h{iH{iH"{iH{iH!"{iH"{iH"h{iH"{iH8"h{iH"x{iH"h{iH"S{iH "h{iH".{iHHH"h{iH"{iHHH)"h{iH"{iHHH "h{iH"{iHHH+"h{iH"z"s"lI""PnhS >',1G.5Q    L{s(*Y {i+k ;8[iH"h"="6"/"(!  "#HHP"pI"P"{i+k ;8[i H HH"HH"{i+k ;8[iH""{i+k ;8[i H HH"HH"{i+k ;8[iH""{i+k ;8[i 222222 22"2222 J{i+k-- pageEnvoi en ligne Essai local ;8[iHHiH "hݭ߆{iH' "{iHHiH"{iH{iH"?4?4{iH{iH"{iH{iH"{iH{iH"HH{iH"HH"{i+k9/ ;8[iH"h{iH"h{iH"H "HH "h{i+k ;8[i{iH55"3#HH"h "H{iH ""{e3#  HH"{i+kCergyD ;8[i"H"hHHHHH"h """""""66"""""""I"""iH"iH"iH"iH""{i+kMiniStel//,,.GN*Q*T'W'f%%""  '.147F_filo~    &?FILO^w~>TCTO_STXT]lQaTfTr_UUU .TTU          " + a TT UU__UU u.x.UUUU__   U     )-.0.CJUNUSUZ___h Uo o U b b .. _ _B .TF TK TW _ J  J  H  H  F  F . ; ] Uk  n  q  t  w z  U         _ .T* .S .| . U .  .   .0 FTE I 6L 6O Y ] W` Wc Mg FTy }   M FT   U W W M9 < B  _   _  _  _ dZbZW0_6T;T?TDTI| M^ZR VT[Tg_{__TT__>k Yok d""  _ _".WG_\_i_ov__________R=hCFTRTae_VVl VVVVVVV__V"V'V9V>VCVQl ZVj_w___VVV____VVV__!V(V,V1V6VB_P_TYe_iVnVsV___V_VVVV VV"_/_9>J_^_bVgVoV{____VVV___VVV*V/V8V=VM_Z_diu__VV____VV___V&U>$YC"YG~ O.YZFTf z6}6WWFTWW FTxxFTOO%),/2DSY~$B $EE_$#E*.8E<?BETaehkn}_FTB FTEE[ M$_-B 1FT7;EELPZE^adMu__ ~ ~k 37U:UIPUSUt__*_3RY7PYB_O_\_p_______4Y6Yf_  Y Y_&FY3f_<f_BV]"Yo_|_f_4Y6Y_VV_VV_)V-VC$RyVVZVp$yVV$yVV$yVV$y VV$$3y7V;VQ$`ydVhV~$yVV$yVV$yVV__0V4V<XjN_ " & * : yN R V f yz ~   y    y V V V   A  V V!_! !V!!V!V)!_3!_M!_S!VW!Vb!_z!V}!V!=!!=!!A!_!V!V!_!V!V!V!V!V!V!V!V!_"V "_#"V&"VD"_G"VK"VV"_"_"V"V"V"V"!"!"A"4Y"6Y"f_" Y" Y"_"V"V"_"f_"_+#f_9#4Y?#6YV#2Y[#0Ye#u#_z#### #(#L_#p# _# _#%#%##^#^#%#%## Y##1#L #$$$U$U)$_2$UB$_H$R$Uc$Us$_x$|$$_$_$$$_$_$U$_$$$M$$$_ %_%%%%_3%_6%=%m!D% K%a"e%j%j%#l%#n%#p%#r%#t%#v%#x%%z%%|%%~%%%%%%%j#%#%#%#%#%M$%P$%;%%B%%%%%%I%%%%%%%%%%%%%%#%%%#%#%#%$% $%F$%%%%%%%%%%%%%%%%%%%%%%%%%c#%_&)&) &)#&)2&6&69&6H&L&)O&)R&)U&)d&h&xk&xz&~&)&)&)&)&&&&&)&)&)&)&&p&p&& )& )& )& )&&''')')')'),'0'3'B'F')J'OM')P')S')V')e'i'Wl'W{''('('('('''''('('('('''''('('('(''((((((((((-(1(4(C(G((J((M((P((_(c(f(u(y((|((((((((((((((((.(.(=)J)N)6Q)6T)))T*))*1*5*68*6;*b*Us*Uy*}**E***E*_*****_*_*_**+++_#+_&+>+UI+UO+S+]+Ed+h+r+Ev+y+|+M+_+++++_+_+_+++++_,_,FYI,1+U,xX,x[,b,We,Wh,o,6r,6u,y,,O,O,,,,,,p,p,,,,,,,,.,.,,,,[,,,,,,,,[-00 -00-$8-Q-^-m)t-$-m)-$-m)-$-m)-$-m)....m)/.3.=.L.m)\.`.j.y.m)....m)...U.U*.1+B04YH06YO0 YR0 Y\0_g0>n0I#u0|0 ,0$0& 0$0T0T0 0B 0TY0B 1_1#1.1_1151@1_X1[1^1 1a1 1l1Ap1 1_111_111_111{11{11A1I1222  2 22TY2FT2$2U2($2&*2W02W62 W<2 WB2WH2WN2WT2WW22[2iT^22b2kTe22i2mTl22p2oTs22w2qTz22~2sT2HT2HT22222222T222T222T222T2T2T2$2V2V2V2V3W(3_-3 03"33 63"S3 V3"y3_|3 3"333?43?433 4"4&4"*4 54_W4_[4g42m4p4444_444_4454544_ 5_"5_35_u5_515_5W5W5W5W5_5W5W5_5_5B4545 &55i 55656566K1 61 6u6_6U*6TY-62016*5696WH6_K6WZ6_]6Wl6_o6W~6_6TCDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# ,@ ~Global CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# $4,<:IEUGWM]O_CL\& ,@ PrUnit & ;8[i{iHHH"HH{iH"ݢ)8pI0i)[ݨ ݨ yݨ lݨ _ݨ Rݨ^ Eݨ 8@\^{|}~ ݂P{i+;ik ;8[iid id& id id id$ {i+;ik ;8[i{iHHH"dٯע)8pI0٥ii蝹 i) :۩8pI0i ٥ۂ:٥i)^i)~٥i i)H "i. i)i@ i@ i\ i{ i| i} " " "} "i% P; []`ɇ$ɍ-Ɏ6ɏPɝ7 ׂ٢ HH{iH"ע)8pI0٥ii蝹 i)^i)~٥i i)fi@ i ti ci Ri Ai 0@\{|} ׂ٢ HH{iH"!80 H`hhh {i+;ik ;8[iid id& id id id$ {i+;ik ;8[i$id idZ id id id id idZ id id id idD id id id idZ id id {i+;ik ;8[iid id id {i+  ;ik ;8[i{iHHH"d٩ע)8pI0T٥ii蝹 i) :۩8pI0i ٥ۂ:٥i)ݥ݂i i{ i} ^e "~e "ti@ c^a "R~a "A^i "0~i "^o "~o "i| i\ ^u "~u "i[ i] # "@ "{[ "m\ "_] "Q{ "C} "5| "'^ "[ "  H "i. #D@J[P\V]\^{Z|n}XɈɉ(Ɋ1ɍɎɏɐɑɔɕə$ɚ-ɝ6ɞPɟYɡbɤkB ׂ٢ HH{iH"{i+;ik ;8[i {iHHiH"ۅߥׅ8"zI;iPٯHiH{iH"{i+k ;8[iAA"0{iH"8oI"HHH "hCHHHH"hHH" "{i+kPRINTER: ;8[i "KHH"HH"HH""{i+k ;8[i""v"""L""  "E"*"q"" "A"3"T"""Z""""D"""0"a"0"0"a"1"0"a"2""Z"""""(O>`4x*   {i+k20000 ;8[iI{iH{iH"h{iH"hh{iH{iH!"+{iH"h{iH{iH!"S{iH"h{iH{iH"{iH{iH"+{iH""h{iH{iH"{iHH"h{iH{iH{iH"h{iH{iH{iH"h{iH{iHH"h{iH{iH"{iH{iH"a{iH""""""IcoH:"{iH"H"hiH:""{i+k page Fichier: ;8[i"8pI "IB8pI0HH"HH""{i+k ;8[iA" ""{i+kPRINTER: ;8[iH"h"hݥ)ݥ݅{i+;ik ;8[iH"h"hݥ)ݥ݅{i+;ik ;8[i"hɆdddץͥϥiH "h i) [i H"h8թ8pI$ϥi թ8pI0I+i)H "iׯ8pIׅق٥i) 88:8pIi) =i Ϣ HH{iH"͏hH "hrrH "H "hRRH "*ͥϥiH "h : i) i Ϣ HH{iH"͏H "h22H "{H "hH "M:ͥ:ϥi)H "Ϣ HH{iH"͏{i+  ;ik  x ;8[i{iHHH"F/"8pI0/"e{iHH"h{iH"{iH{iH"h{iH""H"hiH:"{iHH"h{iH{iH{iH"h{iH{iH"{iH"IF/"8pI0/"e{iHH"h{iH"{iH{iH"h{iH""H"hiH:"{iHH"h{iH{iH{iH"h{iH{iH"{iH"{i+;ik ;8[iHHH "hHH ""JV HHH "h{i+k ;8[i H HH"{i+k ;8[i H{i+k ;8[iHH{iHH"h{iH"HH{iHH"h{iH"HH {iHH"h{iH"HH {iHH"h{iH"1HH "HH".HH "HH" 1HH"HH".HH"HH"HH"HH"HH"HH"HH"HH"HH"HH"HH"HH"`HH"HH"HH" ` {i+k ;8[iH{iHHH"h{iH"hH{iHHH"h{iH"hH{iHHH "h{iH"hH{iHHH "h{iH"hHHH "h HHH"h HHH"h HHH"h HHH"hHHH"hHHH"h{i+k ;8[iHH"h&߯"B߂#"-#"" {i+k ;8[iHH"h߆ H"h2g"`  "F,"8! k{i+k ;8[idH""HH""HH "{i+;ik5'L_ ^ !!!L_!chhh.L_L_  =  =  =  =  =  = * = ; = n =  =          - !4 7 @  j  n_ l_   \_L_n_ l_JbL_n4_q4_}AAG_r_t_p_n_l_p_p_n_l__ h_j_j_h_+_6_WL_c4_f4_ipj_uh__j_h__n_l___`_^_L_^U4_4_ 4_4_4_"4_%b/4_24_5?4_B4_EILR4_U4_X\T_n4_q4_t~4_4_T_4_4_4_4_4_4_bP_4_4_4_4_P_4_4_ 4_4_4_"4_%/4_24_5?4_B4_EO4_R4_U_4_b4_eo4_r4_u4_4_4_4_4_4_R_4_4_4_4_4_4_R_4_4_4_ 4_ 4_4_!R_34_64_9C4_F4_IS4_V4_Yc4_f4_is4_v4_y4_4_4_4_4_4_b^J^T_N_N_N_N_%`_*`_.0_L ad|._ _ _4AZ_F^^a^p`_ L_4_ 4_ 4_4_b$4_'4_*.4_14_4b8;A4_D4_GK4_N4_QbX^_\L_rt_~__t_l __^_L_`_4_4_ $L_7`_Ej_Jh_V_Zj__h_q_uL_^4_4_G4_4_^4_4_   s   N!V_( /V_lJ_ X_X_N_Z_IO2_`grjrs NRR N2_*1242= MNTW`  2_J_^_^^_^_ ^_\_#^/3L_HZ_M_4_b4_e{4_4_4_4_bt_^_l _Z_#_'J_6^_G^SW^_\^_`^_e\_x^L_Z_4_4_ 4_4_4_4_bt_^_l _#Z_(I dx_W_l_n_n_l__n_l_n_l_!+r_2p_M_Sd_Xb_d_Z_X_V_\_T_0_._P_R_d_b_Z_ yd_ b_ X_  ( y, d_1 b_B V_G  V yZ d__ b_p \_u   y P_ d_ b_ E d_ b_ E d_ b_ E d_ b_ E T_!d_!b_!E!d_!b_)!E3!d_8!b_C!EJ!d_O!b_Z!E^!0_m!d_r!b_}!E!d_!b_!E!._!d_!b_!E!d_!b_!E!R_!d_!b_!E!d_!b_ "E"d_"b_ "E*"d_/"b_:"EA"d_F"b_Q"EX"d_]"b_h"Er"d_w"b_"E"d_"b_"E"d_"b_"E"d_"b_"##Z_!#d_&#b_1#@#E#X_S#d_X#b_c#r#w#V_#d_#b_###\_#d_#b_##P_#P_#d_#b_##T_$T_ $d_$b_$,$0_6$0_;$d_@$b_K$[$._e$._j$d_o$b_z$$R_$d_$b_$$R_$d_$b_$$R_$_$FY%BY%b_%d_$%"+%f_5%f_<%p@%~%_%4Y%6Y%f_% Y% Y%_%$%"Y%"%f_%_&&f_5&4Y<&6YV&b_Y&b_\&=_&=h&Al&p&d_u&b_&_&h%&d_&b_&_CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# $4,<6. ,@ runtime 6.H;i{HH ;[ H H"hHHH "hhH "HHHH "hhe: kHH ;[HH"HH" HH"d&)H "h "ԯH"8k"HH"h"kHH"k0;8 ;[H"h#H({iH "h%)))XHH "h: ) )d   +;i08k ;[@ZZH"h""""":""+hk "k ;[   :T+  ;i k ;[ ( ) e:e::D+  ;i k ;[   :0 )   h)+H   ;i(k HH;[H"h H "    hh+;ik ;[HH""+;ik ;[0  +  ;i k ;[0  +  ;i k ;[0   +  ;ik ;[  Ȁ +  ;ik ;[  Ȁ +  ;ik ;8 [  d) e )e     ;e i ;[907301 )80'e     +  ;ikHH ;[ d0b) W  gF @ e )e)8 0  ):  +;ik HH;[ F0D @0>)8 04  8 8  e :e   hh+  ;ik H;[d 8 2 )    8 ) h+  ;ik {cH;[hh+hk {cH;[ JJJ -)0 0 0 0 0 0 0  hh+hhk {cH;[  :JJJ 1)0 0 0 0 0 0 0  hh+;ik{cH ;[ +;ik{cH ;[ I7+;ik{cH ;[ 7+;ik ;[   (+;i (k ;[I7   (+;i (k ;[ I7  (+;i (k ;[ jjjjjjjj +;ik ;[JJJ+)0 0 0 0 0 0 0 7    (+;i(k H;[IIʩ FeI+k H;[ I Iʀ f  8 F F I+kcck8k H;[IIIIʀFf ee&IIhhhh+k H;[ I I IIʀ&&ff !  8  FfFfͥ  IIzzzzzz+kIIkIIk##kkCCkIIk8 # zz(k *kJjkjjjk***k;8 ;[  {iH "{iH{i H " +;ik;8 ;[  {iH "{iH{i H " +;ikHHH ;[ HHHHH &"  Ȁ8: ))e:  +  ;ikHHH ;[H HHH HH '"  Ȁ 8: ))e:  +  ;i k;8% ;[$ &{i$H{i+H{iH  "{i$H{iH1H/H "+'+&*;i)k ;[HHH)H ("h +;ik ;[HHHH)H )"h h +;ik;8& ;[.H,H{iH{iH{iH "{iH2H0H  "+(,'+;i*k ;[ )  +  ;ik ;[   +  ;ikHHH ;[ )f A [8Ai a {8ai 80))  J ) J) +  ;i k ;[HHHH "hhhh+k ;[HHH"hhh+k ;[HHH3"hhh+k ;[HHHH"hhhh+k ;[HHHH+"hhhh+k ;[HHHH $"hhhh+  ;ik ;[H  HH"+ ;i k ;[HHHH  "hhhh+  ;ik ;[HHHH  "hhhh+  ;ik ;[HHH "hhh+k ;[HHH "hhh+k ;[HHH "hhh+k ;[HHH "hhh+kHH;iHHHHHڢ "hhk    h:h<Z"<H:HkHHHH "hk ;[  "ኇ+ ;i k   ;[Z z Z"+hhhk . &     ;[Z z Z"+hhk ;[ ڢ "+  ;ik ;[  "+  ;ik   ڢ "+  ;ik ;[ " +hhk;iHHHڢ "ኃhhk ;[d  +hhk ;[ȗȥ @ȩ+hkH "hk ;[ "  +hhkHH "hhkH "hk;iH "hk "  k H H H H "(p0   ;ik;8  ;[dd\:"hi ) a{8     + ;ik;8 ;[$&{iH"` V$&") d d dd{iH"$&{iH"(+$#;i"k;8$ ;[HH,*"hH,*."h222202 2 2 22 2.)dHHH" "h!#%#2%2# {iH" 22+&2%1;i0k;8 ;[$$F$dd{iH"$$$$$ $$ + $#;i"k;8( ;[HH0."h! " "888868 8 8 88 84)AHHH" "h!#!%!'%8'8 88H0.4"h)8)88868 8 8 88 84)_HHH" "h!#!%!'%8'8) {iH" 882)8dd{iH"+*8)7;i6k;8 ;[  & dd{iH"   + ;ik;8 ;[$$@${iH"$$HH""+ $#;i"k;8 ;[$& " {iH"+$#;i"k;8 ;[ "{iH"+ ;ikk;8 ;[  ; $& d {iH"L  +$#;i"k;8 ;[  ; $& d {iH"L  +$#;i"k;8 ;[$$m$HHHH$H" "hh {iH"#{iH"{iH"+$#;i"k;8 ;[  1 {iH" H"zz$&+ ;ik ;[) +;ik;8 ;[$$$$$) d {iH"L $+ $#;i"k;8  ;[&&& d {iH"!&&  &!L &+"&!%;i$k ;[) +;ik ;[ HH"+;ik ;[ HH"+;ikHH ;[   ȥ  "+ ;i kHH ;[  )   "+;ikHH ;[  hjȯlceȯg  "+ ;i kTRUEFALSEHHHHH ;[HHHHH &"  Ȁ 8 : ) )e:   "+  ;ikHHHHH ;[HHHH HH '"  Ȁ 8 : ) )e:   "+  ;ik;8) ;[//3 (3*(5 *{i(H9H7H{iH "{i(H{iHHH "5/1"++7*6;i5k;8) ;[//3 (3*(5*{i(H{i7H{iH  "{i(H{iHHH "5/1"++7*6;i5k;8) ;[//3 (3*(5 *{i(H9H7H{iH  "{i(H{iHHH "5/1"++7*6;i5kHZHH ;[ 80,* )e)     HH"% }ȷ~ȷ HH"[+kHH ;[   ") "+  ;ikHH ;[   "  ) "+ ;i kHHHH ;[":e   Ȁ :    +  ;ikHH ;[   "%HHeHژ8 ("h "+ ;i kHH ;[   " ,HHHeHژ8 )"hh "+ ;i k;8* ;[0002"LHH{iH{i H{i H "{i H6H4H "02"+,4+3;i*k;8* ;[0002"LHH{iH{i H{i H "{i H6H4H  "02"+,4+3;i*k;8* ;[0002"LHH{iH{i H{i H "{i H6H4H  "02"+,4+3;i*kZHH ;[ "N)   Ș "Ȁػȷ)  Ȁ阠+hhhhkZ ;[ )? HH"% MȷNȷO HH"++kZ ;[ ) )   +k;8 ;[d)  : )) H"h{i H)"{i H "H{i H{i HO"h)HH:" HH")j{i H)"H i H:" @HHg"{i HHH H H~"h"H 8 H:"HH "h)5HH "h)!HH ") rr "+;ik;8< ;[BB)) H"h{i H)"{i1H "H{i H{i1HO"h)HH:"d{i H)"  i{iHV"᩼ {iHV"᩼ H({iH "hХ ɥ) {iHU" H i H:"႑v8pI9) {i H)"H H"8hH H:" 8 i{iHU"H"  B5 HHg"{i1HHH H H~"h"H 8 H:"Ⴋd;HHH "hhh=H ""h9) 4;Ȅ;  "= "BN&; " " ";;Ȅ;  9 ";f) B +>B=A;i@k;8 ;[d)  : HH " " +;ikPRINTER: CONSOLE: KEYBOARD:  _&2JQg____G+0@_g_l_sv__#_0 3 djru___&'AaGb___<_j____Z____ _-l --_!__Wh-o-?!F_n__'_[_n__!_@___ __Or@"@"h$j,l4c:eBgP@"@"k @"!@"!@"-"@"">"""""""""u&"&#u&6#&c#u&#%#&$$%_$&$%$&%%c%&%%%& &u&G&u&&&&&&&&&&V(u(Y(u(c(_z('((T,_,),,-_ .-.'2.)CDACSEGDEFPROCDSEG~globalJ LONGGLOBALSNDA STACKSIZEU TOOLERRORCHK_PASMAIN  _PASBLKMOVE STATICUNIVTOOLUSERTOOLGSOSFORWARDEXTERNALINLINE.p.o.p.o.p.o%B0PpXʈ"TDbH KZh+(z@k`8x۪[{;Bieugwm}oc)%5'7-=/?# $4,<   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh- A propos...Retour..-SauverCouper @ " vpHome Line P ?)(R 'ions+p leCode*GS 6Rtel1l2RTel2S 6. LX^SommaireNPseudov+p6 rp7Rtel1Rtel2l1Rtel2SauverRtel2 2New Item?J 3> '2'V2 mon Pseudo2 Mfa0Copier L`0  OK P,( O r+p 83p@ p 9Annuler INSTRUCTIONS textTexte diter.*GS 6 @6CodeLocalRTel2RTel2MM Minitel  Envoi Texte Fichier Envoi 4mn CollerEffacerFermerQuitter`XrNew ItemTexte transmis:FpT p :FtTp <3v@p ; ]8o> New Menu \xo=  Vr8JU8'V2Suiten3T>'2OO PP@ 2=8ENVOINt#Edition FIN connex. Ouvrir... SS GuideRgler page...Imprimer SS@ EMISSION  Edition Sauver en ... @  Statut ModemJLRFCBPseudo : ! e %5$>oJLRFCBEnvoi 4 :me EnregistrerLocal??@elLocal Configurationxte@s &H"Qm Correction !"#$%&RetourJLRFCBCode secret : Schma cblen 3ne>I8 Annulation%8 &18 Connexion?J Option 1 Rptitionion8  RECEPTION `ZrSommaire3> *Ecr*Ecr V'*Ecration EnregistrerP -,p 3V>Envoi 4Envoi 4ne CorrectionLZ^ RptitiontonXr< ConnexionAnnuleronLV:Pseudo Annulation@K:LL@@4?:':(3:u8"Envoi 2ne:w8! Envoi imageEnvoi 1?TJ0x/ JMODEM INTROUVABLE ! JSlectionnez le Modem en Port 1 ou Port 2 dans le Control Panel. Puis redmarrez le GS. /^#6 IIGS /^#6Z+Vp Envoi 2Effacer le texte  Z Enregistrer<:!'f|&P @r  Systems, Inc. /^#0 " *k Envoi 3rerZ$u8"t:#Envoi 5Envoi 6LineXp tXp9 V& V&(tXp$)Xp ;*8/(:! FIN connex. uVp:xVp+    8)(:A+Vp <    Vp,Pt#?VJ0:/JLRFCBEnvoi 1 : #5 >W      *+     JLRFCBEnvoi 2 $I SUJLRFCBEnvoi 3 :JLRFCBEnvoi 2 :FCBP|'pt'()3# *~7~0c?y=y?`00clb0f I8'nGgӌf `ot6y6y<76 q<l0x=700a?yټc63=ǝm}AFFFFKKKKKQSVVVVV[_ccccccccciiiiiiiiiiiiiqqqqqqqqqv{}       / JSMiniStel SVersion 0.6 Copyright 1992 Jean DESTELLE Tous droits rservs Certain portions of this software are copyrighted by TML Systems, Inc. /^#0P hn (oPH~ | | ( 1? |? |???????????8??:????8:??????$YYggss1:ToolInterfaces:WINDOWS.p.o}jjCONTROLSNGr  Y pU?~aPt"3V>i nTF?Ko@T ! ,[Bo  ( > k , x  1    G |   *h y & IJV08FFn LJdd L1 P@s} ((,{ Z   2 @  L ~   , r2Pn   )  2Ig     Z       c J  X   e     C !h """#("$"% "&x "'P@(w)9 *Y+) G U 5   t A_fnu    +   9   )  q 0  ;         > - .)0H*  O M          J  ( < j    !"#$%P & '* ( ) *z +S,U /S034567 8x9:;<=>?a@ O   " &    "     0 J   2    +  a      -    A        - . 0 F "  ' # =1 #  #nPPP PP{  n XXH@uGp|xMINISTEL INSTRUCTIONS D'EMPLOI ================================ RESERVES LEGALES Ministel est un logiciel crit par Jean Destelle en Pascal TML II. Certaines parties sont couvertes par le copyright de TML Inc. Il est distribu en "freeware" c'est dire gratuitement titre amical pour les usagers franais de l'Apple II GS. Vous avez le droit de l'employer librement pour votre usage personnel, et d'en donner ventuellement une copie non modifie un ami. Mais vous n'avez pas le droit de le vendre, ni de le modifier avant de le donner, ni d'en copier des lments pour les insrer dans un logiciel distribu de faon onreuse, ou dans toute publication. Tous les droits commerciaux de copyright et autres sont rservs l'auteur. L'auteur dgage toute responsabilit sur les consquences ventuelles d'un emploi de ce logiciel. Si Ministel vous plait, soyez assez gentil pour en informer l'auteur, par l'intermdiaire de RTel. Merci d'avance. PRESENTATION Ministel est un logiciel destin faciliter la communication entre un Apple IIGS et les serveurs accessibles par le Minitel. Il permet de recevoir des textes, de les trater, de les sauver sur disque ou de les imprimer. De mme il permet de charger des textes partir d'un disque ou du presse-papier du GS, de les diter, et de les envoyer en ligne vers le Minitel en les dcoupant en pages de la dimension voulue. Pour simplifier, il se sert du Minitel comme Modem. Il utilise aussi le Minitel comme cran normal d'affichage des textes et des images, et le GS comme organe de commande, de rception, de tratement et d'mission des textes. De nombreuses fonctions permettent d'acclrer le processus, et d'conomiser des minutes de communication. BRANCHEMENTS. Pratiquement, l'cran du Minitel doit se trouver ct de celui du GS. L'un des ports srie du GS doit tre reli l'entre "terminal" du Minitel par un cble direct du type GS-Minitel ou Mac Minitel. La configuration du Modem est rgle une fois pour toutes par le tableau de bord du GS. Il faut les rglages suivants: Parity: even (parit paire); Bauds: 1200; Line length: illimite. Data/stop : 7-1; Add LF after CR: oui; Buffering: oui; Xon-Xoff handshake: oui; les autres options: non; Le logiciel a t dvelopp et utilis avec un Minitel 1. En principe il doit convenir aux Minitels des types ultrieurs. CONFIGURATION DE L'ORDINATEUR. Ministel fonctionne au mieux avec un GS quip d'un disque dur, mais ce n'est pas indispensable. Il faut au moins 1,5 MgaB de mmoire vive, mais c'est mieux si vous en avez plus. Le systme minimal est le 5.04. Dans cette version, l'impression prvoit l'emploi d'une ImageWriter II en mode direct. C'est la solution qui donne le maximum de rapidit. Mais elle peut se faire sur une autre imprimante, dont il vous faudra peut-tre modifier les rglages initiaux. MISE EN ROUTE. D'abord, copiez Ministel dans votre disque dur ou sur une diskette de travail dans un fichier particulier (le nom importe peu), et conservez soigneusement l'original. Ce logiciel ne peut en effet travailler que si le disque n'est pas protg en criture. Toute modification des donnes de configuration est automatiquement transcrite dans les ressources du logiciel. Donc, ds que vous vous serez servi du disque d'origine le fichier du programme sera forcment modifi. En particulier, vos codes secrets y seront inscrits. Soyez donc prudent ds le dpart ! Assurez-vous que le cble GS-Minitel est bien en place. Allumez le Minitel, puis lancez le programme au moyen du Finder, au d'un slecteur comme Prosel 16 ou Slect. Vous vous trouvez devant un "deskTop" classique. Il comporte deux fentres d'aspect similaire: une fentre "Rception" et une fentre "Emission". Chaque fentre dispose d'un certain nombre de boutons de commandes mulant le Minitel et permettant d'envoyer des messages de commandes personnaliss. La plupart de ces boutons ont la mme fonction sur les deux fentres. De plus, chaque fentre comporte un diteur de texte propre, rserv soit la rception du texte soit l'mission. Avant de vous connecter votre serveur favori, il est indispensable de savoir un peu comment votre logiciel fonctionne. LES MODES DE FONCTIONNEMENT Le logiciel peut travailler en mode "Emulation", "Local", "Enregistrement" ou "Edition". Certain de ces modes sont compatibles les uns avec les autres. Le mode EMULATION. Le Minitel ayant t allum, le Modem pralablement configur, sa mise en route, Ministel se trouve en mode "mulation": le clavier du GS et les clicks dans les boutons de la fentre agissent sur le Minitel comme si on actionnait ses propres boutons. "Suite" s'obtient aussi avec la touche "Return" et "Envoi" avec la touche "Enter" du pav numrique. La correction des erreurs se fait par les touche <-- ou Delete. Le GS devient en fait un "terminal" pour le Minitel. Mais l'affichage ne se fait que sur l'cran du Minitel, avec seulement un rappel sommaire au bas gauche de la fentre du GS, sous le cadre de l'diteur, qui vous permet de vrifier les entres du clavier du GS. C'est le mode normal de travail en ligne pour les communications. Tant qu'on n'a pas fait le numro d'appel et actionn le bouton "connexion", la transmission se limite l'envoi des donnes vers le Minitel . Des boutons spcialiss permettent d'envoyer des messages (commandes vers les serveurs, ou donnes attendues). Par exemple, le bouton "RTel2" envoie la commande qui slectionnera, le service RTEL2. Elle quivaut "Rtel2" suivi de "Envoi". Si vous actionnez ce bouton vous devez voir s'crire l'ordre "Rtel2" sur l'cran du Minitel. Mais vous remarquerez que la transmission semble assez lente. C'est voulu. En mode mulation, les "critures" se font la vitesse de transmission de 75 Bauds (soit 7,5 caractres/sec. Alors qu'en "lecture", les textes arrivent 1200 Bauds (soit 120 caractres/sec.) Cel parce que, en principe, les textes sont dactylographis en direct, donc pas trs vite. Vous disposez aussi de 4 lignes ditables tout moment, que vous pouvez transmettre, suivis automatiquement d'un ordre "envoi" en actionnant les boutons rectangulaires ombrs marqus "Envoi 1",... "Envoi 4". Le Mode "LOCAL". Ministel dispose d'un mode "Local" dans lequel la transmission vers le Minitel est acclre afin de permettre des contrles rapides avant l'envoi de textes longs. La bote cocher "Local" permet de passer dans ce mode, et d'en ressortir. Si "Local" est coch, vos donnes ne transitent pas sur la ligne tlephonique, mme si vous tes "connect". Le Mode "ENREGISTREMENT". Il permet, lors de la rception d'une transmission de faire entrer le texte reu dans le tratement de texte de la fentre "Rception". Cette entre s'effectue non de faon continue, mais par paquets de deux lignes environ, avec un lger retard par rapport la rception que vous pouvez suivre sur l'cran du MiniTel. Pour se placer dans ce mode il suffit de cocher la case "Enregistrer" de la fentre. (Remarque: les cases cocher et les principaux boutons des deux fentres "Emission" et "Rception" fonctionnent en "double-commande" c'est dire qu'elles assurent les mmes services.) Pour cesser d'enregistrer, il suffit de cliquer dans la case cocher "Enregistrer", qui devient blanche. Le reste des donnes en attente dans le buffer d'entre est alors vid dans la fentre de tratement de textes. Le Mode EDITION. Si vous cliquez dans le cadre de l'un des tratements de texte, ou dans la case cocher "Edition", vous quittez le mode "Emulation" pour passer en mode "Edition". La case "Edition" se munit alors d'une croix. Vous pouvez alors diter vos textes, de la faon la plus classique. Toutes les fonctions de l'outil "Text-Edit" du GS sont votre disposition: Couper, Coller, Copier..., ainsi que tous les raccourcis claviers habituels. Vous pouvez aussi sauver votre texte sur disque et l'imprimer ( Fonctions "Sauver"en ..." et "Imprimer" du menu "Fichier".) Une fonction spciale "Effacer le texte " du menu "Minitel" permet d'effacer le contenu de l'diteur de textes courant. Pour des raisons videntes, vous avez tout intrt effectuer ces oprations en dehors des priodes de connexion au serveur. Passage d'un mode l'autre. Vous utiliserez surtout les cases cocher. Elles assurent de plus des fonctions de remise en tat du statut du Modem dans certaines circonstances. Il peut arriver en effet qu'un dfaut de transmission ait perturb le statut du Modem. Cliquer deux fois dans l'une de ces cases remettra certainement les choses en place. Vous pouvez aussi utiliser les choix "Enregistrer" ou "Local" du menu "Minitel" , ou encore les raccourcis correspondants: "Pomme-M"( Mmoriser) et "Pomme-L" (Local). CODAGE ET DECODAGE VIDEOTEX. Ministel ne transcode que le texte utile, ditable et imprimable en tant que tel. De ce fait la place prise sur l'cran du GS est rduite lors de l'enregistrement. Certaines informations en provenance du serveur ne sont pas retenues: celles qui concerne les couleurs du texte, ou des images, celles qui dplacent le point d'criture en arrire et celles qui font appel des caractres spciaux de grande taille ou aux caractres graphiques. Cel n'est vraiment utile qu' la lecture, et on peut voir cel sur l'cran du Minitel. Ces "impasses" ont t faites pour conserver la simplicit d'emploi des outils de tratement de texte de la ToolBox du GS. Il peut arriver, si les crans Minitel reus ont t trop bourrs d'astuces par leurs concepteurs, comme c'est le cas pour certains tableaux de chiffres zones colores, que le texte dcod ne prsente pas rigoureusement la mme disposition que le texte vu sur l'cran du Minitel. On pourra corriger les dfauts dans une certaine mesure avec le tratement de texte. Mais seule un transcription de l'image complte de l'cran (ce que ne fait pas Ministel, pourrait reproduire la disposition initiale. Par contre la plupart des finesses du langage franais avec ses caractres spciaux et ses accents sont traduites trs correctement dans les deux sens, dans la mesure o vous disposez d'un systme francis et si les 3 options "Alphabet" du tableau de bord sont sur "Franais". PERSONNALISATION DES COMMANDES Toutes les commandes de Ministel qui ne sont pas spcifiques une fonction du Minitel sont modifiables volont. Ce sont: les 6 boutons arrondis et les deux "line-edits" de chacune des fentres "Emission" et "Reception". Vous devez commencer par les configurer. C'est trs simple. Configuration. Actionnez l'item "Configuration " du menu "Options". Une fentre de choix est ouverte, dans laquelle vous devez crire vos donnes. La configuration-type est celle qui vous permet de communiquer avec le serveur RTel2, ses boites aux lettres, et la rubrique GS. Vous devez indiquer: votre pseudonyme, votre code secret, dans les cases de gauche. Les 4 cases de droite sont celles des 4 boutons arrondis: "RTel2", "*GS 6", us voulez. Ce bouton sert effacer l'cran du Minitel et a la mme fonction que le Home en Basic de l'Apple II. Les 3 autres portent en titre le libell de la commande qui sera envoye. Vous pourrez les modifier votre guise. Mais attention ! Une fois la modification sauve, elle est inscrite dans les ressources de votre programme, et vous la retrouverez au prochain lancement. Les 4 cases "line-edit" marques "Envoi 1, 2, 3, et 4" sont destines recevoir d'autres commandes, votre gr. Si vous les configurez maintenant, le texte crit sera valable ds lors et utilis au moment du lancement du programme tant que vous n'avez pas chang de configuration. Mais, en cours de session, vous pouvez votre guise, placer dans les cases "Envoi 1...4", d'autres textes, et les envoyer. Ils ne seront pas enregistrs en ressources. Tous les boutons et Line-edit ainsi configurs permettront la transmission au modem de la chane de caractres correspondante, suivi d'une commande "Envoi". De plus, le bouton "Pseudo" ajoute un espace devant votre pseudonyme, ce qui vite bien des refus bizarres de la part du serveur RTel. Avant d'aller plus loin, quittez la fentre de configuration par "Annuler", et placez-vous en mode "Local" pour tester l'effet des divers boutons arrondis et des boutons carrs "Envoi 1.." "Envoi 4" qui sont rpartis sur les deux fentres. LECTURE DES MESSAGES ET ENREGISTREMENT . Quand vous tes connect avec un serveur, tous les changes peuvent se faire normalement par le Minitel, dont les commandes continuent d'agir. Mais vous utiliserez plutt le clavier et les commandes de l'cran du GSqui sont plus pratiques. Les textes ne transitent dans l'diteur de la fentre de rception que si vous tes dans le mode "Enregistrement". Enregistrer n'crit pas sur disque, mais dans la mmoire du GS. Avant de dcider d'enregistrer vous pouvez procder en lecture sur l'cran du Minitel. C'est la mthode "riche". Quand une page a retenu votre attention, vous actionnez "Enregistrer" puis "Rptition" puis vous arrtez l'enregistrement en cliquant nouveau la cas cocher "Enregistrer". Mais vous gagnerez du temps (et de l'argent) faire passer les pages rapidement en les enregistrant, puis en les relisant posment hors connexion. Seule prcaution: attendez que sur l'cran du Minitel, la page soit compltement crite avant d'actionner "suite". Sans quoi vous risquez de perdre la fin de la page. L'diteur peut accepter des textes d'une longueur quelconque. Vous ne risquez donc pas de le remplir au del de ses limites. Vous pouvez interrompre et reprendre l'enregistrement pendant la rception. Toutefois, attendez que le transfert du texte dans l'diteur soit achev avant d'arrter l'enregistrement. Quand vous avez termin la rception, il est prfrable d'arrter l'enregistrement pour ne pas charger votre diteur de caractres de commandes sans intrt. SAUVEGARDE DES TEXTES Le choix "Sauver en..." du menu "fichier" permet d'crire votre texte sur disque. Un nom de fichier vous est propos qui comporte la date et un numro d'ordre. Par exemple: "MsTel.20.03.00". Vous le modifiez votre guise et dirigez l'criture vers le dossier de votre choix. Avant de sauver le texte reu vous pouvez le dbarasser de tout ce qui est inutile en slectionnant les parties couper et en les enlevant par "Delete" ou "Pomme-X". IMPRESSION DES TEXTES Vous pouvez aussi vous contenter d'imprimer le texte entier de votre diteur. Ou bien d'en transfrer quelques morceaux dans l'diteur de la fentre d'mission, et ensuite de les imprimer. Utilisez alors le choix "Imprimer "du menu "Fichier". Vous remarquerez que l'impression redonne aux textes une largeur normale, ce qui utilise mieux le papier. Cel n'est valable que si la transmission a t faite sans introduction de caractres de fin de ligne parasites. L'ENVOI D'UN TEXTE Avant d'envoyer un texte, vous devez en faire l'essai en "local". Cliquez dans la fentre "Emission". Ecrivez un message dans le cadre de l'diteur, ou bien chargez un petit texte titre d'essai, comme celui qui figure dans la diskette d'origine, au moyen du choix "Ouvrir" du menu "Fichier". Limites de longueur: pour l'dition, vous ne serez limit que par la mmoire disponible dans votre GS. Mais pour envoyer le texte au serveur, nous avons jou l'conomie. Vous pouvez envoyer en une seule fois au maximum 80 lignes de 250 caractres maximum. Pratiquement, limitez-vous 4 pages. Assurez-vous donc avant l'envoi, que votre texte est de longueur raisonnable. Une page de Minitel correspond environ 15 lignes utiles de caractres, si on veut un texte ar. Quand le texte est au point, placez-vous en mode "local", cliquez le bouton "Home" et actionnez l'item "Envoi Texte" du menu "Minitel". Si votre texte demande plus d'une page, vous en serez averti par une fentre d'alerte. Le logiciel dcoupe votre texte en pages successives qu'il va transmettre automatiquement les unes la suite des autres. Il enverra les commandes voulues en fin de page (ordres "Envoi" et "Suite") jusqu' la dernire pour laquelle vous devez vous-mme commander l'envoi. S'il y a une seule page, ce sera vous d'en faire l'envoi. Pendant l'essai en local, Ministel va maintenant afficher rapidement sur le Minitel, votre texte mis en pages. Si l'essai en local est satisfaisant, vous pouvez simuler l'envoi sur ligne du message: Quittez le mode local sans toutefois vous connecter sur la ligne. Et relancez "Envoi Texte". Votre texte se droule cette fois bien plus lentement. Voyez que vous avez eu raison de prvoir un texte court. Cette fois, les changements de lignes et de pages ne se font plus. Les passages la ligne du texte sont en effet remplacs par de vrais commandes de "Suite", qui n'agissent pas dans cette simulation. Lors de l'envoi sur ligne sur un serveur du type de RTel, l'diteur du serveur reoit d'abord le texte en petite vitesse en l'affichant d'une faon assez bizarre. N'en soyez pas tonn. Il vous le repassera ensuite vitesse rapide dans sa prsentation dfinitive avant l'envoi. Pendant cette opration, vous ne pouvez gure intervenir pour faire une correction. Mais, comme votre texte a t soigneusement prpar dans l'diteur de la fentre d'mission, vous n'avez pas vous inquiter. Pour vous donner confiance et contrler le rsultat de votre transmission, vous pourrez vous entraner en envoyant des messages d'essai dans votre propre boite aux lettres du serveur, pour ensuite les relire. Mais je vous en prie, attendez d'avoir le programme bien en mains avant de me transmettre un message de remerciements. STATUT MODEM Cette fonction du menu "Minitel" est destine contrler le fonctionnement du Modem, qui reoit parfois des ordres bizarres. Vous n'avez pas normalement l'utiliser. Elle est l titre de dpannage. Le 'ModemStatus' est un nombre, plus exactement un 'bitFlag', qui devrait normalement doit tre gal 17. Si vous trouvez plus, ne vous affolez pas. Cochez et dcochez les cases "Enregistrer", "Local" ou "Edition" jusqu' ce que a rentre dans l'ordre. rer", "Local" ou "Edition" jusqu' ce que a rentre dans l'ordre. <?<++*DEMO.LISTPb&''SOURCES!۸ LIBRARIES$ܸ2*PROG.3.FINM.ܸܸPROG.3.FIN޶'޶' Programmation n3 : les listes =========================== Dans cet article, nous allons poursuivre lՎtude des structures de donnes avec les listes, qui sont une gnralisation des piles et des queues dont nous avons trait dans les 2 prcdents numros de GS Infos. Concepts de Liste ================ Une des structures de donnes trs frquemment utilise est dsigne sous le nom de liste. Il sagit de la mme ide que celle de la liste que lon peut tablir dans la vie quotidienne, comme la liste des numros de tlphone de ses amis, ou des choses faire dans la semaine De quoi sagit-il ? Une liste est un ensemble ordonn dՎlments. Ordonn ne veut pas forcment dire tri, mais simplement quun ordre peut tre dtermin par la manire dont les lments sont insrs dans la liste. Par exemple, un nouvel lment pourrait tre toujours ajout en tte de la liste, ou en queue, ou un autre endroit arbitraire. A quoi sert une liste? Comme son nom lindique, une liste permet de reprsenter un ensemble dobjets similaires et dont le nombre peut ne pas tre dtermin lavance, afin den dresser la liste. Ces objets peuvent avoir une relation entre eux, ou pas, selon les besoins. Cest un peu la structure fourre-tout, que lon utilise lorsquune structure plus spcifique napporte pas grand chose de plus. En tant que type de donnes abstrait, une liste possde un certain nombre de proprits: Elle peut avoir ou plus lments. Un nouvel lment peut tre ajout une liste nimporte quel moment et nimporte o. Nimporte quel lment dune liste peut tre supprim tout moment. Un lment quelconque dune liste peut tre accd indpendamment des autres lments. Une liste peut tre traverse de faon visiter successivement chacun de ses lments. Une des difficults de limplmentation du type liste est la varit des oprations possibles quil peut subir, et qui dpendent en fait de lutilisation particulire faite par le programme; par exemple et par dfinition, une liste peut possder plusieurs oprations dinsertion, de suppression et daccs dun lment. Cest pourquoi nous ne verrons quun sous-ensemble des oprations possibles; celui-ci vous permettra cependant dadapter les fonctions prsentes vos propres besoins. Etant donn que les lments sont ordonns dans la liste, on peut distinguer pour chaque lment son prcdent (le premier lment nen aura pas, bien entendu), et son suivant (qui nexistera pas pour le dernier lment de la liste). Il existe plusieurs catgories de listes. Ces catgories indiquent comment, partir dun lment donn, on peut ventuellement accder son prcdent et son suivant. Pratiquement, on distingue 4 catgories de listes qui sont en fait la combinaison de 2 grandes classes: La premire classe indique si on peut distinguer ou non un premier et un dernier lments. On dit quune liste est linaire dans le cas o ces lments existent, cest dire que le premier lment na pas de prcdent et quun moyen externe la liste permet dy accder; le dernier lment, lui, na pas de suivant. Au contraire, une liste est circulaire lorsquelle ne comprend pas de premier ni de dernier; dun point de vue pratique, cela veut dire que chaque lment de la liste a un prcdent et un suivant, formant en quelque sorte un anneau (par rapport la liste linaire, cela pourrait correspondre au fait que le suivant du dernier de cette liste est le premier, et par consquent le prcdent du premier est le dernier). La seconde classe indique si, partir dun lment quelconque, on peut accder son suivant et son prcdent ou un seul des 2 lments voisins. Lorsquun lment ne connat quun seul voisin, on dit que la liste est simple; en gnral, il sagit du suivant, mais ce nest pas obligatoire. Pour accder au prcdent dun lment dune telle liste, on doit la parcourir depuis le dbut (dans le cas dune liste linaire - pour une liste circulaire, on part de lՎlment actuel), jusquՈ lՎlment voulu, tout en mmorisant le prcdent de chaque lment visit. Lorsquon peut accder aux 2 voisins dun lment, on dit que liste est double; dans ce cas, on peut accder nimporte quel lment partir de nimporte quel autre. Ces 2 classes se combinent pour former les 4 catgories de liste voques plus haut: Les listes linaires simples sont les plus proches des listes relles et de lide que lon peut se faire dune liste. Elles sont aussi les plus frquemment employes (en tout cas par moi ;-) lorsquon utilise des structures chanes (la manipulation de pointeur est relativement simple), et sont dcrites en dtail dans la suite de cet article, concernant notamment leur implmentation. Les listes linaires doubles sont intressantes lorsquon a besoin de parcourir une liste de faon non squentielle (cest dire que lon doit faire des retours frquents vers des lments dj visits); en revanche, elles sont plus compliques implmenter dans le cas de listes chanes (il faut manipuler 2 pointeurs). Les listes circulaires prsentent lavantage de permettre dajouter de nouveaux lments en queue trs rapidement; il suffit en effet de maintenir un pointeur sur le dernier lment, et grce au lien vers le premier lment, on peut accder trs facilement lensemble de la liste. Ces listes peuvent indiffremment tre simples (navoir quun seul lien vers le suivant ou le prcdent) ou doubles. Lexemple le plus typique de lemploi de ce type de liste est celui du langage Lisp (dailleurs le nom du langage est labrviation de List Processor ou traitement de listes). Nous aborderons donc dans cet article la faon de crer une liste linaire simple, dinsrer un lment en tte, en queue, et un endroit quelconque de la liste, de supprimer le premier lment, le dernier ou un autre quelconque ainsi que la liste entire, daccder un lment quelconque et de traverser compltement la liste. Remarquez que pour linstant, nous navons pas encore parl de reprsentation dune liste. Cest donc bien un type abstrait, puisque nous avons pu clairement dfinir les oprations et les proprits lies la liste, sans pour autant rentrer dans limplmentation (mme si jai utilis le mot pointeur, cela ne fait pas forcment rfrence une structure chane). Reprsentation dune liste ======================== Une mthode couramment employe pour reprsenter une liste est lutilisation dun tableau. Cette solution est acceptable dans le cas o la liste subit peu de destructions dՎlments, car dans ce cas il faut remonter les lments suivant celui dtruit afin de boucher le trou ainsi cr, ce qui peut tre une opration coteuse. Les insertions se feront en gnral uniquement en fin de liste, afin dՎviter le mme inconvnient, ce qui peut ncessiter la mise en uvre dun algorithme de tri si lon a besoin que les lments aient un ordre plus prvisible. Un autre problme de lutilisation dun tableau est que celui-ci a en principe une taille fixe prdtermine (on peut contourner partiellement ce problme en allouant une zone mmoire pendant lexcution), ce qui limite arbitrairement la taille de la liste, et est donc contraire aux proprits nonces plus haut. Notez nanmoins quil ny a pas de rapport direct entre la notion de tableau et celle de liste: la premire est une implmentation possible de la seconde, qui est un type abstrait. On dsigne cette implmentation par le terme de liste contigu, ce qui indique que les lments de la listes sont contigs en mmoire. Listes chanes -------------- Pour pallier ces inconvnients, on emploie maintenant le mcanisme de pointeurs offert par des langages comme C ou Pascal. Par consquent, on ne consomme de la mmoire que lorsquil est ncessaire dajouter un nouvel lment, cette mmoire tant libre lorsque lՎlment est dtruit. La mmoire ainsi alloue doit pouvoir tre combine logiquement de faon former une seule entit que constitue la liste. La seule limite de taille dune telle liste devient la mmoire disponible. Une structure de donnes ainsi dfinie est appele liste chane. Chaque lment est dnomm un nud qui peut comprendre un certain nombre de champs, dont un dfini par la structure et qui permet de pointer sur le nud suivant (ventuellement le prcdent) de la liste. Si lon veut pouvoir mettre nimporte quel type dՎlments dans la liste, un nud ne doit compter que 2 rubriques: en plus du pointeur sur le nud suivant, le nud contient un pointeur gnrique vers linformation quil reprsente, cette information tant totalement indpendante de la structure de liste. Les diffrents nuds dune liste chane ne sont donc pas ncessairement contigs en mmoire (contrairement la reprsentation dune liste sous forme dun tableau). Par consquent, la recherche dun lment donn dans la liste doit se faire en parcourant la liste depuis le dbut et en suivant les chanages, jusquՈ trouver lՎlment recherch. Pour rsumer, une liste chane et un nud sont dfinis de la manire suivante: Une liste chane est un pointeur sur un nud. Un nud dune liste comprend 2 rubriques: Un pointeur vers le nud suivant. Un pointeur vers les donnes reprsentes par le nud. Une telle dfinition dune liste chane est rcursive, puisquune liste chane est un pointeur sur un nud, qui son tour pointe sur une liste chane. La rcursivit sarrte avec une liste vide qui est reprsente par un pointeur NULL en C et NIL en Pascal. Cependant, sagissant dune rcursivit finale (la rcursivit a lieu aprs tous les traitements sur un nud), elle peut tre remplace facilement par une itration (comme nous lavons vu dans le prcdent numro), ce qui est nettement moins coteux. Les manipulations de pointeurs tant plus complexes que ce que nous avons vu pour les piles et les queues, je les ai reprsentes sous forme de figures. Vous trouverez ces figures dans les fichiers Prog.3.Lst.F1.4 correspondant aux figures 1 4, et Prog.3.Lst.F5.7 pour les figures 5 7. Ces fichiers sont au format Apple Preferred et peuvent tre visualises avec tout programme de dessin tel que Platinum Paint. Dans ces figures, les flches en gras reprsentent les chanages crs par lopration matrialise par la figure, tandis que les flches en pointills correspondent aux chanages supprims par cette mme opration. La figure 1 montre la reprsentation graphique dune liste. On y voit bien la tte de la liste reprsente par L et la fin de la liste matrialise par le symbole NULL. Pour simplifier la figure, la donne a t place directement au niveau du nud, alors que daprs la dfinition prcdente, elle aurait d tre pointe. Une implmentation dune liste chane =================================== Pour changer un peu, et ne pas tre accus de sectarisme, les exemples ci-dessous seront tantt en C, tantt en Pascal. Une liste chane telle quelle vient dՐtre dfinie peut se dclarer de la manire suivante, selon le langage: En C: typedef void *data_ptr; typedef struct node *list; struct node { data_ptr data; list next; }; En Pascal: type data_ptr = ^char; list = ^node; node = record data : data_ptr; next : list; end; Vous voyez que les dfinitions sont identiques en C et en Pascal (aux diffrences syntaxiques de chaque langage prs). Les routines qui vont tre amenes manipuler cette structure nauront bien entendu aucune ide de ce que reprsente le pointeur data. De plus, la zone pointe devra tre gre ct de la liste, en gnral par le programme qui utilise ces routines, et cela de faon spcifique au type dinformations mettre dans la liste. Du point de vue de la structure de donnes, cest lidal, puisque lon a bien spar la reprsentation du type des donnes spcifiques prendre en compte. Du point de vue de la programmation, et du GS (qui nest tout de mme pas une machine trs puissante), lutilisation de plusieurs couches de fonctions nest sans doute pas aussi souhaitable, dautant plus que la liste est un type employ trs frquemment et que les oprations ne sont pas trs compliques. Cest pourquoi je vous recommande vivement dintgrer les mcanismes dcrits ici dans une structure comprenant la fois vos donnes et le pointeur vers le nud suivant et dutiliser directement les algorithmes prsents aux bons endroits dans vos programmes. La forme prsente ici reste malgr tout utile pour la clart des explications. Cration dune liste ------------------ Une nouvelle liste tant une liste vide, et cette dernire tant reprsente par un pointeur nul, la cration de cette liste est trs simple: il suffit dinitialiser le pointeur sur la tte de la liste NULL en C, et NIL en Pascal. Le programme dapplication va donc appeler une routine dinitialisation de liste qui va se contenter de retourner ce pointeur nul. Par exemple, en Pascal (en supposant que lon dispose dune UNIT grant les listes): USES listes; VAR ma_liste : list; BEGIN ma_liste := create_list; END; La fonction create_list tant simplement: FUNCTION create_list : list; BEGIN create_list := NIL; END; Bien entendu, le programme aurait pu lui-mme initialiser sa liste NIL (et il devra le faire si il intgre directement les manipulations sur la liste); cependant, linitialisation de la liste aurait pu contenir dautres instructions ncessaires la librairie et que le programme na pas connatre; dautre part, pour le programme, la liste est un type opaque (cest dire quil ne connat pas la manire dont le type est implment), quil ne sait donc pas initialiser. Insertion dun lment -------------------- Maintenant que nous disposons dune liste (bien quencore vide), nous pouvons lui ajouter des donnes qui seront donc reprsentes chacune par un nud. Ces donnes peuvent tre insres dans la liste, soit en tte des nuds dj existants, soit en queue, soit enfin au milieu selon une rgle dtermine. Le cas dinsertion le plus simple est en tte de la liste; en effet, il suffit alors de crer le nouveau nud (cest dire dallouer la mmoire ncessaire son stockage) puis dassigner ce nud au pointeur reprsentant la liste, sans oublier davoir fait pointer le suivant de ce nouveau nud vers lancienne tte de liste (cest dire le premier nud de cette liste). Cela a lair bien compliqu, alors que lexemple Pascal ci-dessous montre quen fait cest trs simple (cette procdure est illustre par la figure 2) : PROCEDURE prepend_node ( var L : list; data : data_ptr ); VAR node : list; (* dclaration d'un noeud *) BEGIN NEW ( node ); (* cration du noeud *) node^.data := data; (* enregistrement de la donne *) node^.next := L; (* le suivant pointe sur l'ancienne liste *) L := node; (* noeud devient la nouvelle tte de liste *) END; Vous noterez que le traitement dune liste prcdemment vide nest pas isol, car dans ce cas laffectation de lancienne tte de liste au suivant du nouveau nud rsulte en linitialisation de ce dernier NIL, constituant ainsi une liste de un lment (ce cas se produit uniquement lors de la premire insertion). Lappel cette procdure se fait alors simplement par: prepend_node ( ma_liste, data_ptr(@ma_donnee) ); Dans la pratique, ce devrait tre une fonction boolenne afin quelle puisse indiquer le succs ou lՎchec de linsertion (qui ne peut se produire que lorsquil ny a plus assez de mmoire). Linsertion en fin de liste est un petit peu plus complique puisque la seule information dont on dispose est le pointeur sur la tte de liste; il nous faut donc parcourir la liste jusquau dernier nud, puis le faire pointer vers le nouveau nud (le dernier nud contient NIL avant lajout). Ce nouveau nud doit lui pointer sur NIL, car il devient effectivement le dernier de la liste. Nous devons ici traiter sparment le cas dune liste prcdemment vide, car on ne pourra pas la parcourir; la liste devient simplement le nud (encore une fois, ce cas ne se produit que lors du premier ajout). Ecrit en Pascal, cela devrait tre un peu plus comprhensible(la figure 3 rsume le droulement des oprations): PROCEDURE append_node ( var L : list; data : data_ptr ); VAR node, last : list; BEGIN NEW ( node ); (* cration du nouveau noeud *) node^.data := data; (* enregistrement de la donne *) node^.next := NIL; (* ce noeud sera le dernier de la liste *) IF L = NIL THEN L := node (* la liste devient le nouveau noeud *) ELSE BEGIN last := L; (* recherche du dernier noeud actuel *) WHILE last^.next <> NIL DO last := last^.next; last^.next := node; (* chainage du nouveau noeud *) END; END; Lappel cette procdure se fait alors simplement par: apppend_node ( ma_liste, data_ptr(@ma_donnee) ); Dans la pratique, ce devrait tre une fonction boolenne afin quelle puisse indiquer le succs ou lՎchec de linsertion (qui ne peut se produire que lorsquil ny a plus assez de mmoire). Linsertion en milieu de liste est en fait une gnralisation de linsertion en queue, puisquau lieu de chercher le dernier nud, on va en chercher un quelconque, mais selon une rgle bien dfinie. Lobjectif de ce type dinsertion est de minimiser le parcours de la liste lorsque lon a besoin daccder lun de ses nuds; par consquent, linsertion dun lment au milieu obit trs souvent une rgle de tri (par exemple dans lordre croissant ou alphabtique selon le type de donnes mis en liste), ainsi, on pourra arrter la recherche ds que lon aura trouv un lment aprs celui recherch. Bien entendu, ce type dinsertion ne peut pas semployer simultanment avec les 2 prcdents, car ils fausseraient lordre tabli. Pour insrer un nouveau nud au milieu, il nous faut rechercher celui qui se situera juste aprs aprs cette insertion (cest dire celui qui lui est immdiatement suprieur), sachant quil ne peut y en avoir aucun si le nouvel lment est le plus grand de tous (auquel cas, il se retrouvera en queue de liste); nous devons aussi mmoriser le nud prcdent celui trouv, car notre nouveau nud sinsrera juste entre les 2, cest dire que le pointeur vers le nud suivant de ce nud prcdent sera chang pour pointer vers le nouveau nud, dont le pointeur sur le suivant pointera vers le nud suprieur (ce nud tait anciennement point par le suivant du nud prcdent). La seule vraie difficult est la dtermination du point dinsertion, puisque nous ne savons pas ce que reprsente la donne; il nous faudra donc appeler une fonction du programme utilisateur passe en paramtre. Voyons sur un exemple (en C pour changer) ce que tout cela donne (et sur la figure 4 pour une reprsentation graphique du processus): void insert_node ( list *L, data_ptr data, short (*compare)() ) { list node, current, previous; node = (list) malloc ( sizeof ( struct node ) ); /* cration noeud */ node->data = data; /* enregistrement de la donne */ /* recherche du noeud "suprieur" et mmorisation du "prcdent" */ for ( current = *L, previous = NULL; current != NULL && (*compare) ( current->data, data ) < 0; previous = current, current = current->next ); if ( previous == NULL ) *L = node; /* Insertion en tete de liste */ else previous->next = node; /* Insertion entre previous et current */ node->next = current; /* nouveau noeud pointe sur "suprieur" */ } Cest un petit peu plus compliqu que pour les insertions prcdentes. Le paramtre (*compare)() dfinit un pointeur sur une fonction externe qui est appele dans la boucle for. Cest cette fonction qui va dterminer la position laquelle sera insr le nouveau nud. On lui passe 2 paramtres: le premier indique la donne contenue dans le nud actuellement travers et le second la donne insrer; elle nous retourne un entier indiquant lordre relatif de ces donnes : < si le nud actuel de la liste se trouve logiquement avant celui insrer. = si les 2 donnes sont identiques : on peut dcider soit dinsrer le nouveau nud avant ou aprs celui identique (ici cest avant) ou encore de rejeter les doublons. > si le nud actuel de la liste se trouve logiquement aprs celui insrer. La boucle prcdente recherche donc le premier nud dont la donne est immdiatement suprieure (ou ventuellement identique) celle du nud insrer. Bien videmment, on sarrte aussi lorsque lon arrive en fin de liste sans avoir satisfait la comparaison. Le cas dune liste vide nest pas trait spcifiquement puisque la boucle sarrtera ds le premier passage (current sera NULL). La mmorisation du nud prcdent se fait simplement en recopiant le pointeur sur le nud actuellement trait avant de passer au suivant; le pointeur sur ce prcdent est dabord initialis NULL pour dtecter le cas o le premier lment satisfait la comparaison (ou que la liste est vide). Linsertion est ensuite un simple jeu de pointeurs: le nud mmoris en tant que prcdent (ou la tte de liste si il est nul, indiquant une insertion en premire position) pointe sur le nouveau nud qui pointe son tour sur le nud qui doit tre son suivant (si le nouveau nud doit tre insr la fin de la liste ou que celle-ci est vide, le pointeur suivant sera bien nul, et satisfera donc les rgles). Lappel cette procdure se fait alors simplement par: insert_node ( ma_liste, data_ptr(@ma_donnee), ma_compare_routine ); Dans la pratique, ce devrait tre une fonction boolenne afin quelle puisse indiquer le succs ou lՎchec de linsertion (qui ne peut se produire que lorsquil ny a plus assez de mmoire). Il faudra aussi avoir crit une fonction spcifique ma_compare_routine qui pourrait ressembler : short ma_compare_routine ( data_ptr data1, data2 ) { if ( data1 < data2 ) return ( -1 ); else if ( data1 == data2'gf LISTP.LIBTAF5.7 LISTP.INTTAF5.7H LISTC.LIBTAF5.7*.% ed FINDER.DATASOSS INIT.C.5.BISOSS<PROG.3.2ES.GSS Suppression dun nud -------------------- Comme pour linsertion, on peut envisager plusieurs mthodes de suppression dun nud: soit le premier, soit le dernier, soit un autre quelconque. Encore une fois, la suppression du premier nud est la plus simple puisquon peut laccder directement. Il suffit de faire pointer la tte de la liste vers le suivant de la liste (cest dire le suivant du premier nud) puis de librer la mmoire occupe par ce premier nud. Le deuxime lment devient ainsi lC0B~STACKDP STACKDP; ; Definition d'un segment de type stack/direct-page minimum ; StackDP START ~StackDP KIND $12 DS 256 END DEFGHIJKLMNOPCa nouvelle tte de liste; si la liste nen comprenait quun, le rsultat de cette opration donne une liste vide. Si la liste est vide au dpart, une erreur doit tre signale, car il ny a bien videmment rien supprimer. Tout ceci donne en Pascal, et sur la figure 5: FUNCTION delete_first ( var L : list ) : data_ptr; VAR node : list; BEGIN IF L = NIL THEN delete_first := NIL (* erreur - liste vide *) ELSE BEGIN node := L^.next; (* prservation nouvelle tte de liste *) delete_first := L^.data; (* on retourne la donne *) DISPOSE ( L ); L := node; (* liste dmarre au second lment *) END; END; Le pointeur vers le deuxime nud doit tre prserv dans une variable temporaire avant de librer la mmoire occupe par le premier, puisquaprs cette libration, on ne peut plus lgalement accder aux champs de la structure. Cette fonction retourne la donne (en principe un pointeur sur celle-ci) afin que le programme puisse librer la mmoire quelle occupe. La destruction du dernier nud dune liste est peine plus complique: il suffit de rechercher lavant-dernier nud puis de faire pointer son suivant sur NIL avant de librer la mmoire occupe par le dernier. Si la liste ne comprend quun seul nud, il ny aura pas davant-dernier, et la liste retourne sera alors vide. Cest bien entendu une erreur de supprimer un nud lorsque la liste es  !"#$%&'()*+,-./0123456789:;<=>?@ABC00000000000000000=00000000000011000t vide. Enfin, on retourne la donne pour libration ventuelle de la mmoire quelle occupe par le programme. Traduit en Pascal et graphiquement sur la figure 6, tout ceci donne: FUNCTION delete_last ( var L : list ) : data_ptr; VAR node, previous : list; BEGIN IF L = NIL THEN delete_last := NIL (* erreur - liste vide *) ELSE BEGIN previous := NIL; node := L; WHILE node^.next <> NIL DO BEGIN previous := node; (* avant dernier noeud *) node := node^.next; (* dernier noeud *) END; IF previous = NIL THEN L := NIL (* liste d'un seul noeud devient vide *) ELSE previous^.next := NIL; (* suppression dernier noeud *) END; END; La suppression dun nud quelconque dune liste est la gnralisation des 2 fonctions prcdentes. Le programme doit spcifier la donne correspondant au nud supprimer ainsi quune fonction boolenne permettant de comparer successivement la donne de chacun des nuds avec celle recherche; ici, nous avons juste besoin de connatre lidentit des donnes sans relation dordre. De notre ct, nous devons mmoriser le nud prcdent de celui recherch, et lorsquil est trouv, par un simple jeu de pointeurs, il nous faut le faire pointer sur le suivant du nud supprimer. Nous retournerons NULL si le nud nest pas trouv (ceci traite aussi du cas dune liste vide) et la donne lorsquil a t dtruit afin que le programme libre la mmoire occupe par cette dernire. Voyons ce que tout cela donne en C et sur la figure 7: data_ptr delete_node ( list *L, data_ptr data, boolean (*compare)() ) { list node, previous; /* recherche du noeud supprimer et mmorisation du prcdent */ for ( node = *L, previous = NULL; node != NULL && ! (*compare) ( node->data, data ); previous = node, node = node->next ); if ( node == NULL ) /* Noeud inexistant */ return ( NULL ); if ( previous == NULL ) *L = node->next; /* Suppression du premier noeud */ else previous->next = node->next; /* Suppression autre noeud */ data = node->data; free ( node ); return ( data ); } La fonction compare utilise est ultra-simple. Elle peut sՎcrire par exemple: boolean mon_compare ( data_ptr data1, data2 ) { return ( data1 == data2 ); } Il vous faudra bien sr substituer data1 et data2 par les vritables donnes. Destruction complte dune liste ------------------------------ Aprs ce que nous venons de voir, vous devriez imaginer assez facilement les actions effectuer: il nous faut parcourir la liste, puis pour chaque lment, appeler une fonction externe librant la mmoire occupe par la donne. Nous devrons aussi mmoriser dans une variable temporaire le nud suivant celui dtruire, car nous navons pas le droit daccder ses champs, une fois que la mmoire quil occupait a t libre. Si la liste est vide, on ne fait rien, mais on ne signale pas non plus derreur. Aprs cette opration, la liste est compltement rinitialise. Ce qui donne en C: void destroy_list ( list *L, void (*delete_data) ( data_ptr ) ) { list node; if ( *L != NULL ) /* boucle sur chacun des noeuds de la liste node pointe sur le noeud suivant celui dtruire */ for ( node = (*L)->next; *L != NULL; ) { /* libration mmoire occupe par la donne */ (*delete_data) ( (*L)->data ); free ( *L ); /* libration mmoire occupe par le noeud */ if ( ( *L = node ) != NULL ) /* si pas dernier noeud */ node = node->next; /* on va le supprimer */ } } Parcours de liste ---------------- En dehors des insertions et des suppressions de nuds, nous avons besoin dՐtre capables daccder lun dentre eux et de parcourir compltement lensemble de la liste pour effectuer un traitement sur chacun de ses nuds (par exemple pour les visualiser). En fait, nous avons dj quasiment vu ces oprations dans les routines prcdentes. Nous pouvons donc crire les 2 fonctions suivantes en C: boolean find_node ( list L, data_ptr data, boolean (*compare)() ) { list node; for ( node = L; node != NULL && (*compare)(node->data,data); node = node->next ) return ( node != NULL ); } La fonction compare est identique celle utilise par delete_node. Elle renvoie TRUE si le nud existe et FALSE dans le cas contraire. Nous ne faisons que rpercuter ce rsultat. void traverse_list ( list L, void (*process_data)() ) { list node; for ( node = L; node != NULL; node = node->next ) (*process_data)(node->data); } Pour chacun des nuds de la liste, on appelle une fonction externe process_data qui effectue le traitement appropri sur la donne. Telle que cette fonction est crite, on ne peut pas sarrter en cours de route (si par exemple la fonction externe considre quelle a termin son travail aprs un certain nombre de nuds). Pour pallier ce problme, on peut traverser la liste en gardant le contrle, au lieu de le passer la fonction de parcours. Pour cela, on utilise un mcanisme que lon dsigne sous le nom de contexte. Lors du premier appel, le programme appelant linitialise NULL pour indiquer la routine de se placer en dbut de liste. Ensuite, cette variable est gre automatiquement par la routine de parcours, et on ne doit surtout pas la changer. Une fonction de parcours base sur ce principe pourrait tre crite ainsi en Pascal: FUNCTION get_node ( L : list; var context : list ) : data_ptr; BEGIN IF context = NIL THEN context := L (* initialisation au debut de la liste *) ELSE context := context^.next; (* element suivant de la liste *) IF context = NIL THEN get_node := NIL (* arrive en fin de liste *) ELSE get_node := context^.data; (* retourne donne *) END; Le fait de passer le contexte en paramtre (plutt que dutiliser une variable interne la librairie) permet de parcourir simultanmRSTUVWXYZ[\]^_`abcde$MAIN+1'DEEBFD $-1<@?CEFC4-(  384<<;;??150NNKINO !+.?ACAFBB4-'   /1,HHFAGH !+.?AC@DB@3.%   #"!! 12/SQMKOO !+.?AC>FCB4-'   ?FDEEB??FDDE?EEBHED91%    %' EECCEE#   #25>C@?GHF;3(!$?EDBEB?EBBDBEB?E570E 57 ""6 """;8 [HH H8hh"l/  +;ik;8 [ Hhh  +;ik;8 [ں H"h  +;i k%ld ;8 [  +;i k;8 [ں"q h ںt"hں"hں"hں "hں7 "hں[ "hں"Oh  )ںj "hں{iH "!hںH H{i H"hIں "hں "hں{iH "!hں H{i H"IhIں "h!ں "hں{iH "!hں H{i H"F hIں "hں H"hں "hں "hں{iH+ "!hںwH H{i H"~hHhhhں/ "hں H"hںC "h5ںں{i H" hHW "hVں H"hںk "h5ںں{i H"U hH "hں H"hں "h{)15ںں H"hH "h2ںں H"IhH "h.ں H"hں "hPں "hںH H"hں "hں H"hں "hں "hں{iH- "!hںwH H H"QhHhhhں1 "hںH{i H"h81FF H`0Hr0NsvHr0Nsv)q)QںH{i H"h+;ik (I)nsertion element, au (D)ebut, a la (F)in (S)uppression element, (P)remier, d(E)rnier affichage (1)er element, affichage der(N)ier element (V)isualisation de la liste, (R)echerche element destruction (C)omplete, (Q)uitter Votre Choix ? Valeur de l'element ? %ldInsertion impossible. Valeur de l'element ? %ldInsertion impossible. Valeur de l'element ? %ldInsertion impossible. La liste est vide. Valeur de l'element ? %ldElement non trouve La liste est vide. Suppression de %ld La liste est vide. Suppression de %ld La liste est vide. Premier element = %ld Dernier element = %ld La liste est vide. Contenu de la liste : La liste est vide. Valeur de l'element ? %ldElement non trouve ;8 ["B- h  ih hhhHHhhh hhhx HHhhh   ihhh+;ik;8 [hh+;ik;8 [HHhhh o  HHhhh H"- +;ik;8 [HHhhh   hh HHhhh   h h ih  H"-+;ik;8 [  hhh  ȘBH H:H  kI   h  h ( HHhhh* HH ihhh  H"-+;ik;8 [ HHhhh  HHhhh H:H  k H"- hhhh5  +;ik;8 [h  Ș  +;i k;8  [ h  ȘBH H:H  kI   +;ik;8 [h Ș HHhh  +;i k;8  [h f HHhhh   +;ik;8 ["B- h # hhh hhh  ȘPH H :H  k8pI0ʊ  uh hhh ihhh ihhh +;ik;8  ["B-څh h OHH ihhh hhh hhh  +;ik;8 [ hEH:H  %k  +;ikQUTSKqBm)m)m m"w3oo"w3  kSHQH"&k=ɑ3*!zhZ(HH " "hkHHH"zhZګkO@SHQH"kU   ;8 [ ȗd   +;ikH h\-KzZڭo-Hm-H; [Wi # " Ȁ " Ȁ  Z8czHHHH "$ Out of memory "\-h h  m  Ȁ    )s  "   i  ")0"!)      +hhkKHH ;[$ϋhHHhk֯   H H"+hh`K ;[)%H"  +hhk    ).  )l Lh  ) <_ S|_)-,0"+ + # 8``])* ] %]`)0:)H]] m]c] %"n$sJ%pY%cE#X"x"o$u#d[#i[#fc eP EU g$"G)"\K ;["" V)&) ( )&) "&) " %u "" )A%4 )/%"*[ )] %  +hhk #)*  !)l#h # ) @ݵ Y|)0":)H mc ԭ`d&i&ui)oq)xy)Xy)c%s*p*nU)fg'eg'Eg'gg'Gg'%H+[(\H:h\(((((‚Ą;8 [K H H"+  ) ) ) m 4"w3oo"w3C H H ,2     {i    ȷ   ȷ   "  L  )  m ȭ m  ȷ   ȭ    i ȷ i )8  ȷ :  )    I   )   +;i k """" "" I- 8{i H " "0e00 !""0eE0) PT6100 :. 蘼0Ψ)8I0 %H"00 0"Ψ)Z)H"z %0.# e0 "8. "0` `"" {i H "᭦I)m:"Ͳβ"8"Ψ %%" C#C# QT  0RNnnnjJJJJ 0:i C#   ˭ X C#00vΨ % H" %I !8  I - H H HS '" &"᭴ 0/ ' S S 8ΨΨΨR  8I0 %H" H"H"00 H"Ψ H"βȹ) SZ)H"zȀ묬 %   %` QT  0R   !NnnnjJJJJJ 0R00o ȷ )  Ͳ8 %Z )H"zκ %`0 "Ψ`   h{[`!!"  ! %`a'a'e' ]'Y'['"&) c'+- c'"e'a'=08]'!!"e'Xx]'!z!"e'0e8"]'X:N)AFGA)H['HY'H]'"\+hY'h['hmY'Y'['!!"e'" e'8>c'8Y'Y'['['# Y' #0['  %` ((!!"&) !+- r( _(]0H0 r(h( |(E. r( _(8 |(3eE% r( _(!+- r( _(( |(" (QW()0:0 r("',H H H#  "  " %`! "(!`8`((`0: r( _(Η(`TQ))^ Q) )] 8) MQ)"-H 8)z=  ! Ԝ!Ϙ"   %`S)S):JJJS)`  %` {* W {*O* {*"**00!!"**xX! !" Π**"**0^8"*Q:G)A?G:)H*H*H**"\+h*h*hm***!!*" Π** &# * #0*  %`**"&) " ` D+ B+  F+F+"&) _  !!")&) ϊ" $ F+8 B+:B+ D+  %`"% " `H; [' s+HJ e effff` s+ Fe jf +;ikKU; [  8+hhzhhZګk; [ +hzzH`; [KHH,,,, ",,9:6, - " -( "኉-,, Z,eiz  +;ikhf<~@; [8"." .+hhk "3"4hhky--- --k -")--H- "-"3H"h`HHH8H; [  "L3 % Q8  0 "5 "5 "L3e i @< "5 "5   "L3Z "5".+;i kHH8H; [6ȷ6ȷ HH"+hhhhk C hhhhk K;8 [0F3dd@3 B3- "H3F3J30ddD3?2 S1 1 r1 1#?2?2 ?2 1 ɍ?2 1?2 ?2 1 1ɾɮ ?2 1ɼɬd 1?2?2Hd 1 S1h 1Ud 11 ?2 @2:?2Iȹ?2?2:?2Hd 1 S1h: 1D3D3HD3 2.?2?2?2D3 1Hd 1 S1h 1h?2 ?2 1-`L10H ""h0)J3 a `0ZHF3J31"1H "hz0`08 00"?2?2 ?2 1(  1(`?2!?2?2ș?2?2?2?2`0;i +kH; ["$76ȿ666+hhkKZ3 "/3303@2 3330)zkK033@230kK66&6kHiH;8  [  "$7 66O$>"4 7"7ȩȗ na i  U GE66 "5F e i  "L3 "L38  0 E 66 "5) i+;ik5iHHHH@@5H "hh5 5ǩkHH; [6ȗ6ȗȥȥȩ66 66i+zzzzkHHHHH; ["$766  ȷݠ6ȷ6 ȷ+;i kK o-m-;i- HH "];[-c:zZګH "h-Hi- "- -s-q---------kInsufficient bank zero memory6 ":JJJJk! D2Jbz@e#DiA\z#>\.Nf;aaU5^XPYbkt| %,3:BGMQU 8KW  8xOPZby4Rvv-e!< IR ,3W]u{5pzSZbjp %djt 09[c~ (FE %/G_w,b} f>w Y+Cc=8S  S!T"0 +/69 CFILOUX[^afi|%+.EHMSaeimquy} ?BEHT[k"!.1:=JTky~ HKRUqxQY\_gjy|" "%+07AGVciory}"%(-47AHT^ahp '*1}ւ,/7a},tD\t 7 [ j  )_ z     c   + w;/ tC W k  V     ( @`   - w51 PP&]U)O7@     (!)!D"S"""#$$'(((+U4,,:,,@,,`,,f, -v, -,-,,66Y,C ~ExpressLoadY W!C"4I %W!0E W! "d "\;8  [H%#)'8hh" I!) (+;i(k;8  [%#')Ș!) (+;i(k;8 [HH"] H "+;ik;8 [+;ik;8 [" "^+HH""+HH""4HH""0HH""!HH"""9HH"" "  GHH""h h " H HH{H",I]HH""rHH""h h " H H"IHH""HH""h h " H H" IHH""  H" HH""HH""h h " H HlH{H"! HhhHH""l H"  HH""8 HH" H" HH"]" H" # HH""85 HH" H"X HH"]" H" D HH""~ 1;V HH" H"HH"]"8h HH" H"HH"]" H" z HH""6 HH"" HH{H"~"x H"  HH"" HH""h h " H HlH{H"Hhh HH"" HH{H" 81FF H`"WpppppppppppppppppW5pppppppppp9ppppppppppppW5pppppppppp9p qH Q HH{H" +;ik(I)nsertion element, au (D)ebut, a la (F)in(S)uppression element, (P)remier, d(E)rnieraffichage (1)er element, affichage der(N)ier element(V)isualisation de la liste, (R)echerche elementdestruction (C)omplete, (Q)uitterVotre Choix ? Valeur de l'element ? Insertion impossible.Valeur de l'element ? Insertion impossible.Valeur de l'element ? Insertion impossible.La liste est vide.Valeur de l'element ? Element non trouveLa liste est vide.Suppression de La liste est vide.Suppression de La liste est vide.Premier Element = Dernier Element = La liste est vide.Contenu de la liste : La liste est vide.Valeur de l'element ? Element non trouve;8( [{i$H"$&d$ȗ$+$-$/H/Hhh $/&/O//"  H Hhh  " ʠ$ ȥ& )1(0+;i0k;8  [dd+;i k;8$ ['H'HhhddD''''" ''H'h'" H"%)$(+;i(k;8( [+H+Hhhdd++&$d d"$H$Hhh&$" $$&$¥ " ++  ȗ $$&$H")-(,+;i,k;8( [55&$d d"$&H$$H31H/-H+:H  r kI#&$" $$&$$&dd/ "$H$5h5$H$Hh h $$&$H")7(6+;i6k;8 [#H#Hhh###H#Hhhc##H!H:H  k##H"##{%$+;i$k;8  [#%Ȅ!% $+;i$k;8$ [31" "H H/-H+)H':H  JkI#  " " %3$2+;i2k;8  [#%dd ##!% $+;i$k;8$ [')ddJ)'"  H Hhh  " ʠ %)$(+;i(k;8, [{i(H"(*d5(7(99&$d d"$&H$$H75H31H/:H  kH8zpI0ʊ#&$" $$&$ " (9*9 ( ȥ* $(ȥ&(-;,:+;i:k;8$ [{i H" "d,+H+Hh h ' ) +"+%-$,+;i,k;8 [%#:H!H:H  k%$+;i$k{;8[:H" "{i+k; [H H H h h h8" 0 " H Hi  H"i " +;i kKS "S"n)U U SU a kU"UkHHK" +%-`0:`N,""`H )"hh"k ;[I4" )d9  ")   +` "kH"9\!KError occurred at line - "ᭇH"- in procedure e ""z"*  " " Line Name " ---- ---- "ᭃ <H"-  ""z"*z c;[ 8)e "+hkSubrange exceededFile is not openRead while at end of file I/O error Out of memoryEOLN while at end of file Set overflow&Jump to undefined case statement labelInteger math errorReal math error UnderflowOverflowDivide by zeroInexactStack overflow Stack errorKZ "0 ξμ0)zkK0μ0k; [8""+hhkHHH8H; [  " % Q8  0 " " "e i @< " "   "Z ""+;i kHH8H; [: ȷ< ȷ HH"+hhhhk[ai k ")Hu "u"UH"h` C hhhhk K;8 [0dd { "0dd  F  #   ɍ F   ɾɮ  Fɼɬd FHd F h FUd F1  :Iȹ:Hd F h: FH . Hd F h Fh  {`L0H ""h0) a `0ZHD"DH "hz0`08 00"  (  (`!ș`0;i +kH; [" > ȿ@ > @ +hhkK: < &> k "8"OhhkHiH;8  [  " > @ O$>"Ob d ȩȗ na i  U GE@ >  "F e i  " "8  0 E > @  ") i+;ikiHHHUH@@H "hh ǩkHH; [: ȗ< ȗȥȥȩ: <  : < i+zzzzkHi H ;[ "+hhk; [ "f HHH"z +hhhhk HH"} Lz; [  )8 I" H HI i " +;i kHHHHH; [" > @   ȷݠ> ȷ@ ȷ+;i kKHH; [$HH"+hhk"LK UQO;i HUH "];[cc:zZګH "hcHic "u aUS}wykInsufficient bank zero memory "H ( &"L ! ( '"L !:JJJJk( ;[  8(I  ȗ(  @+hhk @6:RVnr ,0KO[o #'BFRp%CGbn~ 04CaeNRkS@ B2?M,2[`*.y S]w W]eB0 "(S]arx *Tdt9Lj K[j6 a %A]y:TXbgj~1KOY^ai  2Qi;>Po? =\d +DLnF $v !$?B $ISx> t})038ILUX[^an*/9JN[cfm#(Zahm{4@asx.2>bnqyk{^">Zv9G ]7r_ { .V fl   /# N5 f D V h Mz l   l: Y aA Ih s  @Ks<`F-ue ;c1 = ^ n  h  SOURCESv۸ ' ''LISTC.H22(LISTC.CC+))-DEMO.LISTC.CC ()̹))LISTP.PAS0 .DEMO.LISTP.PAS ?%ι%/** ** ListC.h - fichier a inclure par toute application amenee a utiliser le ** type list. **/ /* * Definition d'un noeud et d'une liste. */ typedef struct node *list; typedef void *data_ptr; struct node { data_ptr data; list next; }; /* * Prototypes des fonctions disponibles. */ list create_list ( void ); void destroy_list ( list *, void (*) ( data_ptr ) ); boolean empty_list ( list ); boolean prepend_node ( list *, data_ptr ); boolean append_node ( list *, data_ptr ); boolean insert_node ( list *, data_ptr, short (*) ( data_ptr, data_ptr ) ); data_ptr delete_node ( list *, data_ptr, boolean (*) ( data_ptr, data_ptr ) ); data_ptr delete_first ( list * ); data_ptr delete_last ( list * ); void traverse_list ( list, void (*) ( data_ptr ) ); list find_node ( list, data_ptr , boolean (*) ( data_ptr, data_ptr ) ); data_ptr get_node ( list, list * ); data_ptr get_first ( list ); data_ptr get_last ( list ); list find_last ( list ); /** ** ListC.cc - Routines de manipulation d'une liste. ** Cette librairie est decrite dans l'article "Programmation 3" ** de GS Infos 22 qu'elle accompagne. ** ** v1.0 20 Mai 1992 ** **/ #pragma noroot /* Pas de fichier ListC.root avec ORCA/C v1.3 */ #pragma optimize -1 /* * La definition de NULL sous cette forme a ete effectuee afin de remplacer * celle de Types.h (qui est juste 0x0L), car avec la definition originale, * ORCA/C 1.2 et 1.3 generent un code faux (il etait correct avec la v1.1). * Le probleme est que l'affectation d'un long a un pointeur (sans le caster) * n'est pas forcement une erreur en C, et en tout cas, si ORCA/C le considere * ainsi, il devrait indiquer cette erreur et non pas generer du code faux. * NULL est defini sous la forme ci-dessous dans stdio.h. Je recommande de * modifier Types.h pour definir NULL de cette maniere pour ne pas s'exposer a * des problemes futurs. */ #define NULL (void *) 0x0L #include #include #include "ListC.h" /* * create_list () - Creation d'une nouvelle liste, qui est donc vide. * Comme il n'y a rien de special a faire, on retourne * seulement NULL qui est a affecter a la tete de liste. */ list create_list ( void ) { return ( NULL ); } /* create_list () */ /* * destroy_list () - Destruction d'une liste. Pour chacun des elements on * appelle une fonction utilisateur qui a la charge de * liberer la memoire occupee par la donnee. * L'operation ne peut se faire que si la liste est non vide. * Remarque : on maintient un pointeur sur le noeud suivant * celui a detruire, car apres le free, on n'a * plus le droit d'acceder a ses champs. * Cette routine ne retourne rien, mais la liste est devenue * vide. */ void destroy_list ( list *L, void (*delete_data) ( data_ptr ) ) { list node; if ( *L != NULL ) for ( node = (*L)->next; *L != NULL; ) { (*delete_data) ( (*L)->data ); free ( *L ); if ( ( *L = node ) != NULL ) node = node->next; } } /* destroy_list () */ /* * empty_list () - Renvoie vrai ou faux selon que la liste est vide ou pas. */ boolean empty_list ( list L ) { return ( L == NULL ? TRUE : FALSE ); } /* empty_list () */ /* * prepend_node () - Ajoute un element en tete de la liste. * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. */ boolean prepend_node ( list *L, data_ptr data ) { list node; node = ( list ) malloc ( sizeof ( struct node ) ); if ( node == NULL ) return ( FALSE ); node->next = *L; node->data = data; *L = node; return ( TRUE ); } /* prepend_node () */ /* * append_node () - Ajoute un element en fin de liste. * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. */ boolean append_node ( list *L, data_ptr data ) { list node, last; node = ( list ) malloc ( sizeof ( struct node ) ); if ( node == NULL ) return ( FALSE ); node->next = NULL; node->data = data; if ( *L == NULL ) *L = node; else { /* * Recherche du dernier element actuel de la liste et chainage du * nouvel element. */ for ( last = *L; last->next != NULL; last = last->next ); last->next = node; } return ( TRUE ); } /* append_node () */ /* * insert_node () - Insertion d'un element a une position quelconque de la liste * y compris en tete et et queue (les fonctions prepend_node * et append_node ont quand meme l'interet de montrer d'autres * methodes d'insertion, et elles sont plus rapides). * On utilise une fonction utilisateur pour chaque element qui * nous renvoie un resultat similaire a strcmp (< 0 si * l'element est avant celui a inserer, 0 si il sont * identiques (mais on l'insere quand meme avant) et > 0 si il * est apres). * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. */ boolean insert_node ( list *L, data_ptr data, short (*compare) ( data_ptr, data_ptr ) ) { list node, current, previous; node = ( list ) malloc ( sizeof ( struct node ) ); if ( node == NULL ) return ( FALSE ); node->data = data; /* * Recherche de l'element avant lequel le nouveau noeud doit etre insere * (ceci est seulement fait par l'instruction for ci-dessous !) */ for ( current = *L, previous = NULL; current != NULL && (*compare) ( current->data, data ) < 0; previous = current, current = current->next ); if ( previous == NULL ) *L = node; /* Insertion en tete de liste */ else previous->next = node; /* Insertion entre previous et current */ node->next = current; return ( TRUE ); } /* insert_node () */ /* * delete_node () - Suppression d'un noeud quelconque de la liste. * La recherche de ce noeud est faite par une fonction * utilisateur qui doit retourner TRUE quand l'element a ete * localise et FALSE dans le cas contraire. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NULL dans le cas * contraire. * Cette routine est la generalisation des routines * delete_first et delete_last ci-dessous. */ data_ptr delete_node ( list *L, data_ptr data, boolean (*compare) ( data_ptr, data_ptr ) ) { list node, previous; /* * Recherche du noeud a supprimer. */ for ( node = *L, previous = NULL; node != NULL && ! (*compare) ( node->data, data ); previous = node, node = node->next ); if ( node == NULL ) /* Noeud inexistant */ return ( NULL ); if ( previous == NULL ) *L = node->next; /* Suppression du premier noeud */ else previous->next = node->next; /* Suppression d'un autre noeud */ data = node->data; free ( node ); return ( data ); } /* delete_node () */ /* * delete_first () - Suppression du premier noeud de la liste. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NULL si la liste * est vide. */ data_ptr delete_first ( list *L ) { list node; data_ptr data; if ( *L == NULL ) return ( NULL ); /* La liste est vide ! */ data = (*L)->data; node = *L; /* On doit preserver le noeud avant sa destruction */ *L = (*L)->next; free ( node ); return ( data ); } /* delete_first () */ /* * delete_last () - Destruction du dernier noeud de la liste. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NULL si la liste * est vide. */ data_ptr delete_last ( list *L ) { list node, previous; data_ptr data; if ( *L == NULL ) return ( NULL ); /* La liste est vide ! */ /* * Recherche du dernier element de la liste. */ for ( node = *L, previous = NULL; node->next != NULL; previous = node, node = node->next ); if ( previous == NULL ) *L = NULL; /* La liste ne contient qu'un seul noeud */ else previous->next = NULL; /* L'avant dernier noeud devient le dernier */ data = node->data; free ( node ); return ( data ); } /* delete_last () */ /* * traverse_list () - Parcours de l'ensemble des elements de la liste, et pour * chacun d'entre eux, appel d'une fonction utilisateur pour * traiter la donnee. */ void traverse_list ( list L, void (*process_data) ( data_ptr ) ) { list node; for ( node = L; node != NULL; node = node->next ) (*process_data) ( node->data ); } /* traverse_list () */ /* * find_node () - Recherche d'un noeud ayant une certaine donnee (celle-ci * est identifiee par une procedure utilisateur qui retourne * TRUE lorsqu'elle l'a trouvee et FALSE autrement) et renvoi * du pointeur sur ce noeud, NULL si on ne le trouve pas. */ list find_node ( list L, data_ptr data, boolean (*compare) ( data_ptr, data_ptr ) ) { list node; for ( node = L; node != NULL && ! (*compare) ( node->data, data ); node = node->next ); return ( node ); } /* find_node () */ /* * get_node () - Retourne successivement la donnee de chacun des noeuds de la * liste et NULL lorsqu'il n'y en a plus. * Cette routine utilise la notion de contexte, qui doit etre * initialise a NULL pour le premier appel (declanchant ainsi le * parcours au debut de la liste) et qui ne doit jamais etre * modifie par la suite. */ data_ptr get_node ( list L, list *context ) { /* * Positionnement du contexte, soit au debut de la liste, soit sur l'element * suivant. */ *context = ( *context == NULL ) ? L : (*context)->next; return ( ( *context == NULL ) ? NULL : (*context)->data ); } /* get_node () */ /* * get_first () - Renvoie la donnee du premier noeud de la liste et NULL si elle * est vide. */ data_ptr get_first ( list L ) { return ( L == NULL ? NULL : L->data ); } /* get_first () */ /* * get_last () - Renvoie la donnee du dernier noeud de la liste et NULL si elle * est vide. */ data_ptr get_last ( list L ) { list node; if ( L == NULL ) return ( NULL ); /* * Recherche du dernier element de la liste. */ for ( node = L; node->next != NULL; node = node->next ); return ( node->data ); } /* get_last () */ /* * find_last () - Renvoie le dernier noeud de la liste et NULL si elle * est vide. */ list find_last ( list L ) { list node; if ( L == NULL ) return ( NULL ); /* * Recherche du dernier element de la liste. */ for ( node = L; node->next != NULL; node = node->next ); return ( node ); } /* find_last () */ /** ** Programme de demonstration de la librairie de manipulation des listes. ** Ce programme accompagne l'article "Programmation 3" de GS Infos 22. ** ** V1.0 20 Mai 1992 ** **/ #include #include #include "ListC.h" short compare_num ( data_ptr num1, data_ptr num2 ) { /* * Utilisee lors de l'insertion. Elle fait en sorte que les nombres soient * inseres dans l'ordre croissant. */ return ( ( (long) num1 - (long) num2 ) < 0 ? -1 : 1 ); } /* compare_num () */ boolean equal_num ( data_ptr num1, data_ptr num2 ) { return ( (long) num1 == (long) num2 ); } /* equal_num () */ void write_num ( data_ptr num ) { printf ( "%ld ", (long) num ); } /* write_num () */ void delete_num ( data_ptr num ) { /* Il n'y a rien a faire puisque data est directement le nombre */ } /* delete_num */ void main ( void ) { char choix; long num; list L; L = create_list (); do { printf ( "\n(I)nsertion element, au (D)ebut, a la (F)in\n" ); printf ( "(S)uppression element, (P)remier, d(E)rnier\n" ); printf ( "affichage (1)er element, affichage der(N)ier element\n" ); printf ( "(V)isualisation de la liste, (R)echerche element\n" ); printf ( "destruction (C)omplete, (Q)uitter\n\n" ); printf ( "Votre Choix ? " ); while ( ( choix = (char) getchar () ) == '\n' ); switch ( choix ) { case 'I' : case 'i' : printf ( "Valeur de l'element ? " ); scanf ( "%ld", &num ); if ( ! insert_node ( &L, (data_ptr) num, compare_num ) ) printf ( "Insertion impossible.\n" ); break; case 'D' : case 'd' : printf ( "Valeur de l'element ? " ); scanf ( "%ld", &num ); if ( ! prepend_node ( &L, (data_ptr) num ) ) printf ( "Insertion impossible.\n" ); break; case 'F' : case 'f' : printf ( "Valeur de l'element ? " ); scanf ( "%ld", &num ); if ( ! append_node ( &L, (data_ptr) num ) ) printf ( "Insertion impossible.\n" ); break; case 'S' : case 's' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else { printf ( "Valeur de l'element ? " ); scanf ( "%ld", &num ); if ( delete_node ( &L, (data_ptr) num, equal_num ) == NULL ) printf ( "Element non trouve\n" ); } break; case 'P' : case 'p' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else printf ( "Suppression de %ld\n", (long) delete_first ( &L ) ); break; case 'E' : case 'e' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else printf ( "Suppression de %ld\n", (long) delete_last ( &L ) ); break; case '1' : case 'N' : case 'n' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else if ( choix == '1' ) printf ( "Premier element = %ld\n", (long) get_first ( L ) ); else printf ( "Dernier element = %ld\n", (long) get_last ( L ) ); break; case 'V' : case 'v' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else { printf ( "Contenu de la liste :\n" ); traverse_list ( L, write_num ); printf ( "\n" ); } break; case 'R' : case 'r' : if ( empty_list ( L ) ) printf ( "La liste est vide.\n" ); else { printf ( "Valeur de l'element ? " ); scanf ( "%ld", &num ); if ( find_node ( L, (data_ptr) num, equal_num ) == NULL ) printf ( "Element non trouve\n" ); } break; case 'C' : case 'c' : destroy_list ( &L, delete_num ); break; } } while ( choix != 'q' && choix != 'Q' ); destroy_list ( &L, delete_num ); } /* main () */ (** ** ListP - Cette unit implemente les primitives de manipulation d'une liste. ** Cette unit est decrite dans l'article "Programmation 3" ** de GS Infos 22 qu'elle accompagne. ** ** v1.0 20 Mai 1992 ** **) (*$Optimize -1*) UNIT ListP; INTERFACE TYPE (* * Definition du pointeur sur les donnees a mettre en liste. *) data_ptr = ^char; (* * Definition du type liste et d'un noeud de cette liste. *) list = ^node; node = RECORD data : data_ptr; next : list; END; (* * Definition des procedures externes utilisees par l'unit. *) PROCEDURE delete_data ( data : univ data_ptr ); EXTERNAL; FUNCTION locate_pos ( data1, data2 : univ data_ptr ) : INTEGER; EXTERNAL; FUNCTION locate_node ( data1, data2 : univ data_ptr ) : BOOLEAN; EXTERNAL; PROCEDURE process_data ( data : univ data_ptr ); EXTERNAL; (* * Definition des fonctions et des procedures disponibles. *) FUNCTION create_list : list; PROCEDURE destroy_list ( var L : list; PROCEDURE delete_data ( data : univ data_ptr ) ); FUNCTION empty_list ( L : list ) : BOOLEAN; FUNCTION prepend_node ( var L : list; data : univ data_ptr ) : BOOLEAN; FUNCTION append_node ( var L : list; data : univ data_ptr ) : BOOLEAN; FUNCTION insert_node ( var L : list; data : univ data_ptr; FUNCTION locate_pos ( data1, data2 : univ data_ptr ) : INTEGER ) : BOOLEAN; FUNCTION delete_node ( var L : list; data : univ data_ptr; FUNCTION locate_node ( data1, data2 : univ data_ptr ) : BOOLEAN ) : data_ptr; FUNCTION delete_first ( var L : list ) : data_ptr; FUNCTION delete_last ( var L : list ) : data_ptr; PROCEDURE traverse_list ( L : list; PROCEDURE process_data ( data : univ data_ptr ) ); FUNCTION find_node ( L : list; data : univ data_ptr; FUNCTION locate_node ( data1, data2 : univ data_ptr ) : BOOLEAN ) : list; FUNCTION get_node ( L : list; var context : list ) : data_ptr; FUNCTION get_first ( L : list ) : data_ptr; FUNCTION get_last ( L : list ) : data_ptr; FUNCTION find_last ( L : list ) : list; IMPLEMENTATION (* * create_list - Creation d'une nouvelle liste, qui est donc vide. * Comme il n'y a rien de special a faire, on retourne * seulement NIL qui est a affecter a la tete de liste. *) FUNCTION create_list; BEGIN create_list := NIL; END; (* create_list *) (* * destroy_list - Destruction d'une liste. Pour chacun des elements on * appelle une fonction utilisateur qui a la charge de * liberer la memoire occupee par la donnee. * L'operation ne peut se faire que si la liste est non vide. * Remarque : on maintient un pointeur sur le noeud suivant * celui a detruire, car apres le free, on n'a * plus le droit d'acceder a ses champs. *) PROCEDURE destroy_list; VAR node : list; BEGIN IF L <> NIL THEN BEGIN node := L^.next; WHILE L <> NIL DO BEGIN delete_data ( L^.data ); DISPOSE ( L ); L := node; IF node <> NIL THEN node := node^.next; END; END; END; (* destroy_list *) (* * empty_list - Renvoie vrai ou faux selon que la liste est vide ou pas. *) FUNCTION empty_list; BEGIN empty_list := ( L = NIL ); END; (* empty_list *) (* * prepend_node - Ajoute un element en tete de la liste. * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. *) FUNCTION prepend_node; VAR node : list; BEGIN NEW ( node ); IF NODE = NIL THEN prepend_node := FALSE ELSE BEGIN node^.next := L; node^.data := data; L := node; prepend_node := TRUE; END; END; (* prepend_node *) (* * append_node - Ajoute un element en fin de liste. * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. *) FUNCTION append_node; VAR node, last : list; BEGIN NEW ( node ); IF NODE = NIL THEN append_node := FALSE ELSE BEGIN node^.next := NIL; node^.data := data; IF L = NIL THEN L := node ELSE BEGIN (* * Recherche du dernier element actuel de la liste et chainage du * nouvel element. *) last := L; WHILE last^.next <> NIL DO last := last^.next; last^.next := node; END; append_node := TRUE; END; END; (* append_node *) (* * insert_node - Insertion d'un element a une position quelconque de la liste * y compris en tete et et queue (les fonctions prepend_node * et append_node ont quand meme l'interet de montrer d'autres * methodes d'insertion, et elles sont plus rapides). * On utilise une fonction utilisateur pour chaque element qui * nous renvoie un resultat indiquant la position de l'element * par rapport a celui a inserer (< 0 si l'element est avant * celui a inserer, 0 si il sont identiques (mais on l'insere * quand meme avant) et > 0 si il est apres). * Retourne vrai si cela a ete possible et faux dans le cas * contraire, c'est a dire si on n'a pas pu allouer de memoire. *) FUNCTION insert_node; VAR node, current, previous : list; BEGIN NEW ( node ); IF NODE = NIL THEN insert_node := FALSE ELSE BEGIN node^.data := data; (* * Recherche de l'element avant lequel le nouveau noeud doit etre insere *) current := L; previous := NIL; WHILE ( current <> NIL ) AND ( locate_pos ( current^.data, data ) < 0 ) DO BEGIN previous := current; current := current^.next; END; IF previous = NIL THEN L := node (* Insertion en tete de liste *) ELSE previous^.next := node; (* Insertion entre previous et current *) node^.next := current; insert_node := TRUE; END; END; (* insert_node *) (* * delete_node - Suppression d'un noeud quelconque de la liste. * La recherche de ce noeud est faite par une fonction * utilisateur qui doit retourner TRUE quand l'element a ete * localise et FALSE dans le cas contraire. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NIL dans le cas * contraire. * Cette routine est la generalisation des routines * delete_first et delete_last ci-dessous. *) FUNCTION delete_node; VAR node, previous : list; BEGIN (* * Recherche du noeud a supprimer. *) node := L; previous := NIL; WHILE ( node <> NIL ) AND NOT locate_node ( node^.data, data ) DO BEGIN previous := node; node := node^.next; END; IF node = NIL THEN delete_node := NIL (* Noeud inexistant *) ELSE IF previous = NIL THEN L := node^.next (* Suppression du premier noeud *) ELSE previous^.next := node^.next; (* Suppression d'un autre noeud *) delete_node := node^.data; DISPOSE ( node ); END; (* delete_node *) (* * delete_first - Suppression du premier noeud de la liste. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NIL si la liste * est vide. *) FUNCTION delete_first; VAR node : list; BEGIN if L = NIL THEN delete_first := NIL ELSE BEGIN delete_first := L^.data; node := L; (* On doit preserver le noeud avant sa destruction *) L := L^.next; DISPOSE ( node ); END; END; (* delete_first *) (* * delete_last - Destruction du dernier noeud de la liste. * On retourne un pointeur sur la donnee lorsqu'on l'a trouvee * et donc que son noeud a ete detruit (pour que l'appelant * libere la memoire qu'elle occupe), et NIL si la liste * est vide. *) FUNCTION delete_last; VAR node, previous : list; BEGIN IF L = NIL THEN delete_last := NIL (* La liste est vide ! *) ELSE BEGIN (* * Recherche du dernier element de la liste. *) node := L; previous := NIL; WHILE node^.next <> NIL DO BEGIN previous := node; node := node^.next; END; IF previous = NIL THEN L := NIL (* La liste ne contient qu'un seul noeud *) ELSE previous^.next := NIL; (* L'avant dernier noeud devient le dernier *) delete_last := node^.data; DISPOSE ( node ); END; END; (* delete_last *) (* * traverse_list - Parcours de l'ensemble des elements de la liste, et pour * chacun d'entre eux, appel d'une fonction utilisateur pour * traiter la donnee. *) PROCEDURE traverse_list; VAR node : list; BEGIN node := L; WHILE node <> NIL DO BEGIN process_data ( node^.data ); node := node^.next; END; END; (* traverse_list *) (* * find_node - Recherche d'un noeud ayant une certaine donnee (celle-ci * est identifiee par une procedure utilisateur qui retourne * TRUE lorsqu'elle l'a trouvee et FALSE autrement) et renvoi * du pointeur sur ce noeud, NIL si on ne le trouve pas. *) FUNCTION find_node; VAR node : list; BEGIN node := L; WHILE ( node <> NIL ) AND NOT locate_node ( node^.data, data ) DO node := node^.next; find_node := node; END; (* find_node *) (* * get_node - Retourne successivement la donnee de chacun des noeuds de la * liste et NULL lorsqu'il n'y en a plus. * Cette routine utilise la notion de contexte, qui doit etre * initialise a NULL pour le premier appel (declanchant ainsi le * parcours au debut de la liste) et qui ne doit jamais etre * modifie par la suite. *) FUNCTION get_node; BEGIN (* * Positionnement du contexte, soit au debut de la liste, soit sur l'element * suivant. *) IF context = NIL THEN context := L ELSE context := context^.next; IF context = NIL THEN get_node := NIL ELSE get_node := context^.data; END; (* get_node *) (* * get_first - Renvoie la donnee du premier noeud de la liste et NIL si elle * est vide. *) FUNCTION get_first; BEGIN IF L = NIL THEN get_first := NIL ELSE get_first := L^.data; END; (* get_first *) (* * get_last - Renvoie la donnee du dernier noeud de la liste et NIL si elle * est vide. *) FUNCTION get_last; VAR node : list; BEGIN IF L = NIL THEN get_last := NIL ELSE BEGIN (* * Recherche du dernier element de la liste. *) node := L; WHILE node^.next <> NIL DO node := node^.next; get_last := node^.data; END; END; (* get_last *) (* * find_last - Renvoie le dernier noeud de la liste et NIL si elle est vide. *) FUNCTION find_last; VAR node : list; BEGIN IF L = NIL THEN find_last := NIL ELSE BEGIN (* * Recherche du dernier element de la liste. *) node := L; WHILE node^.next <> NIL DO node := node^.next; find_last := node; END; END; (* find_last *) END. (* ListP *) (** ** Programme de demonstration de l'unit de manipulation d'une liste. ** Ce programme accompagne l'article "Programmation 3" de GS Infos 22. ** ** V1.0 20 Mai 1992 ** **) PROGRAM Demo_ListP ( input, output ); (* * Il faut copier au prealable ListP.int dans le repertoire 2/OrcaPascalDefs * pour que la compilation puisse s'effectuer normalement. * * Orca/Pascal possede une directive LibPrefix censee indiquer le repertoire * dans lequel se trouve l'interface de l'unit, sauf que je ne suis pas arrive * a ce que la compilation ne s'avorte pas sur 'Error reading uses file'. * Et comme je ne vois pas dans quel langage le lui dire, j'abandonne par * KO technique a la cinquieme reprise. *) USES ListP; VAR choix : CHAR; num : LONGINT; L : list; FUNCTION compare_num ( num1, num2 : data_ptr ) : INTEGER; BEGIN (* * Utilisee lors de l'insertion. Elle fait en sorte que les nombres soient * inseres dans l'ordre croissant. *) IF ( ORD4 ( num1 ) - ORD4 ( num2 ) ) < 0 THEN compare_num := -1 ELSE compare_num := 1; END; (* compare_num *) FUNCTION equal_num ( num1, num2 : data_ptr ) : BOOLEAN; BEGIN equal_num := ORD4 ( num1 ) = ORD4 ( num2 ); END; (* equal_num *) PROCEDURE write_num ( num : data_ptr ); BEGIN WRITE ( ORD4 ( num ), ' ' ); END; (* write_num *) PROCEDURE delete_num ( num : data_ptr ); BEGIN (* Il n'y a rien a faire puisque data est directement le nombre *) END; (* delete_num *) BEGIN L := create_list; REPEAT WRITELN; WRITELN ( '(I)nsertion element, au (D)ebut, a la (F)in' ); WRITELN ( '(S)uppression element, (P)remier, d(E)rnier' ); WRITELN ( 'affichage (1)er element, affichage der(N)ier element' ); WRITELN ( '(V)isualisation de la liste, (R)echerche element' ); WRITELN ( 'destruction (C)omplete, (Q)uitter' ); WRITELN; WRITE ( 'Votre Choix ? '); (* * Pour une raison inconnue (de moi), le CR saisi apres le nombre (a * moins que cela soit celui de la lecture du choix) dans les READLN * suivants n'est lu que lors du passage suivant dans la boucle et est * affecte a choix, si bien que le menu est affiche 2 fois. * La boucle ci-dessus permet de l'absorber. Ce n'est pas tres elegant, * mais comme je ne vois vraiment pas comment faire autrement ... *) REPEAT READLN ( choix ); UNTIL choix <> ' '; CASE choix OF 'I', 'i' : BEGIN WRITE ( 'Valeur de l''element ? ' ); READLN ( num ); IF NOT insert_node ( L, POINTER ( num ), compare_num ) THEN WRITELN ( 'Insertion impossible.' ); END; 'D', 'd' : BEGIN WRITE ( 'Valeur de l''element ? ' ); READLN ( num ); IF NOT prepend_node ( L, POINTER ( num ) ) THEN WRITELN ( 'Insertion impossible.' ); END; 'F', 'f' : BEGIN WRITE ( 'Valeur de l''element ? ' ); READLN ( num ); IF NOT append_node ( L, POINTER ( num ) ) THEN WRITELN ( 'Insertion impossible.' ); END; 'S', 's' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE BEGIN WRITE ( 'Valeur de l''element ? ' ); READLN ( num ); IF delete_node ( L, POINTER ( num ), equal_num ) = NIL THEN WRITELN ( 'Element non trouve' ); END; 'P', 'p' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE WRITELN ( 'Suppression de ', ORD4 ( delete_first ( L ) ) ); 'E', 'e' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE WRITELN ( 'Suppression de ', ORD4 ( delete_last ( L ) ) ); 'N', 'n', '1' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE IF choix = '1' THEN WRITELN ( 'Premier Element = ', ORD4 ( get_first ( L ) ) ) ELSE WRITELN ( 'Dernier Element = ', ORD4 ( get_last ( L ) ) ); 'V', 'v' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE BEGIN WRITELN ( 'Contenu de la liste : ' ); traverse_list ( L, write_num ); WRITELN; END; 'R', 'r' : IF empty_list ( L ) THEN WRITELN ( 'La liste est vide.' ) ELSE BEGIN WRITE ( 'Valeur de l''element ? ' ); READLN ( num ); IF find_node ( L, POINTER ( num ), equal_num ) = NIL THEN WRITELN ( 'Element non trouve' ); END; 'C', 'c' : destroy_list ( L, delete_num ); otherwise : ; END; UNTIL ( choix = 'q' ) OR ( choix = 'Q' ); destroy_list ( L, delete_num ); END. (* Demo_ListP *) LIBRARIESv۸ ' ')LISTC.LIB ,**)LISTP.INT )LISTP.LIB  eFINDER.DATATܸ2pܸ2,>LIBRARY LISTC.A  %(1 =2J[U_ is|\   append_node create_list delete_first delete_last delete_node destroy_list empty_list find_last find_node get_firstget_lastget_node insert_node prepend_node traverse_list~GLOBALSe!,B create_list!;8 [hh+;ik)7,C destroy_list';8 [ HHh)1hh9'B  HHh}hh'* H:H  k H"free& hhhh$5  +;ik<,A empty_list;8 [h  $'  +;i k,C prepend_node;8  ["mallocڅh h& /~OHH ihhh hhh hhh  +;ik+,B append_node;8 ["malloc h$ .F ih hhhHHhv~hh hhh6 HHhhh    ihhh+;ik~d,B insert_node;8 ["malloc h$ .QE hhh hhh v y'H H :H  k 8pI0  u h hhh2 ihhh ihhh +;ik_`,B delete_node:;8 [  hhh = @'H H:H x xk}I   h  K h ' HHhhh%* HH ihhh  H"free+;ikB,C delete_first';8 [HHh)1hh?d  HHhhh H"free +;ik),B delete_last';8 [HHh)1hh@F  hh HHhhh   h h ih  H"free+;iku,D traverse_list;8 [ he!H:H L Lk  +;ikP,@ find_node;8  [ h ! $l'H H:H \ \kaIl    +;ik},? get_node';8 [HHh)1hhX!HH\ .hhhHHhhhHHhh  +;ikS,@ get_first;8 [h 2 HH8hh  +;i k*,? get_last;8  [h!* HHhMUhhs    +;ik,@ find_last;8  [h!{* HHhMUhhs    +;ikB@,? ~GLOBALS DATA_PTR CHAR LIST NODE NODE DATA DATA_PTR NEXT LIST ( DELETE_DATA DATA ;DATA_PTR EXTERNAL LOCATE_POS DATA1 DATA2 ;DATA_PTR INTEGER EXTERNAL LOCATE_NODE DATA1 DATA2 ;DATA_PTR BOOLEAN EXTERNAL PROCESS_DATA DATA ;DATA_PTR EXTERNAL CREATE_LIST LIST DESTROY_LIST L LIST DELETE_DATA DATA ;DATA_PTR EMPTY_LIST L LIST BOOLEAN PREPEND_NODE L LIST DATA ;DATA_PTR BOOLEAN APPEND_NODE L LIST DATA ;DATA_PTR BOOLEAN INSERT_NODE L LIST DATA ;DATA_PTR LOCATE_POS DATA1 DATA2 ;DATA_PTR INTEGER BOOLEAN DELETE_NODE L LIST DATA ;DATA_PTR LOCATE_NODE DATA1 DATA2 ;DATA_PTR BOOLEAN DATA_PTR DELETE_FIRST L LIST DATA_PTR DELETE_LAST L LIST DATA_PTR TRAVERSE_LIST L LIST PROCESS_DATA DATA ;DATA_PTR FIND_NODE L LIST DATA ;DATA_PTR LOCATE_NODE DATA1 DATA2 ;DATA_PTR BOOLEAN LIST GET_NODE L LIST CONTEXT LIST DATA_PTR GET_FIRST L LIST DATA_PTR GET_LAST L LIST DATA_PTR FIND_LAST L LIST LIST :,>LIBRARY LISTP.A  % 1o=+JU3_d is>|]R % APPEND_NODE CREATE_LIST DELETE_FIRST DELETE_LAST DELETE_NODE DESTROY_LIST EMPTY_LIST FIND_LAST FIND_NODE GET_FIRSTGET_LASTGET_NODE INSERT_NODE PREPEND_NODE TRAVERSE_LIST~GLOBALS^,B CREATE_LIST;8  [dd+;i k,C DESTROY_LIST;8 [#H#H&hh..###H#H^fhh'##H!H:H  k ##H"~DISPOSE##{%$+;i$kx(,A EMPTY_LIST;8  [#%!% $+;i$kb,C PREPEND_NODE;8$ [{i H"~PNEW "#dO,+H+Hh h ' ) +"+%-$,+;i,k,B APPEND_NODE;8( [{i$H"~PNEW$&$d'$ȗ$+$-$/H/HMUhhg $/&/"//"  H Hhh  " $ ȥ& )1(0+;i0k,B INSERT_NODE;8, [{i(H"~PNEW(*$d5(7(99&$d d"$&E%H$$H75H31H/:H u uk H8zpI0#&$" $$&$ " (9*9 ( ȥ* $(ȥ&(-;,:+;i:k,B DELETE_NODE;8( [55&$d d"$&"%H$$H31H/-H+:H R RkI#t&$" $$&$$&dd "$H$5h5$H$Hh h $$&$H"~DISPOSE)7(6+;i6k ,C DELETE_FIRST;8$ ['H'H&hh1dduA''''" ''H'h'" H"~DISPOSE%)$(+;i(k,B DELETE_LAST;8( [+H+H&hh2dd&++&$d d"$H$HZbhh&$" $$&$ " ++  ȗ $$&$H"~DISPOSE)-(,+;i,ka,D TRAVERSE_LIST;8 [%#QH!H:H @ @k%$+;i$k,@ FIND_NODE;8$ [31" "%H H/-H+)H':H J JkI#d  " " %3$2+;i2kP,? GET_NODE;8  [#H#H&hh8 '#)#W##H#h##H#Hlthhdd##!) (+;i(k6,@ GET_FIRST;8  [#%dd! ##!% $+;i$kt,? GET_LAST;8$ [')dd_)'"  H H5=hhS  "  %)$(+;i(kp,@ FIND_LAST;8$ [')dd[)'"  H H5=hhS  " " %)$(+;i(k@@,? ~GLOBALSent plusieurs listes. Avec cette approche, on peut arrter le parcours lorsque cela est ncessaire. Autres oprations ---------------- Nous avons fait le tour des principales oprations utilises avec les listes. On pourrait aussi ajouter une fonction vrifiant si une liste est vide, ce qui sՎcrirait en Pascal : FUNCTION empty_list ( L : list ) : boolean; BEGIN empty_list := L = NIL; END; Les autres fonctions que lon pourrait dvelopper sont: Obtention directe du premier et du dernier  !"#$%&'()*+,-./0123456789:;<=>?@AB Initiation au langage C numro 5 bis ================================ Encore les Fonctions ================== Non, non, ce nest pas une erreur ! Nous allons effectivement revenir sur les fonctions. La raison en est que jai t pris par le temps lors de lՎcriture de mon prcdent article, et que je lai insuffisamment relu. Je me suis donc aperu aprs coup que certaines parties taient incompltes pour ne pas dire confuses. Je vais donc apporter les prcisions ncessaires dans cet article, en esprant que cette fois, tout sera plus clair pour vous. Jai aussi profit de cette occasion pour faire quelques remarques gnrales sur lutilisation de la mmoire par un programme C; ces remarques sappliquent aussi pour lessentiel aux programmes Pascal. Je suis encore malheureusement pris par le temps pour ce numro, et je nai pas pu crire la sixime partie concernant les structures et les tableaux. Ce nest que partie remise, et jespre pouvoir lՎcrire pour le numro de rentre. Dici l, vous aurez le temps de souffler un peu, et ventuellement de mettre en pratique tout ce que nous avons vu jusquici. Dailleurs, si vous avez commenc crire des programmes en C, alors que vous ne connaissiez pas ce langage auparavant, jaimerai savoir ce que vous avez fait et si vous avez rencontr des difficults, et, dans ce cas, lesquelles, afin que je puisse redtailler, si ncessaire, certains sujets dj traits. Utilisation de la mmoire par un programme C ======================================== Sur le GS, qui est une machine 16 bits, lensemble des fonctions du programme, auxquelles sajoutent celles de la librairie C, appeles soit explicitement, soit implicitement, doivent occuper normalement au maximum 64 Ko de mmoire. Dans la plupart des cas, cest largement suffisant. Toutefois, si vous veniez crire un programme norme, ncessitant plus de 64 Ko de code, ORCA/C dispose de linstruction segment qui permet de regrouper toutes les dfinitions de fonctions suivant son utilisation dans un autre segment, permettant ainsi de saffranchir de la limite des 64 Ko. On peut utiliser autant de fois que ncessaire cette instruction, crant autant de segments. On peut mme regrouper des fonctions qui ne suivent pas dans le source, ou qui sont localises dans un autre fichier source, dans un mme segment, ds lors quon utilise le mme nom de segment. Un segment peut aussi tre dynamique, cest dire nՐtre charg en mmoire que lorsquon appelle lune des fonctions quil contient. Pour cela, on prcise loption dynamic lorsquon crit linstruction segment. Avec ORCA/Pascal, les 2 directives segment et dynamic permettent de raliser la mme chose. Dans la situation standard, les donnes globales sont stockes dans le mme segment que le code, ce qui peut tre aussi la cause de la saturation des 64 Ko. ORCA/C et ORCA/Pascal disposent de la directive memorymodel permettant de gnrer un segment de donnes spcifiques, indpendant de celui dans lequel est stock le code. En fait, lorsquon utilise le modle large memory, ORCA/C et ORCA/Pascal gnrent 2 segments de donnes, lun de 64 Ko pour les variables globales scalaires, et un de taille non limite pour les tableaux. Cette directive prsente linconvnient de ralentir laccs aux tableaux et de ncessiter lemploi dune autre librairie (ORCAGLIB) au lieu de la librairie standard ORCALIB. En revanche, la librairie Pascal PASLIB fonctionne avec les 2 modles. Je pense que lon na jamais besoin dutiliser cette directive, car il nest pas raisonnable de dclarer des tableaux statiques de grande taille. En effet, une telle dclaration est souvent faite en prvision de la manipulation dun grand volume de donnes. Or, dans la plupart des cas, on naura quՈ grer une faible quantit de donnes, ce qui a pour consquence de gcher une partie de la mmoire, et dՎventuellement interdire laccs simultan dautres programmes (accessoires ). Il est prfrable dallouer dynamiquement la mmoire ncessaire au cas qui se prsente, ce qui ne ncessite pas dutiliser la directive memorymodel (mme si on alloue plus de 64 Ko, contrairement dailleurs ce qui est indiqu dans le manuel), et permet de sadapter toutes les situations. Ainsi, si la mmoire disponible ne permet pas de traiter un volume de donnes trop important, le programme reste utilisable avec une quantit plus faible. En fait, la taille du code et des donnes pose rarement un problme ( moins que vous ne rcriviez AppleWorks GS :-). La vritable limitation de mmoire se situe au niveau de la pile. En effet, celle-ci doit obligatoirement se situer dans les 64 premiers Ko de la mmoire (que lon appelle le banc 0). Or, pour assurer la compatibilit avec les Apple II 8 bits, toute cette mmoire nest pas disponible; de plus, GS/OS et le loader en occupent une bonne partie. Si bien quil ny a environ que 40 Ko qui sont utilisables. Lorsquon lance un programme (par exemple, par lintermdiaire du Finder ou du shell ORCA), GS/OS alloue automatiquement une pile de 4 Ko (sauf si on spcifie explicitement une autre taille). Le problme est que les programmes crs par ORCA/C et ORCA/Pascal nutilisent pas cette pile; la place, le code de dmarrage situ dans le .root alloue une nouvelle pile de 8 Ko par dfaut. Cest dire que chaque programme C ou Pascal consomme 12 Ko de mmoire dans le banc 0. Il peut donc tre impossible de pouvoir lancer un programme avec dautres programmes dj chargs, par exemple sous MultiSwitch, alors quil y a encore plein de mmoire disponible, uniquement parce que le systme ne peut pas allouer la place demande pour la pile. La perte des 4 Ko de la pile alloue automatiquement par GS/OS peut tre facilement annule en linkant avec un segment de type stack/direct page qui doit tre crit en assembleur; en voici un exemple : StackDP START ~StackDP ; on donne un nom au load segment KIND $12 ; cre un segment de type stack/direct-page DS 256 ; taille minimale de la pile = 1 page END Pour vous viter de la frappe, vous trouverez le source et lobjet de ce segment sur votre disquette GS Infos. Notez quon ne peut pas crer un segment de ce type de moins dune page. Enfin, cest toujours mieux que ce que font les compilateurs ORCA Contrairement ce qui est crit dans les manuels des compilateurs ORCA, il nest que rarement ncessaire de disposer de 8 Ko de pile : ce besoin sapplique essentiellement aux programmes rcursifs (et encore, cela dpend de la profondeur attendue de la rcursivit), ventuellement aux programmes en mode bureau (la bote outils requiert pas mal despace sur la pile), et aux programmes dclarant des tableaux en variables locales, donc sur la pile. Dans ce dernier cas, on peut viter dutiliser la pile pour les grosses variables locales en prcdant la dclaration du mot cl static, si bien que ces variables se retrouvent alloues dans le mme espace que les variables globales; elles restent nanmoins locales, sauf que leur valeur est prserve dun appel lautre, mais on nest pas oblig den tenir compte. Le seul cas o cela peut poser un problme, cest lorsque la fonction est rcursive, mais je ne connais pas dexemple de telle fonction ncessitant de manipuler de gros volumes de donnes. Notez quen Pascal, on ne dispose pas de cette possibilit davoir des variables locales nutilisant pas la pile. Une fois que lon a fait en sorte de ne pas consommer excessivement la pile, il suffit dindiquer au compilateur de modrer sa boulimie avec la directive stacksize. Il est raisonnable de dfinir une pile de 4 Ko pour un programme moyen et de descendre 2 Ko pour un petit programme, ou un utilitaire pour le shell. Javoue navoir pas utilis cette directive dans aucun des programmes que je vous ai fournis : la raison en est quil sagit soit dexemples qui ne sont pas destins tre utiliss de faon intensive, soit que le programme nen a pas besoin; par exemple le NDA calculatrice (comme tous les NDA) utilise la pile de lapplication hte. Dailleurs dans le cas des accessoires, il faut consommer la pile avec le plus de modration possible, car on ne sait pas rellement combien de place est disponible dans lapplication qui nous hberge; si lon est un gros consommateur, il faut envisager de sallouer sa propre pile au moment de louverture. Dclaration des prototypes ========================= Lorsquon utilise le mcanisme de prototype, il est dusage de dclarer toutes les fonctions constituant le programme dans un fichier header (de suffixe .h), quelles soient appeles avant ou aprs leur dfinition. Ainsi, on est sr que le compilateur pourra dtecter toutes les erreurs ventuelles. Cest ce qui est fait pour les fonctions de la librairie C, dans chacun des fichiers header correspondant la famille dappartenance de ces fonctions. Je vous rappelle que la directive lint permettra de vrifier que toutes les fonctions dfinies dans un programme ont bien t dclares. Ainsi, en les dclarant dans un fichier header, on sassurera dun maximum de cohrence du programme. Ce sont en effet les erreurs de dclaration/dfinition/appel de fonction qui sont la source de pratiquement tous les plantages des programmes C, puisquelles provoquent en gnral une corruption de la pile qui, sur le GS, est fatale. Paramtres ========== Javais volontairement omis de dfinir toute la terminologie se rapportant aux paramtres. Cependant, je me suis dit aprs coup que vous aurez forcment faire ces termes dans la littrature. Alors, voici un petit glossaire: On emploie le terme paramtre formel ou argument pour dsigner le type et la position dun paramtre lors de la dfinition dune fonction. Ceci signifie simplement que cet argument sera substitu par le contenu des variables correspondantes de la fonction appelante lors de lappel. Les variables passes une fonction lors de lappel cette fonction sont dsignes sous le nom de paramtres actuels ou plus simplement de paramtres. En fait, il ny a pas grand chose dautre dire de plus, par rapport ce que nous avons vu dans le prcdent article Dans la littrature, les 2 termes paramtre et argument sont parfois utiliss de faon interchangeable ou linverse de la dfinition prcdente. Jespre que vous voyez bien la diffrence entre les 2, et que cela ne vous pertubera pas outre mesure. Comme en C, les arguments sont passs aux fonctions de droite gauche, il peut sensuivre des effets de bords involontaires. Supposez par exemple que vous appeliez une fonction f(j,k) ainsi f(i,i++); si i valait 1 avant lappel, les valeurs des paramtres j et k dans la fonction f seront respectivement 2 et 1, ce qui nest certainement pas ce que vous espriez ! Bien entendu, cet exemple est simplifi lextrme, mais ce type de surprise peut vraiment se produire dans des situations relles. Allez, histoire de samuser un peu, je vais donner du pain aux dtracteurs de C ;-) Vous vous souvenez peut-tre que C dispose dun oprateur , dit de squence; je vous avais dit lՎpoque quon lutilisait essentiellement avec linstruction for. Or, la , est aussi employe pour sparer les paramtres dune fonction. C fait la distinction entre les 2 cas en fonction du contexte. Toutefois, chaque argument dune fonction pouvant tre en fait une expression, on pourrait envisager dutiliser loprateur , dans ladite expression. Comment le compilateur fait-il la diffrence ? Eh bien, il suffit de mettre lexpression en question entre (). Voyons sur un exemple, histoire dՎclaircir un peu ce charabia : f(z,(z=y+x,w=z-t)). Hum est-ce que cest vraiment plus clair ? En fait lexemple est simple : les 2 paramtres sont y+x et y+x-t, sauf que lon a sauv dans les variables z et w les rsultats intermdiaires; rappelez-vous que les paramtres sont valus de droite gauche, do la valeur du premier. Je vous ai montr cet exemple juste pour le fun; dans la pratique, on na jamais besoin de faire des choses pareilles Lordre dՎvaluation que je vous ai indiqu est le plus souvent lordre utilis, mais la dfinition du langage C ne le garantit pas, cest dire que la supposition de la valeur de z dans lexemple prcdent peut savrer fausse avec dautres machines ou dautres compilateurs; alors, vitez tout effet de bord ! En tout cas, vous pouvez imaginer combien lՎcriture dun compilateur C est autrement plus complique que celle dun compilateur Pascal. Paramtres variables ------------------- La possibilit davoir des paramtres variables, ainsi que lobligation davoir au moins un paramtre fixe au dbut de la liste des arguments sont lis au fait que les paramtres sont traits de droite gauche. La plupart des machines et des compilateurs utilisent la pile pour le passage des paramtres. Sur presque tous les ordinateurs, les adresses dans la pile sont dcroissantes. Donc le paramtre le plus gauche de la liste se retrouve empil le dernier et est donc le plus proche du pointeur de pile (si lon fait abstraction de ladresse de retour). On peut donc facilement obtenir son adresse et de l, accder tous les autres paramtres avec les macros va_start et va_arg. La dernire fois, je vous avais renvoy la doc pour de plus amples dtails. Je vais quand mme vous donner un exemple autre de celui quelle donne : short max ( short n, ... ) /* calcul du max de n valeurs */ { va_list argp; /* dclaration ptr liste paramtres variables */ short i, m; va_start ( argp, n ); /* initialisation du ptr sur paramtres variables */ m = va_arg ( argp, short ); /* 1re valeur donne le max provisoire */ while ( --n > 0 ) { i = va_arg ( argp, short ); /* valeurs suivantes : doivent tre des short */ if ( i > m ) m = i; } va_end ( argp ); /* nettoyage de la pile */ return ( m ); } Le seul inconvnient de ce mcanisme est quil interdit tout contrle de type et de quantit des paramtres par le compilateur. Par exemple dans lexemple ci-dessus, rien ninterdit dappeler max avec des entiers longs ou des rels. Il faut donc utiliser cette possibilit avec prudence. Dun autre ct, cest grce ce mcanisme que C dispose dune fonction telle que printf qui na pas besoin dutiliser dastuces particulires, et peut donc tre rcrite facilement, par exemple pour appeler QuickDraw. En Pascal, il est totalement impossible dՎcrire une fonction similaire write. Appel dune fonction =================== En C, lappel dune fonction est effectu en indiquant le nom de la fonction suivi de la liste des arguments entre parenthses. Comme en Pascal, il ny a pas de mot cl prcisant que lon effectue un appel de fonction. Dans les anciens langages, tels Fortran ou Cobol, lappel une sous-routine se fait en utilisant linstruction CALL. Il est trs important de noter que C se sert des parenthses pour distinguer lappel dune fonction de la rfrence une variable quelconque, notamment cause de lhistorique du langage. Je vous rappelle en effet quon nՎtait pas oblig de dclarer une fonction avant de lappeler; cՎtait le seul moyen pour le compilateur de faire la distinction. Par consquent, les parenthses sont obligatoires, mme lorsque la fonction na pas de paramtres. Lappel une telle fonction sera alors de la forme nom-fonction(). Retour dune fonction =================== Linstruction return, que nous avons vue dans le prcdent numro, permet de retourner la fonction appelante une valeur correspondant lՎvaluation de lexpression associe linstruction. La syntaxe est alors return (expression). Le rsultat de lՎvaluation de cette expression doit bien entendu avoir le mme type que celui avec lequel la fonction a t dclare. Si lexpression est omise, la valeur retourne sera quelconque et ne donnera pas le rsultat escompt; en gnral ce sera la valeur prsente dans le registre A au moment du return. Si la fonction a t dclare void, cest dire quelle ne retourne rien et se comporte donc comme une procdure Pascal, linstruction return est alors utilise telle quelle, sans prciser dexpression, sinon une erreur sera signale. La fonction effectuera un return implicite lorsque son excution atteindra l} fermant le bloc principal de la fonction. Ce cas ne sapplique que lorsque la fonction ne retourne aucune valeur. Le comportement tant identique celui du return simple, si la fonction doit retourner une valeur, celle ci sera quelconque (en fait ce sera la valeur du registre A ce moment), et provoquera sans doute une erreur de fonctionnement du programme. La fonction main ================ Dans mon prcdent article, je vous ai indiqu que la fonction main tait la premire excute dun programme C. Etant une fonction comme une autre, elle accepte des paramtres, sauf quils sont prdfinis par le langage. On les dsigne habituellement sous les noms argc et argv; le deuxime est un tableau de chanes de caractres, chacune de ces chanes correspond aux mots lists aprs le nom du programme (que lon retrouve dailleurs comme premire chane du tableau); le premier paramtre est le nombre dՎlments du tableau. Ces paramtres nont un sens que lorsque le programme est lanc depuis le shell et est de type EXE ($B5). Lorsquun programme est lanc depuis le Finder ou Prosel-16 ou depuis le shell si il est de type S16 ($B3), argc et argv sont inutilisables; argc vaudra 0 et argv NULL. Si vous vous rappelez de mon premier article, je vous avais prsent un programme qui imitait la commande echo du shell. En voici une nouvelle version bnficiant de ce que nous avons appris depuis : #include void main ( short argc, char *argv[] ) { short i; for ( i = 1; i < argc; i++ ) printf ( "%s ", argv[i] ); printf ( "\n" ); } Si je compile et linke ce programme sous le nom msg, et que je tape la commande msg Bonjour !, il me rpondra par Bonjour !. Si i avait dmarr , jaurais aussi eu le nom du programme affich, ventuellement avec le chemin si je lavais prcis. Un argument dun programme peut comprendre plusieurs mots, si ceux-ci ont t entours par des ". Toutefois, largument argv[n] correspondant ne contiendra pas les ". Tout ceci est ralis par le code du fichier .root gnr par le compilateur ORCA/C. Ce code initialise lenvironnement, cest dire quil alloue la pile comme indiqu au dbut de cet article, dcode la ligne de commande dans les paramtres argc et argv, ouvre les fichiers standard de C, stdin, stdout et stderr, en tenant compte des redirections ventuelles, et appelle la fonctionmain. Lorsque la fonction main retourne son appelant soit explicitement avec linstruction return, soit implicitement en atteignant l} finale, le code du fichier .root reprend la main pour faire le mnage : fermer les fichiers, librer la mmoire, et quitter vers le shell ou un autre lanceur de programmes. La fonctionmain peut retourner une valeur qui sera transmise au shell dans la variable denvironnement {Status} : par convention, on retourne si tout cest bien pass, et une autre valeur en cas derreur, la valeur -1 tant utilise pour indiquer une erreur gnrique. Un programme peut se dbrancher directement au code contenu dans le fichier .root suivant lexcution de la fonction main. Il dispose pour cela des fonctions de la librairie C exit, _exit et abort. La premire effectue le mme travail que lorsquun return est effectu depuis la fonction main. Le second rend la main au shell sans faire aucun mnage (toutefois, le shell ferme aussi les fichiers et libre la mmoire). Dans les 2 cas, on peut passer une valeur qui sera affecte la variable shell {Status}. Dans le cas dORCA/C, la troisime fonction est identique _exit(-1). Pour pouvoir bnficier pleinement de ces fonctions darrt, un programme peut aussi enregistrer une ou plusieurs fonctions qui seront excutes avant de rendre la main au code lment (cas spcifiques de la fonction find_node prcdente). Concatnation de 2 listes. Copie dune liste, avec ou sans copie des donnes (cest dire que les 2 listes pourraient pointer sur les mmes donnes; attention toutefois aux problmes que cela pose en cas de destruction dun nud). Comparaison de 2 listes, soit avec les lments la mme position dans chacune des listes, soit en vrifiant que les mmes lments existent dans les 2 listes, mme si ils ne sont pas dans le mme ordre. GS Infos dborde ---------------- Dans les Domaines Publics de ce mois, des logiciels et des exemples prvus pour initialement se trouver sur la disquette GS Infos 22: La disquette GS Club 237 : -les exemples en Micol Basic envoys par P.Bonnaure (Voir article Micol Basic) -Devlink GS de Lionel Saugrain, les documents permettant ceux qui dsirent rejoindre le groupe de dveloppeurs de Lionel de s'inscrire. La Disquette GS Club 248 : contenant le travail fourni d'Yvan Koenig, une disquette pleine! (VoiFGHIJKLMNOPQRLa production trs copieuse d'Yvan ne tenant pas sur la disquette (+ 700K) nous l'avons mise au catalogue du domaine public : disquette GS Club 248. Ci-dessous, l'article de l'auteur accompagnant la disquette. *------------- Cet envoi est assez copieux. *-------------- Tout dabord, trois fichiers systme placs dans le dossier France.6.0. Sys.Resources est la version francise du fichier bien connu. Je nai pas touch la ressource contenant le code (et hlas les messages) du miniLAUNCHER. Kbd.alt3 est linit qui permet aux GS-rom03 davoir accs au clavier francis. Ce fichier tant inutile sur rom01, il s'auto-purge sur ces dernires machines. En effet, suite ma demande, les auteurs du systme ont install dans TS2 la routine de gestion clavier dont nous avons besoin. De ce fait, aucun init nest requis sur rom01. CompileText.FR3 permet aux possesseurs de rom03 de disposer des chanes de substitution standard franaises (OK, Annuler, Oui, Non, Recommencer, Continuer). Comme Kbd.alt3 il se purge automatiquement sur rom01. Les propritaires de rom01 devront patienter pour bnficier de ce service sous une forme dfinitive qui suppose un rassemblage de loutil Window Manager (je ne veux pas heurter la susceptibilit dApple). Le NDA Patch.WindowMgr offre une solution provisoire. En outre il permet AlertWindow de fonctionner comme je le souhaite: si un bouton dune AlertWindow a pour libell Cancel ou Annuler il se verra attribuer lՎquivalent clavier ESC. Si lalerte contient un bouton libell CANCEL et un bouton libell ANNULER cest la surprise du chef (en fait je nai pas test ce cas dՎcole farfelu). Enfin, ce nda corrige une anomalie du systme due votre serviteur. Les gens de Cupertino se sont montrs tellement coopratifs quils ont mis en uvre presque toutes mes suggestions y compris le bug que contenait lune delles. Il nest pas utile douvrir le nda, le code utile est excut lors de son initialisation qui se fait lors de linitialisation dune application desktop. Les patches sont retirs lors de lappel _DeskShutDown. *-------- Le dossier Gratuits contient quelques classiques mis jour. Blue.Monk permet dsormais dafficher un fichier TDT AppleWorksGS en conservant la plupart des enrichissements (police, taille, style). Il suffit de presser OPTION en slectionnant le fichier. Je parlerai aussi de Stricto-Sensu qui au lieu dutiliser, comme prcdemment, une unique table interne, exploite dsormais la matrice de recodage active. De ce fait, les informations renvoyes sont correctes mme si vous avez choisi le mode USA ou Aucune (idem avec Deutsch ou Spanish dont il est question plus loin). La table de caractres est dsormais disponible sous deux formes: codes ascii en ordre croissant ou liste thmatique. *-------- Le dossier Sharewares contient quelques nouveauts. CAO.boy prsent en dtail par ailleurs est un nda apportant diverses extensions AppleWorksGS . Babel.nda offre, sous forme de NDA plusieurs fonctions de recodage que les utilisateurs de BlueMonk connaissent bien. Laide en ligne devrait tre suffisante. Conjugaisons est un nda qui vous dispensera de consulter le Bescherelles lorsque la conjugaison franaise vous pose problme. Si vous tes trs press, vous pouvez interrompre par ESC le dfilement des diffrentes formes. Je tiens prciser que le traitement du problme pos est largement inspir dun programme publi en 1982 par Jacques GOUET aux ditions PSI dans louvrage Le basic et lՎcole. AwGs.extras tait lorigine destin rester confidentiel car je doute que vous soyez nombreux souhaiter employer AppleWorksGS comme diteur de fichiers sources APW. Ladjonction dune fonction glossaire (chanes de 20 caractres maximum y compris TAB/CR ventuels) me semble susceptible dintresser un public plus large. Le dossier ConfigAwap (Awap tait le titre provisoire du nda) contient une application permettant tout utilisateur de crer un (ou plusieurs) fichiers glossaire correspondant ses besoins spcifiques. Jai choisi de renoncer pour ces produits ma tradition de bnvolat. AwGs.extras et lapplication associe, Babel.nda, Conjuguer.nda, CAO.boy sont des SHAREWAREs. Jespre que vous ne men voudrez pas trop et remercie davance ceux qui auront lՎlgance de rgler la somme demande en cas dutilisation effective. *------ Le dossier Tableurs contient une application permettant daider au transfert de tableurs AppleWorksGS dans le monde MAC. Dans un premier temps, slectionner, dans le module tableur, le mode . Enregistrer le fichier en mode . Cest le fichier texte ainsi cr qui pourra tre trait par Tableurs. Divers recodages sont disponibles. Le plus performant est le transfert vers EXCEL. Claris est moins hospitalier et ClarisWorks comme Resolve requirent des retouches finales assez lourdes mais, il me faut prciser que cest uniquement par fidlit lՎditeur dAppleWorksGS que le transfert vers ses produits est inclus. Cette fidlit semble hlas sens unique. Jaurais attendu de cet diteur un filtre de recodage plus complet pour les documents TDT et des filtres Tableur et MiseEnPage. *------ Builder permet tout un chacun de gnrer un fichier Sys.Resources correspondant ses besoins. Il efface dans une copie du fichier officiel US la description du menu Translation (Traduction), et y implante la description du menu complt et la ressource rKTransTable que vous lui fournissez dans un fichier ressource taill sur mesure. Vous trouverez dans le dossier, lapplication et les dossiers France, Deutsch, Spanish qui contiennent les sources au format APW-Rez permettant de gnrer la description du menu Traduction et la rKTransTable. La routine de gestion clavier dont nous bnficions nayant jamais t documente, je prcise ce qui la diffrencie de la version standard (cf ToolBox Reference volume3 pour loriginal). Si une touche de code XX compris entre 00 et 7f doit tre traite comme une touche morte, mettre ff l'offset XX dans la matrice et mettre loffset XX+$80 le code mort. Ainsi, la rKTransTable franaise dispose de trois touches mortes, savoir: circonflexe: offset $5e contient FF, offset $de contient 5e (^) grave: offset $60 contient ff, offset $e0 contient 60 (`) trma: offset $7e contient ff, offset $fe contient ac (). Yvan KNIG UUUUww莎舎莈 wwwUUUUUUUUwwwwwwqUUUUQUUUUwwwwwwwwqUUUUQUUUUwwwqwwwwqUUUUQUUUUwwwq舎wwwwUUUUUUUQwwww舎wwwwqUUUUQUUUUwwwq莈awwwwqUUUUUUUUQwwwqfa興   fawwwwqUUUUUUUQwwwwfffffawwwwqUUUUQUUUUQwwwwffff ffffawwwwqUUUUUUUQwwwwfffafffawwwqUUUUQUUUUwwwqffff舎  fffffwwwwqUUUUQUUUUwwwwfffaffffawwwwqUUUUQUUUQwwwwfffaffffwwwwUUUUQUUUUwwwqfffffffawwwwqUUUUQUUUUQwwwqffffaffffawwwwqUUUUUUYZ[\]^/L'interfaage entre AppleIIGS et Macintosh, l'utilisation en direct de pointless avec une DeskWriter, ces deux sujets prsents par J.Rey ont constitu le plat principal de notre runion du 23 Mai 1992. La fin de la runion a t consacre un change de questions et rponses entre Vincent Hmeury et les membres prsents propos de MultiSwitch et du Systme 6.0. Ci-dessous, l'article de J.Rey crit aprs la runion. PowerBook II, le retour. ************************ Je vous ai parl, la dernire fois, de l'utilisation du PowerBook 100 comme priphrique de notre cher GS en se servant du rseau Apple Talk. Ce Mac portable offre une caractristique tout fait particulire, il peut-tre raccord une autre unit via son interface SCSI. Il tait donc intressant de vrifier si cel fonctionnait avec le GS. Il faut donc se munir d'une interface SCSI Apple, d'un PowerBook 100 et de son cable de liaison spcial. Attention, il existe deux types de cables: celui qui permet tout naturellement de raccorder un disque dur au Mac portable ( rfrence HDI 30 M2538 LL/A ) et celui qui le transforme en disque dur ( rf HDI 30 M2539 LL/A ), c'est ce dernier qu'il nous faut. Sur le GS, il vous faut le systme 6.0 ou bien le 5.04 mais condition que vous ayez install le FST "HFS" dans le dossier /System/FST. Dans le menu "pomme" du Mac se trouve le tableau de bord "Portable" ( l'icne reprsente l'ancien Mac portable ), ouvrez-le et fixez l'identit du disque dur en fonction des autres lments dj prsents sur votre chane SCSI ( Le GS porte l'identit "7", votre disque dur de boot devrait-tre "6", donc toute autre valeur convient ), ensuite teignez le Mac et branchez-lui le cable SCSI spcial. Le raccordement de tout lment d'une chane SCSI doit-tre effectu toutes machines l'arrt sinon c'est le retour SAV assur, qu'on se le dise ! -Tout est branch ! bon et bien dmarrez le Mac. - ???? - Comment a se dmarre un Mac ?!, et bien tout simplement en appuyant sur la barre d'espace ( bon d'accord, a ne marche pas avec un LC ou un Classic ). Une icne reprsentant le N SCSI dfile lentement l'cran, c'est la seule activit que manifestera le Mac. Dmarrez votre GS et en principe vous devez voir le disque dur du Mac monter sur le bureau du Finder, si vous l'ouvrez vous pourrez constater qu'il s'agit bien d'un disque HFS ( c'est inscrit gauche de la fentre ). Vous pouvez le manipuler maintenant comme tout disque dur, charger par exemple directement les fichiers textes dans AppleWorks GS ou Teach Text ( ce dernier, qui appartient au GS OS 6.0, peut aussi charger directement un texte MacWrite 5.0 ). Quelques restrictions tout de mme, une application P8 ne peut-tre lance directement de ce disque: il faut par exemple la copier sur RAM 5 et la lancer ensuite; de mme le systme de votre GS ne peut s'y trouver car il ne peut en aucun cas devenir disque de Boot ( dommage ). L'accs est bien sr bien plus rapide que lors de l'utilisation d'Apple Talk, je n'ai pas mesur de diffrence notable entre un disque purementu&HUMEUR` ۸۸u,POMILLUSTREEh ۸+۸,u'SLG.SON2-`ܸ,ܸ,u(COURRIERl ܸ%ܸ%u-DOMAINEPUBLIC0ݸ9ݸ:uabcdefgDP Arrggh ! *********** Il y a deux mois j'avais senti le vent de la catastrophe et ma petite mise au point sur les principes du Domaine Public n'tait en fait que la copie conforme d'une lettre transmise l'un de nos nouveaux Adhrents qui avait l'air de confondre Club d'amateurs et socit commerciale. M'ayant quasiment mis en demeure - et par lettre recommande ! - de lui fournir des produits qui marchent sur son GS Rom 03, je lui avais transmis ce texte avec quelques recommandations plus personnelles par lesquelles je lui conseillais de prendre contact "gentiment" avec l'auteur du soft qui lui posait des problmes. Le coup n'a pas rat, quelques jours plus tard j'ai reu une lettre furibonde d'un auteur - J. Liautard dit 'Jihailde' - fort mcontent du gentil recommand lui rclamant la solution au problme de notre cher Adhrent. Nous voil donc privs de la diffusion des DP 166, 167, 214, 215, 216, 217, 218, 219 et 220 que nous retirons de notre catalogue en regrettant ce malencontreux problme car ces disquettes avaient beaucoup de succs auprs de tous ceux qui s'occupent de jeunes enfants. Les DP ne sont certainement pas des softs parfaits mais pour comparer ce que l'on nous rclame ce que fournissent contre fort grosse quantit de monnaie des socits de logiciels, je vous invite lire le texte de la garantie applique par Apple elle-mme ( n'y voyez pas une critique de la socit la pomme, ce texte est quasiment identique chez tous les diteurs ): APPLE N'OFFRE AUCUNE GARANTIE, EXPRESSE OU TACITE, CONCERNANT CES LOGICIELS, LEURS QUALITES, LEURS PERFORMANCES OU LEUR CAPACITE A SATISFAIRE A QUELQUE APPLICATION PARTICULIERE QUE CE SOIT, EN CONSEQUENCE CES PROGRAMMES SONT VENDUS EN L'ETAT ET L'ACHETEUR ASSUME TOUS LES RISQUES EN CE QUI CONCERNE LEUR QUALITE OU LEUR FONCTIONNEMENT. Et ils ajoutent: LES GARANTIES STIPULEES CI-DESSUS SONT LES SEULES ET UNIQUES GARANTIES ACCORDEES PAR APPLE SUR SES PRODUITS. Cette dernire phrase est savoureuse puisque la seule chose qui soit garantie ces que justement rien n'est garanti !. Bon je vais cesser de faire couler mon fiel sur ces pages lectroniques et je vais tout de mme vous demander de bien vouloir m'excuser pour le retard pris ces derniers temps dans l'expdition des commandes mon boulot m'ayant rclam moulte prsences tardives et, de plus, nous nous sommes trouvs en rupture momentanne d'approvisionnement en disquettes. Une nouveaut dans nos DP, la disquette 177, qui tait la dmo de la pile des Rois de France, se subdivise maintenant en DP 177, 177 bis et 177 ter, c'est dire l'intgralit de la version 1.0 de cette ralisation de Desseaux Jean-Pierre. Il s'agit d'un Shareware (90F), si vous commandez ultrieurement la nouvelle et superbe version 3.0 qui vaut 150 F, vous pourrez dduire le montant du paiement de la version 1.0. La version bta de "arbre dis mois ton nom", que nous concocte Jean-Pierre, nous promet une uvre particulirement digne d'intrt. Ah ! encore un petit mot de dernire minute ! Ne m'expdiez aucune nouvelle demande de DP avant le 20 Juillet car je ne prends plus les quelques vacances mrites qui taient prvues, mais je m'occupe d'organiser la reconstruction de l'usine o je passe le temps que je ne consacre pas au GS et qui a eu la mauvaise ide de brler en partie juste avant mon dpart !!! ( je vais donc tre trs occup pendant quelques temps, toutes mes excuses ). Jacques Rey ijknel. Au sommaire : Editorial en souvenir de Michel Vivarelli dont nous saluons aussi la mmoire, GSphile tu dans l'accident stupide du stade Furiani . Un appel aux sponsors pour donner la Pomme Illustre les moyens de continuer. Une interview de Bandit II. La carte quadriphonique de J.Rey devenue Octophonique. La Ram Keeper par Dalat. Des trucs et astuces: le moniteur et son entretien. Dmineur d'HackerCroll. Langue d'ocs 8, dernire dition. Nouvelle Cyberneto Appleienne par Dalat. Hit Parade des Softs GS. Essai de Kangaroo. La norme Midi Suite et ralisation. Pour ou contre 32K de cache sur la TransWarp. Solution de ManHunter. D.Melchior Nous avons demand AZEBULON de nous envoyer un petit article de prsentation de l'oeuvre d'ADN, le voici: Depuis la mort des revues telles GOLDEN, TREMPLIN MICRO ou POM'S, un petit groupe de trois personnes : AZEBULON, DOUME et NIBBLE (les premires lettres de ces pseudo forment le nom de leur groupe,ADN) a cr une revue nomme LA POMME ILLUSTREE. Ce fanzine est destin en priorit aux possesseurs de GS mais peut tout aussi bien tre lu par tout possesseur d'APPLE IIE puisque des articles concernant cette machine sont prsents. D'autres part des articles d'intrt gnraliste mais toujours orient vers l'informatique rende cette revue accessible tous. Ce fanzine est distribu par correspondance en envoyant AZEBULON ou DOUME une envmnopqr BLANCHETON Patrick Suresnes le 15 Juin 1992 28, Avenue Jean JAURES 92150 SURESNES Et oui encore une mise jour de Startup, linit, cest presque aussi pire quՈ la grande poque dAppleWorks GS. Quy a til de nouveau dans la nouvelle version 1.6 ? Tout dabord la version prcdente se voulait compatible System 6. elle lՎtait mais du coup elle devenait incompatible System 5., je men suis aperu en linstallant sur ma partition encore sous System 5. (par scurit !). Le bug tait provoqu par lappel de la nouvelle fonction _ShowBootInfo inexsistante sous System 5.. Ce bug est dfinitivement fix !. Ensuite et surtout, trois (3) images peuvent tre maintenant tires au sort (quel luxe !), les chemins daccs se trouvent bien entendu dans des ressources que lhypothtique nouvelle version de StartConfig saura diter. (les chemins par dfaut sont Startup.Screen1 2 et 3) Il y a galement maintenant une ressource de type rComment et dID $2 qui permet laffichage dune alerte lorsque lon double clique sur lՔcone dans le Finder 6. Un petit conseil au passage, la routine qui affiche les cones des Inits et CDEVs au boot se moque bien du fond sur lequel elle dessine ces cones, elle utilise simplement la palette en cours. Sil y a beaucoup dՔcones afficher et que cela dborde droite il y aura un effacement des cones dj affiches en redessinant le fond laide de la couleur de base, chouette si cest le bleu habituel plutt tarte si cest une image. Moralit il faut, pour cela reste prsentable, que lorsque Startup a la main dans le boot quil ne reste quun nombre dՔcones reprsentant la largeur de lՎcran, un certain tri est donc faire dans le dossier System.Setup. Note, Startup dessine son cone par dessus lՔcone prcdente (en fixant 1 le bit 31 du pointeur sur lՔcone, merci GS+) ce qui fait gagner un rang. Salutations amicales et GSPhiles. Patrick Blancheton PS1 (beurk) : Sur la disquette se trouve la dernire version de dveloppement de StartConfig pour la plaisir de jouer avec les nouvelles options. Rien nest finalis, donc il est possible quil y est des bugs (je les connais, jai les noms !) Bis PS1 (re) : il y avait un outil de trop (NoteSynth) lanc au boot de StartConfig grce la ressource ToolTable, ceci provoquait une diction bizarre du message nonc lorsque lon clique sur le copyright dans la fentre daide.Jai cherch pendant TRES longtemps do venait le problme; fix. Remarque il faut avoir install les Talking Tools (50,51,52,53) pour bnficier de la diction ! La nouvelle version de StarUp se trouve sur la disquette DP Utilitaires systme 6.0 : GS Club 238. UUUUQwwwwfffaffffwwwwUUUUUUUUQwwwwffffafffawwwwqUUUUUUQwwwwfffaffffawwwwqUUUUUwwwwffff  ffffwwwwUUUUQwwwwfffa ffffwwwwqUwwwwfffaffffawwwwqwwwwqfffaffffwwwwqwwwwwfffaffffwwwwwwwwwfffaffffwwwwwwwwqffffffffwwwwwqfffa....ffffwwwwqffffffffawwwfffa,.ffffffff,,,,,,,...ffffafffff,,,,,,,.ffffffffffa,,,,,,,.fffffffff.,,,.,..   fffffff fffff   fff              ....,.   ,..,..... , ,  .   ,   ,,.,  ,. ........    ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`?ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`?fDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`?fDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`fDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`fDnDD`?fDnDD`?fDnDD`fDn;0 ;;DD`fDn0 ;;DD`fDn; ;;DD`?fDn0 8;;;88DD`fDn80; ; ;00080 0DD`fDn0;;;;000 DD`fDn0;;;;;000 8DD`fDn80;; ;00080 ;DD`fDn80; 8;;800 DD`fDn;DD`fDn;`fDn;`fDn;;;;; ; ;;; ; `fDn ;`?fDn  0`?fDn;; ; ; ;0 ;`fDn ;  ;0 `??fDn `fDn; ; ;; `fDn`fDn`fDnDD`fDnDD`fDnDD`fDnDD`fDn.DD`DDDDDDDDDfDn.DD`DDDDDDD@fDn..DD`DDDDDDDfDn.DD`DDDDDfDn..DD`DDDfDn..DD`DDDfDn.....DD`@fDn .....DD`fDn....DD`fDn....DD`fDn....DD`fDn.....DD`fDn..DD`fDn. ..DD`fDnDD`fDnDD`> Le coin hard et soft \N3 ==Programmation 3 (suite)\N421.==Programmation 3\N420==Le C 5me Bis\N419==ApwGS 8me partie\N417==Le Son\N416==Resource\N415>> Initiation \N2== Annonces \N512.== Courrier\N513== SolidarSoft\N510== Le 23 Mai\N509== La Pomme Illustre\N508== Micol Basic 4.0\N507== Humeur\N506== Trucs et Astuces\N505== Revue de Presse\N504== Dernire\N503== Editorial\N502>> Sommaire \N5== Quitter\N411*Qq. == Rserv aux non-membres\N402== Imprimer un article\N401>> Fichier \N12>>@\N0X==A propos de GS Infos...\N400==-\N401D. ;8[i """"""""""""H""{i+k ;8[i{iH(XJ"HH{iH "h"{iHhn}J"{iH H """ :""":""""F:"zz"""i:"qq""(:"(("2:""P:""Fi:""}:"":"99"H"h "{i+kFCertains portions of this software are copyrighted by TML Systems,Inc.(c)-1987 TML Systems,Inc.GSclubCMaintenez le bouton de la souris enfonc et appuyez sur une touche.BP.Manet, D.Melchior, T.J. Morris, D.Ottello, J.Rey, SLG, B.Tomeno.HAzebulon, P.Bonnaure, Dalat, J. Destelle, Y.Gobin, V.Hemeury, Y.Koenig Editeur:&Pour quitter un article avant la fin :Ont particip ce numro :GGS Infos n22,le magazine du GS pour les membres du club exclusivement.Vu ;8[idݭ : i ݢ:"""ɢd,:"" """"H"hH "h={iHJ"{iHU" {i+k-Pressez une touche pour continuer la lecture. ;8[iHHH "hۆݩۍݍ" ,"j "N%  "$&(*,.02468:<>@BDFHJLHH "hHH""",:"""$$"""HH "{i+k2Cliquez la souris pour quitter l'article. ;8[i{iH((XdJ"HH{iH "hۆۢ" :"" """:"[["-:""7:""{iH(7J"{iH H "H"hۢ "{i+kVuAchoisissez une fonte approprie ou supprimez les retours chariots@Les fichiers sont des fichiers de type texte avec fonte tendue.?Rcuprez le fichier avec un traitement de texte et imprimez-le Vous voulez imprimer un article: ;8[i#"#""{i+k"Le Basic System 1.4 et ses patches"/GSINF.22/ARTICLES/BasicS.et.Pat.2 ;8[i"~~""{i+kInitiation par P.Manet/GSINF.22/P.Manet/prog.1.intro ;8[i""(""{i+k'Initiation aux resources par J.Destelle!/GSINF.22/articles/RESSOURCES2.mw ;8[i!"{{$""{i+k#L'exploration de A.Bonnet continue. /GSINF.22/articles/awgs.ta08.TXT ;8[i&&!"(""{i+k'La liste des disques du domaine public /GSINF.22/articles/domainepublic ;8[i"""{i+kLe C cinquime Bis par P.Manet/GSINF.22/P.MANET/Init.C.5.bis ;8[i''$"&""{i+k%Programmation 3me partie par P.Manet#/GSINF.22/P.Manet/prog.3/prog.3.deb ;8[i""""{i+k!Du mauvais usage des DP par J.Rey/GSINF.22/articles/humeur ;8[i++"(""{i+k'Une application envoye par T.J.Morris /GSINF.22/T.J.MORRIS/ROSE.BAS ;8[i" "{i+k/GSINF.22/ARTICLES/ ;8[i""""{i+k!Les freeware et shareware du mois/GSINF.22/Articles/LES.PLUS ;8[i  ii""{i+kProgrammes de J.Destelle. /GSINF.22/ ;8[i "!""{i+k Un logiciel crit par J.Destelle/GSINF.22/ministel/ministel.doc ;8[i$"KK5""{i+k4Suite de l'initiation la programmation par P.Manet#/GSINF.22/p.manet/prog.3/prog.3.fin ;8[i+"""{i+kUn article de P.Manet*/GSINF.22/P.MANET/HIST.CAL/HIST.Calendrier ;8[izz"aa""{i+kUn article de P.Bonnaure/GSINF.22/articles/Micol.bas ;8[i"""{i+kSolidarSoft par D.Ottello/GSINF.22/articles/Solidarsoft ;8[i] ] "U W Y [ "{i+kl'dito/GSINF.22/articles/editorial ;8[i #" )""{i+k(A propos du DP GS Club 248 d'Yvan Koenig"/GSINF.22/articles/sur.fichiers.yk ;8[i]!]!"B!B!""{i+kLes trucs et astuces du GS/GSINF.22/articles/trucs ;8[i!!"!!""{i+kDigitalisation and Co par SLG /GSINF.22/articles/SLG.son ;8[iJ"J"",","""{i+kLa revue de presse de Y.Gobin/GSINF.22/articles/PRESSE.22 ;8[i""""""""{i+k!Suite la runion du 23 Mai 1992/GSINF.22/articles/le.23.mai ;8[i=#=#""#"#""{i+kUne lettre de P.Blancheton/GSINF.22/articles/courrier ;8[i##"##""{i+kLes petites annonces/GSINF.22/articles/ANNONCE ;8[i$$"$$""{i+kUne traduction de Babar/GSINF.22/articles/shoebox.txt ;8[i$$"z$z$""{i+kLes dernires nouvelles/GSINF.22/articles/dernieres ;8[i%% "$$-""{i+k,Prambule de D.Melchior article de Azebulon /GSINF.22/articles/pomillustree ;8[i{iH"J"{iH4545"{iH44"{iH44"{iHq4q4"{i'H0404"{iGH33"{igH33"{iHm3m3"{iH,3,3"{iH22"{iH22"{iHi2i2"{i'H(2(2"{iGH11"{igH11"{iHe1e1"{iH$1$1"{iH00"{iH00"{iHa0a0"{i'H 0 0"{iGH//"{igH//"{iH]/]/"{iH//"{iH.."{iH.."{iHY.Y."{i'H.."{iGH--"{igH--"{iHU-U-"{iH--"{iH,,"{iHP0J"HH{iH "hHH"{iHixJ"HH{iH ,,H "{iHJ"{i{iHH{iHHH """:",,":",,"#:"\,\," SYSTEME, VOUS AVEZ DIT SYSTEME... Le systme 6.0 est arriv mais il n'est toujours pas distribu en France. La socit Brjoux n'en a pas l'autorisation pour le moment. Le GS Club a demand le droit Apple France de diffuser les disquettes du systme selon le principe de la copie gratuite. Aux Etats-Unis, tous les Apple User Group ont le droit de le faire, mais il parat que la loi n'est pas la mme outre atlantique.Nous attendons une rponse et nous vous la communiquerons dans GS Infos 23. Quoiqu'il en soit, le systme minimum dont un GS doit tre quip est la version 5.04 de GS/OS. Les domaines publics que nous pouvons trouver ne fonctionnent souvent plus qu'avec au minimum cette version. Les derniers utilisateurs du 5.02 doivent imprativement franchir le cap. D.Melchior. Dr article Y.Koenig) BrainStorm SoftWare ------------------ Tous ceux qui sont alls Beauvais et une bonne part d'entre vous ont reu les plaquettes de prsentation des logiciels Transprog III et Kangaroo1.3. Nous devions les joindre notre envoi, hlas, elles ne nous sont pas parvenues avant le bouclage. (Voir la Revue de Presse de Yannick pour la prsentation de ces deux logiciels) O se procurer le systme 6.0 ----------------------------- Aux USA, hlas... auprs de celui qui fournit tous les produits de dveloppement pour Apple II. Chez : Resource Central PO Box 11250 Overland Park,KS 66207-1250 USA Catalogue de juillet 1992 Rfrence DA-006 : Apple GS/OS System 6 $24 Rfrence DA-013 : Apple Sys.6w / User Manual $39 ( ne pas commander ce produit pas encore prt, il ne sera envoy que lorsqu'il sera disponible) Rfrence DA-029 : Apple System 6 Golden Master CD ROM $99 ( vous devez disposer d'un lecteur de CD Rom sur Apple II ou Mac) Par carte Visa ou MasterCard. Le port vous sera factur en sus et peut-tre 23.5 % de taxe d'importation si vous tombez sur un douanier zl. Beauvais -------- Beaucoup de monde, beaucoup de GS, plus qu' n'importe qu'elle Apple Expo Franaise depuis qu'elles existent. La prsence d'Yvan Koenig et des dmonstrations de premire qualit o dominaient : la vision 3D avec lunettes anaglyphes de Paul Lafonta et Vincent Hmeury et un jeu en rseau Mac et GS runis " Full Metal Planet" prsent par Franois Uhrich. Une fte digne des 15 ans de l'Apple II. Un article beaucoup plus exhaustif dans le prochain GS Infos. dfauts. Ceci termine pour le moment cet article sur Micol Advanced BASIC. Si vous souhaitez me voir aborder d'autres sujets a propos de ce langage, si vous souhaitez faire des commentaires, crivez moi en BAL MICOL sur 36.14 RTEL1 ou RTEL2 ou 36.15 RTEL. ou encore par l'intermdiaire du GS CLUB.  !"#$%&'(res Systme 6.0 Dj des indispensables pour ce nouveau systme et seulement pour lui. Startup de Blancheton pour 6.0 (5.0 aussi), Quick Launch freeware de Seven Hills qui ajoute un mini lanceur sous forme de menu, Quit-To v.2.0 shareware de Karl Bunker, lance l'application en passant par dessus le Finder, AutosMenus v.2.0, InitMaster, Custom GSOS qui permet de changer le message au boot, des patchs et des infos. Systme 6.0 seulement. GSCLUB 239 : rSounds Chaque vnement du nouveau finder peut-eloppe format A4 timbre 11F plus un chque de 10F minimum ou plus pour nous soutenir afin de couvrir un peu les frais de photocopies. Vous pouvez aussi envoyer une enveloppe non timbre avec chque de 21F. Les adresses de Azbulon et de Doume sont ci-aprs. Cette revue est faite par des passionns pour des passionns. Ne manquer pas de lire cette revue et n'hsitez pas soutenir ADN par vos dons. Vous pouvez contacter AZEBULON dans sa BAL en 3615 RTEL; AZEBULON : ROUYER Grard 20 Impasse sous les Prs 94110 ARCUEIL DOUME : Dominique LEBAS 33 RUE JOSEPH NOIZE 93190 LIVRY GARGAN -:"D,D,"7:",,"A:"",," K:"++" U:"++" _:"r+r+" i:"I+I+":"" + +"H"hHH "{i+k;GS CLUB 6 Impasse la Croix Pommier 94120 FONTENAY-SOUS-BOIS(Le GS Club est une association loi 1901.3Si vous ne dsirez pas devenir membre, effacez-la .8Cette disquette est l'organe de liaison interne du club.0GS Infos et ses articles ne sont pas du public, ATTENTION)Vous recevrez GS Infos tous les deux moisDes s publics gratuits.'Vous bnficierez des services du club.Cotisation annuelle : 360 F..Pour recevoir GSInfos, devenez membre du club!Vu@0000000000000000000000000000000000000000000000000000000000000000@0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0@0F000000000000000000000000000000000000000000000000000000000000F0@0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFF111111F111111FFFFFFF111111FF11FF1111111FF1111111FFF0F0@0F0FFFFFF11111111F111111FFFFFF11FFFFFF11FF11FFF11FF11FFFF11FF0F0@0F0FFFF1111111111F1111111FFFFF11FFFFFF11FF11FFF11FF11FFFF11FF0F0@0F0FFFF1111FF11111F1111111FFFF11FFFFFF11FF11FFF11FF11FFFF11FF0F0@0F0FF11111FFF11111FF111111FFFF111111FF11FF11FFF11FF1111111FFF0F0@0F0FF1111FFFF1111FFFF11111FFFFFFFFFFFF11FFFFFFFFFFF11FFFFFFFF0F0@0F0FF1111FF111111FFFF11111FFFFFFFFFFFF11FFFFFFFFFFF11FFFFFFFF0F0@0F0F11111FF11111FFFFF11111FFFFFFFFFFFF11FFFFFFFFFFF11FFFFFFFF0F0@0F0F11111FFFFFFFFFFF11111FFFFFFFFFFFFF11FFFFFFFFFFFFFFFFFFFFF0F0@0F0F11111FFFFFFFFFF11111FFFFFFFFFFFFFF11FFFFFFFFFFFFFFFFFFFFF0F0@0F0F11111FFFFFFFFF11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0F11111FFFFFFFFF11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0F11111FFFF1111F11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FF1111FFFF1111F11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FF1111FFFF1111F111111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FF11111FF11111F1111111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFF11111111111FF11111111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFF11111111FFFF1111111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFF1111FFF11FF1111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFF1111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFF11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFF111111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFFF11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFFFF11111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFFFFF1111FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFFFFFFF11FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0@0F000000000000000000000000000000000000000000000000000000000000F0@0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0@0000000000000000000000000000000000000000000000000000000000000000 ;8[iߥ߂""" """"""""""{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""8r0 6H`555x7x7x7x7x7x7x7x75x755555x7555x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x75x7556 666 6x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7'6.656<6C6J6Q6X6_6f6m6t6 ,"{i+;ik ;8[i H{iH"hͥ͂ "   {i+k ;8[i""""""""""{i+kH;i{HH ;[ H "H"hHHH "hhH "HHHH "hhe: "kHH ;[HH"HH""" d&y)H "h "Ԣ"""H"8kHH"h"kHH"k0;8 ;[H"h#H({iH "h%)))XHH "h: ) )d   +;i08k"k ;[ 0 1 :T+  ;i k ;[ k l e:e::D+  ;i k ;[   :0 )   h)+H   ;i(k HH;[H"h H "    hh+;ik ;[HH""+;ik ;[0  +  ;i k ;[0  +  ;i k ;[0   +  ;ik ;[  Ȁ +  ;ik ;[  Ȁ +  ;ik ;8 [  d) e )e     ;e i ;[907301 )80'e     +  ;ikHH ;[ d0b) W  gF @ e )e)8 0  ):  +;ik HH;[ F0D @0>)8 04  8 8  e :e   hh+  ;ik H;[d 8 2 )    8 ) h+  ;ik {cH;[hh+hk {cH;[ JJJ -)0 0 0 0 0 0 0  hh+hhk {cH;[  :JJJ 1)0 0 0 0 0 0 0  hh+;ik{cH ;[ +;ik{cH ;[ I7+;ik{cH ;[ 7+;ik ;[   (+;i (k ;[I7   (+;i (k ;[ I7  (+;i (k ;[ jjjjjjjj +;ik ;[JJJ+)0 0 0 0 0 0 0 7    (+;i(k H;[IIʩ FeI+k H;[ I Iʀ f  8 F F I+kcck8k H;[IIIIʀFf ee&IIhhhh+k H;[ I I IIʀ&&ff !  8  FfFfͥ  IIzzzzzz+kIIkIIk##kkCCkIIk8 # zz(k *kJjkjjjk***k;8 ;[  {iH "{iH{i H " +;ik;8 ;[  {iH "{iH{i H " +;ik;8 ;[H({iH "h+;ik;8 ;[H({iH "h)+;ik ;[:"hH "h::H:"+;ik;8 ;[{iH "{iHU""+;ik;8  ;[{i H)" 8   {iHU"+;i k;8 ;[{i H)" 8d  "zH"HHg"h{iH ~"h"+;ik;8 ;[{i H)" 8d  "zH"HHg"h{iH~"h"+;ik ;[) eH0"+;ikHHH ;[ HHHHH &"  Ȁ8: ))e:  +  ;ikHHH ;[H HHH HH '"  Ȁ 8: ))e:  +  ;i k;8% ;[$ &{i$H-H+H{iH "{i$H{iH1H/H "+'+&*;i)k ;[HHH)H ("h +;ik ;[HHHH)H )"h h +;ik;8& ;[.H,H{iH{iH{iH "{iH2H0H "+(,'+;i*kHHH ;[ )f A [8Ai a {8ai 80))  J ) J) +  ;i k""""""""""""""""""""""""""""""""33333333333333333333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffffffffffffffffffffffffffffffffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww ;[;8 ")) )))));i+;ik ;[ HH H HHH "+  ;i k ;[;8")) ;i+;ik ;[;8" ;i+;ik ;[;8+" ;i+;ik ;[HHHHHH H$"h hhh+;ik ;[;8 " ;i+  ;ik ;[;8 " ;i+  ;ik ;[;8 " ;i+  ;ikHH;iHHHHHڢ "hhk    hhZ"HHkHHHH "hk ;[  "ኇ+ ;i k   ;[Z z Z"+hhhk . &     ;[Z z Z"+hhk ;[ ڢ "+  ;ik ;[  "+  ;ik   ڢ "+  ;ik ;[ " +hhk;iHHHڢ "ኃhhk ;[d  +hhk ;[ȗȥ @ȩ+hkH "hk ;[ "  +hhkHH "hhkH "hk;iH "hk "  k H H H H "(p0   ;ik;8  ;[dd\:"hi ) A[i     + ;ik;8 ;[$&{iH"` V$&") d d dd{iH"$&{iH"(+$#;i"k;8$ ;[HH,*"hH,*."h222202 2 2 22 2.)dHHH" "h!#%#2%2# {iH" 22+&2%1;i0k;8 ;[$$G$dd{iH"$$$$$ $$ + $#;i"k;8( ;[HH0."h! " "666646 6 6 66 62)AHHH" "h!#!%!'%6'6 66H0.2"h)6)66646 6 6 66 62)_HHH" "h!#!%!'%6'6) {iH" 666dd{iH"+*6)5;i4k;8 ;[  ' dd{iH"   + ;ik;8 ;[$$A${iH"$$HH""+ $#;i"k;8 ;[$& " {iH"+$#;i"k;8 ;[ "{iH"+ ;ikk;8 ;[  < $& d {iH"L  +$#;i"k;8 ;[  < $& d {iH"L  +$#;i"k;8 ;[$$n$HHHH$H " "hh {iH"${iH"{iH"+$#;i"k;8 ;[  2 {iH" H"zz$&+ ;ik ;[) +;ik;8 ;[$$$$$) d {iH"L $+ $#;i"k;8  ;[&&& d {iH"!&&  &!L &+"&!%;i$k ;[) +;ik ;[ HH"+;ik ;[ HH"+;ikHH ;[   ȥ  "+ ;i kHH ;[  )   "+;ikHH ;[    ȯ   ȯ   "+ ;i ktruefalseHHHHH ;[HHHHH &"  Ȁ 8 : ) )e:   "+  ;ikHHHHH ;[HHHH HH '"  Ȁ 8 : ) )e:   "+  ;ik;8) ;[//3 (3*(5 *{i(H9H7H{iH "{i(H{iHHH "5/1"++7*6;i5kHZHH ;[ 80,* )e)     HH"%  ȷ ȷ HH" +kHH ;[   ") "+  ;ikHH ;[   "  ) "+ ;i kHHHH ;[":e   Ȁ :    +  ;ikHH ;[   "%HHeHژ8 ("h "+ ;i kHH ;[   " ,HHHeHژ8 )"hh "+ ;i k;8* ;[0002"LHH{iH{i H{i H "{i H6H4H "02"+,4+3;i*kZHH ;[ "N)   Ș "Ȁػȷ)  Ȁ阠+hhhhkZ ;[ )? HH"% ȷȷ HH"+kZ ;[ ) )   +k;8 ;[d)  : )) H"h{i H)"{i H "H{i H{i HO"h)HH:" HH")j{i H)"H i H:" @HHg"{i HHH H H~"h"H 8 H:"HH "h)5HH "h)!HH ")  "+;ik;8< ;[BB)) H"h{i H)"{i1H "H{i H{i1HO"h)HH:"d{i H)"  i{iHV"᩼ {iHV"᩼ H({iH "hХ ɥ) {iHU" H i H:"႑v8pI9) {i H)"H H"8hH H:" 8 i{iHU"H"  B5 HHg"{i1HHH H H~"h"H 8 H:"Ⴋd;HHH "hhh=H ""h9) 4;Ȅ;  "= "BN&; " " ";;Ȅ;  9 ";f) B +>B=A;i@k;8 ;[d)  : HH " " +;ikprinter: console: keyboard: J88 95 @ DOc h^k`n^q` ^`    ``    q t wz}     ee\     ^`( +/^2`G Q T^W`ep s~ ^`  {g~g     ee\  :/ 47:=LORyUyX[a:eyhyknqtwz     ? BFQ [:}  yy:yy  !'-03= @CM UX    : :=@ C I:M P S V Y \ _ b q<ux:l l Y Y G G . .                 <:m m \  \  M  M  3  3           / <3 6 E :I L O R U X [ ^ a  d  s <w z  :                        +  0 3 ?  P  ]  h  u  *  4  >  H  R  \  f  p  z                 4 JMe r          zz    0 3q6q@ M ] `(c(m }         99   /  6 9 < F ILV r     yD:   ^r {y~y    "$&(*,. 02468: <#>&@)B,D/F2H5J8L>NAPGRMTSVYX\Z_\dgq v y|        $$                [[ ) ,/9 I LOY x    yy::IMyPySV\:`cf~i~o:sIyy::IJyMyPSY:]`c{f{l:pIyy&&::ITyWyZ]c:gjmpv:zIyy''::IXy[y^ag:knqtz:~Iyy++::IVyYy\_e:iotIyy::I!y$({+/}269=BFKNQiTiZ:^Iyy::Iyy #):-03K6K<:@Iyy::I0y3y6z9z?:CFIaLaR:VIyy::I y y! ] $ ] * :. U 2 5 W 9 < Y @ C [ G J I y y   :     : I!y!y!]!!]! !:$!'!*!B!-!B!3!:7!I!y!y!!!!!:!!!!!!!:!I!y!y"J""J" ":""","","":!"It"yw"yz""}""":""""""":"I"y"y"=#"=##:## #"# #"##:#If#yi#yl##o##u#:y#|######:#I#y#y#$#$#:###$#$#:#II$yL$yO$$R$$X$:\$_$b$z$e$z$k$:o$I$y$y$%$%$:$$$$$$$:$Ic% p%45s%45v%H%4%4%H%4%4%H%q4%q4%H%04%04%H%3%3%H%3%3%H%m3%m3&H&,3&,3&H$&2'&2*&H8&2;&2>&HL&i2O&i2R&H`&(2c&(2f&Ht&1w&1z&H&1&1&H&e1&e1&H&$1&$1&H&0&0&H&0&0&H&a0&a0&H' 0' 0'H'/'/'H('/+'/.'H<']/?']/B'HP'/S'/V'Hd'.g'.j'Hx'.{'.~'H'Y.'Y.'H'.'.'H'-'-'H'-'-'H'U-'U-'H'-'-'H(,(, (H*( H( l( ( (,(,( ( E) R) _) o) r),u),) ) ),),) ) )\,)\,) ) )D,)D,) ) ),),) * * *,"*,,* <* ?*+B*+L* \* _*+b*+l* |* *r+*r+* * *I+*I+* * * * +* +* * + 5 5W5:%5b55@55v!5=5G55 55z 56I 666"6)6 06<$76!>6!E6KL6#S6$Z6g"a6h6#o6Y#v6"666565656x76x76x76x76x76x76x76x7656x765656565656x76565656x76x76x76x76x76x76x76x76x76x76x76x76x76x76x76x76x76x76x7656x76565666 666666 66x76x76x76x77x77x77x77x7 7x7 7x7 7x77x77x77x77x77x77x77x77x77x7!7x7#7x7%7x7'7x7)7x7+7x7-7x7/7x717x737x757x777x797x7;7x7=7x7?7x7A7x7C7x7E7x7G7x7I7x7K7x7M7x7O7x7Q7x7S7x7U7x7W7x7Y7x7[7x7]7x7_7x7a7'6c7.6e756g7<6i7C6k7J6m7Q6o7X6q7_6s7f6u7m6w7t67 7b7 7u57b8!8n8y!8%808 38y78-;87?8 M8 R8 [89`89k8 8 98 988888 989898 99898$99)99:9 9B9 9K9 9_999 999999 9 9 9 :9 :9 : : : : : ::::;3;;4;D:E>A E>AZEDEAED^FAdFDFZIFZIMMMMMMMMPgP>AQgQgQYRP+R`Q2RY>SYSPSfSfT`QTYUYVYeVYVYVYWYcWYWYWY=XYNXxBXYWYYYYYYY]\7Z]\hZZnZZvZZ~ZZZZZZZ]\*[]\[]\J\]\\X\\\\\\\\\_]_:]_S]_]_]_^_A^_|^_^_^_%__`___X________oaaraa|aYa`aaneYebeegY&gf:g`Ngb ;[ I)K)M)O)Q)): I) +;ik;8 ;[     : pr ie H  HH H"2+ H) H1 H"* :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  ) ,@ ~global ;[ I)K)M)O)Q)): I) +;ik;8 ;[     : pr ie H  HH H"2+ H) H1 H"* :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  ) A vendre : - Carte contrleur pour disques 5"1/4 : 100F - Big U (utilitaires ProDOS 8) : 50F - Arlequin (dessin double haute rsolution) : 100F - Copy II+ : 100F - Prosel 8 : 100F - VSDraw : 200 F - GSPaint : 100F - Graphic Studio : 100F - ShadowGate : 100F - MacroMate : 200F - SoftSwitch : 200F - Graphic Exchange : 200F Philippe Manet 40 rue Victor Hugo 94700 Maisons Alfort Tl : (1) 43.76.61.08 aprs 19h A vendre: Carte 1 Mga 500F Hyperstudio complet 600F VS Draw 200F Salvation 200F Prosel 150 F ou les trois 500F Jeux 5.1/4 Sorcellerie, Mandragore, FlightSimulator, RV With Rama le Crime du Parking le tout pour 500F Procode et Version Calc pour 200F Envois contre remboursements Albert PAIN 7. Rue de Haute Serre 31130 BALMA Tl : 61 24 32 99 A vendre : - Numros de la revue Toolbox-mag 1-2-3-4-5-6...250 F les 6 ou 50 F l'un (avec 7 disquettes d'accompagnement) - Numros de la revue POM'S n 42-45-46 ....... 40 F les 3 ou 20 F l'un - GS/PAINT (logiciel graphique)......... 100 F original avec doc en franais Les frais de port sont compris. BRUTIN Pierre 24, Chemin des Vignes BRESSON 38320 EYBENS tel: 76-25-43-52 A vendre: 1 Carte d'extension Apple 1 Mo 300F 1 Carte d'extension RAM Plus 6 Mo quipe de 3 Mo 1500F 1 Carte Z80 Microsoft pour IIe 200F 1 Disque Dur Vulcan 20Mo avec sa carte contrleur 2500F 1 Moniteur Couleur Apple IIGS 600 F 1 Carte PC Transporter avec carte couleur 2000F 1 Lecteur PC Transporter 5.25 900F 1 carte contrleur Apple pour 2 lecteurs 5.25 250F 1 Carte Acclratrice ZIP 8Mhz IIGS 1000F 1 Carte Speedisk 1Mo Thot (Ram Sauvegarde) 1000F 1 Joystick Apple 200F 1 Modem Universel Apple Sectrad + VS Com 1500F 1 Ventilateur Interne IIGS 150F et d'autres choses encore... Nombreux logiciels originaux IIe et IIGS avec leur Doc Guy Muret Tl province: 50 93 53 20 tre bruit de faon particulire. Vous trouverez dans cette disquette 50 sons et bruits varis mettre dans le Sound Folder de votre systme 6.0. Systme 6.0 seulement. GSCLUB 240 : IRC Player N1 Lancez l'application player et coutez les musiques de votre choix. Musiques faites avec SoundSmith :Unbelievable, Get the balance right, Day at the Beach, Bach 538, Split Dmo, Nuclus, Pressure. Doc sur le disque, systme 5.04 minimum. GSCLUB 241 : Utilitaires divers Pot pourri d'utilitaires divers dcouvrir. Init : Skull.Cursor, Start.Logo ( de Dale Rodgie, affiche un logo dans l'image de boot, freeware,dos et sources incluses, systme 4.0 minimum), AutoMenu 1.12 ( de Jay M.Krell, simplifie l'usage des menus droulants, shareware $5, doc, systme 5.04 minimum), Remove.CDA (de Jay M.Krell, doc). CDA : Quit.to ( de Karl Bunker permet de passer d'une application P8 une autre, shareware $10, doc), TechSupp, Beyond NDA: Ack, HavokNDA, Sculley NDA, Solitaire, Panic, Grass, Eyes, ShowPic 6.1. Animations : Super.magic, Weird, Power, Power II Applications : SuperCat (de Cecil FretWell, alphabtise le catalogue,shareware $10 , doc), SF.Get ( de Karl Bunker, utilitaire ampersand pour AppleSoft, doc) Disk.Labeler ( de Dale Rodgie, template pour faire des tiquettes de disquette, requiert le systme 5.04 et AppleWorks GS 1.1, doc), Floor ( de Karl Bunker, jeu de pavage, shareware $10, doc), Mod.Utils (de Ian Schmidt, conversion de sons de l'Amiga vers l'Apple IIGS, freeware, doc) FinderView II : de Brian Clark, permet de voir les images en les ouvrant directement , shareware $10, doc. GSCLUB 242 : Computer Keyboarding de Charles Hartley Apprentissage du clavier et de la frappe. En anglais, disque autobootable seulement, mode texte ProDos 8 et HGR, doit tre utilis sans protection contre la copie. GSCLUB 243 :Gyrus Desktop Utilities En provenance d'Australie toute une batterie d'utilitaires: une calculatrice, une horloge, un joueur de sons digitaliss, un compteur pour souris, un conomiseur d'cran une balle rebondissante, un labyrinthe, un copieur de resources, des utilitaires de chargement d'init, de fontes et d'accessoires au vol,un changeur de type de fichier un formateur rapide 3.5, etc... shareware, docs incluses, systme 5.04. GSCLUB 244 : UtilityWorks GS 2.0 programme de G.R.Wilde GSCLUB 245 : UtilityWorks GS 2.0 documentation la version pour systme 6.0 de ce programme trs connu d'utilitaires disques,fichiers, impressions, dition de texte etc... Shareware $20 GSCLUB 246 : The Castle 1 par Sheldon Davids GSCLUB 247 : The Castle 2 Aventure sous forme de pile HyperStudio, la Home Stack se trouve sur le premier disque, l'ouvrir avec une version d'HyperStudio 2.1 minimum. GSCLUB 248 :Y.Koenig , complments GS Infos 22 n2 Une disquette pleine des travaux d'Yvan Koenig : Sys.Resources est la version francise du fichier bien connu. Kbd.alt3 est linit qui permet aux GS-rom03 davoir accs au clavier francis. CompileText.FR3 permet aux possesseurs de rom03 de disposer des chanes de substitution standard franaises. Le NDA Patch.WindowMgr Blue.Monk permet dsormais dafficher un fichier TDT AppleWorksGS Stricto-Sensu qui au lieu dutiliser, comme prcdemment, une unique table interne, exploite dsormais la matrice de recodage active. De ce fait, les informations renvoyes sont correctes mme si vous avez choisi le mode USA ou Aucune. CAO.boy est un nda apportant diverses extensions AppleWorksGS . Babel.nda offre, sous forme de NDA plusieurs fonctions de recodage que les utilisateurs de BlueMonk connaissent bien. Conjugaisons est un nda qui vous dispensera de consulter le Bescherelles AwGs.extras, AppleWorksGS comme diteur de fichiers sources APW. AwGs.extras et lapplication associe, Babel.nda, Conjuguer.nda, CAO.boy sont des SHAREWAREs. Le dossier Tableurs contient une application permettant daider au transfert de tableurs AppleWorksGS dans le monde MAC. Builder permet tout un chacun de gnrer un fichier Sys.Resources correspondant ses besoins. GSCLUB 249 : Fontes 1, 15 Fontes TrueType pour PointLess NEUSANSBLACK, PALATINO, KENNON, TIMES, LONDON, RANSOMNOTE, BOOKMAN, POSTCRYPT ALBATROSS, ELGARRETT, CRILLEE, MONACO, SLABFACE, LOMBARDOBENEVEN, BRIGHTONBOLD GSCLUB 250 : Fontes 2, 21 Fontes TrueType pour PointLess WILTONIAN, LOWEREASTSIDE, DICKENS, MIDDLETON, KATHLITA, AVANTGARDE,CASTLEFONT JUMBALAYA, ANDROMEDA, THOMAS, OSWALDBLACK, BASTARDA, BCHANCERY, BODIDLYBOLD, LOWERWESTSIDE, MONTAGUE, STYLE, GRAPHICLIGHT, PLAYBILL, ALEXANDRIA, KIDDIEKORNER GSCLUB 251 : Fontes 3, 26 Fontes TrueType pour PointLess MIAMINIGHTS, BLACKFOREST, FORMALSCRIPT, STYMIELIGHT, PHOENIX, GENOAROMAN LAUDERDALE, MACHUMAINE, MIAMIDEMI, SAINTFRANCIS, GRANITE.SANS, RODCHENKO TRIBECA.CAPS, BLACKCHANCERY, LEFTYCASUAL, PIXIEFONT, PREMIUM, CLASSICAITALIC INKABOD, LILITH.LT, POLO.SEMISCRIPT, STALINGRAD, FAUSTUS, LYNZFONT, MAZAMA, INFORMAL GSCLUB 252 : Europile Pile HyperStudio de prsentation du GS Club pour Beauvais. Cette pile contient le sommaire de tous les GS Infos du 1 au 21 et la liste des domaines publics de la disquette 1 235. IIGS avec2 Mo de Mmoire Vive minimum GSCLUB 253 : Pile USA de Pintore Jeu sur la connaissance des USA, en franais. Pile Hypercard, ncessite HyperCard GS 1.1 et un GS avec 2 Mo de mmoire vive. 4545t65454545t65t65t65t65t65t65t65t65t65t65t65t65t65t65t65t65t65t65t6545t6545455555555555t65t65t65t65t65t66t66t66t66t6 6t6 6t6 6t66t66t66t66t66t66t66t66t66t6!6t6#6t6%6t6'6t6)6t6+6t6-6t6/6t616t636t656t676t696t6;6t6=6t6?6t6A6t6C6t6E6t6G6t6I6t6K6t6M6t6O6t6Q6t6S6t6U6t6W6t6Y6t6[6t6]6#5_6*5a615c685e6?5g6F5i6M5k6T5m6[5o6b5q6i5s6p56 6b6 6q46b7!77#7(7 +7/7J37677T E7 J7 S77X77c7 y7878777778777778 878787!87288:88C88W888887878 8 8 89898 8 9 9 9 9 9999 :+::,:C9C6@D6@RDCDy@DCVEy@\ECERHERHLLLLLLLLO fO6@OfOfPX QO#QXP*QX6RXROReReySXPSXTXTX]UXUXUXUX[VX{VXVX5WXFWpAWXOXXXXXXXU[/YU[`YYfYYnYYvYY|YYYYYU["ZU[ZU[B[U[[|W[[[[[[[[[^\^2\^K\^x\^\ ^]^9] ^t]^] ^]^^^X^^^W^^^^^^^^g``j``t`X`_``fdXdaddeXfe2f_Ffa ;[ I)K)M)O)Q)): I) +;ik;8 ;[     : pr ie H  HH H"2+ H) H1 H"* :    A+;ik;8" ;[(@ ,@ ~global ;[ I)K)M)O)Q)): I) +;ik;8 ;[     : pr ie H  HH H"2+ H) H1 H"* :    A+;ik;8" ;[(@**d(*)ȷȷ)ȷ)Ȅe2 4  )*R format GS et celui du portable. Un dernier mot, quand vous avez fini votre travail, le seul moyen d'arrter le Mac est d'appuyer sur les deux petits boutons ronds situs sur le ct gauche. Encore un bon exemple de cohabitation, is n't it ? J. Rey