OSN͏p N ON S`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ @ ` @ ` @ ` ǀ ɠ @ ` ٠ @`@o!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !B!b!!!!!"!""#B"%b"'")"+"-"/#179#;#=#?$A"$CB$Eb$G$I$M$O%Q"%SB%Ub%W%Y%[%]%_&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(o((((()")B)b))))"*B*b***`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ @ ` @ ` @ ` ǀ ɠ @ ` ٠ @`@o!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !B!b!!!!!"!""#B"%b"'")"+"-"/#179#;#=#?$A"$CB$Eb$G$I$M$O%Q"%SB%Ub%W%Y%[%]%_&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(o((((()")B)b))))"*B*b***QFORTH68K  iGFA BAS DESKTOP INF   .  i..  iFORTH68KDOC jCOMMAND FTH bDEMO FTH  ESSAI FTH GFORTH68KMAP g FORTH68KTOS mMESSAGE FTH  MUTIL BLK VERSION 1_9 ~.  k..  kFORTH_10DOC mFORTH__1DOC  7FORTH__2DOC FORTH__3DOC zAFORTH__4DOC FORTH__5DOC ļtFORTH__6DOC Ǽ~FORTH__7DOC μ0wFORTH__8DOC ռ*FORTH__9DOC ټ1ORIGINE DOC ݼb - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 18/03/87 - BIBLIOGRAPHIE - Le Forth que vous venez d'acquerir a ete developpe pour le microprocesseur MC68000 de Motorola qui equipe la serie des Atari-ST d'ou son nom FORTH68K. Il utilise la puissance et les caracteristiques particulieres de ce microprocesseur a la compilation et a l'execution de vos programmes. Contrairement a la majorite des Forth implante sur micro,le code produit est directement executable par le MC68000. De plus,ce code est optimise c'est a dire que le compilateur examine le texte source et recherche la meilleure maniere de le traduire en code MC68000. Ceci est effectue de facon completement transparente pour l'utilisateur. L'ecriture,l'enchainement,le passage des parametres au niveau de la description des mots restent identiques aux autres Forth. Cependant,l'examen du code produit ne permettra pas de retrouver la traduction fidele du texte source a cause de l'optimisation. Ces caracteristiques uniques le rangent dans la classe des veritables compilateurs avec optimisation automatique. Des comparaisons avec les autres implementation de Forth ST montrent que FORTH68K est des maintenant jusqu'a trois fois plus rapides et cela ira en s'ameliorant dans les versions ulterieures. Ceci etant dit,il est impossible de conseiller a l'utilisateur des ouvrages traitant des particularites internes de ce Forth dont le premier critere de realisation a ete la rapidite des mots compiles ce qui a implique une implementation differente des autres Forth. Cependant,le programmeur qui utilisera ce Forth en enchainant des mots, en passant les parametres par les piles ou les variables ne percevra pas de differences par rapport autres Forth.La seule difference reside dans le code produit a la compilation qui est transparent pour le programmeur dans la majorite des applications. Une difficulte (mais on s'y habitue assez vite) reside dans le fait que les adresses sont sur 32bits (2 emplacement dans la pile) et que les valeurs de calcul peuvent etres simple precision soit 16bits (1 emplacement dans la pile) ou double precision soit 32bits (2 emplacement dans la pile). Des mots specialises permettent de travailler dans chaque precision. Quelques conseils de Lecture Forth -" 1> FORTH Par SALMON/TISSERAND/TOULOUT Editions Eyrolles Ouvrage bien ecrit qui est le seul a expliquer clairement et completement le concept de Vocabulaire. Bien qu'un peu trop concis,cet ouvrage aborde tous les aspects du langage de facon tres progressive et tres pedagogique. 2> FORTH POUR MICROS Par Jean-Marie DE GEETER Editions Eyrolles Ouvrage qui aborde Forth du cote applicatif. Effectue un parallele entre les langages Forth et Basic. De nombreux programmes pour Jupiter-Ace qui necessiteront une adaptation pour fonctionner sur Atari-ST. 3> TOURS DE FORTH Par Marc PETREMAN/Michel ROUSSEAU Editions Eyrolles Des programmes pour ORIC-1 , HECTOR HRX , SPECTRUM Peu Interressant pour FORTH68K et pour comprendre le fonctionnement de Forth. Aborde trop succintement le nouveau standard Forth F83. 4> FORTH Manuel d'application par M.S. EWING Editions Masson Ouvrage ecrit par quelqu'un qui a implante Forth sur micro. Le seul ouvrage qui traite tres succintement de l'implantation sur MC68000 dont je me suis inspire pour FORTH68K. Utile pour effectuer l'implementation et la comprendre,peu utile pour l'utilisateur de Forth. Ouvrage pour les Forthiens convaincus. 5> DEMARRER EN FORTH Par Paul CHIRLIAN Editions du PSI Le meilleur ouvrage pour aborder l'etude de Forth. Cet ouvrage est vraiment indispensable pour aborder progressivement Forth.Un peu verbeux (Auteur Americain),c'est neanmoins la bible des FORTHIENS debutants. En un mot,cet ouvrage merite son titre. 6> PROGRAMMER EN FORTH Par Alain Pinaud Editions du PSI Etude simplifiee de Forth. Tente d'inculquer la philosophie du langage et sa pratique. Un ouvrage sans pretention. 7> Le CONCEPT FORTH Par Pascal Courtois Editions du PSI Ouvrage traitant du MetaForth. Un ouvrage peu Interressant. 8> PROGRAMMER LE FORTH Par Robert Van Loo Editions Marabout Un bon ouvrage,bien fait,d'un style d'ecriture assez plaisant. Methode progressive qui couvre toutes les possibites de Forth avec de tres courts exemples. Un ouvrage de base,a recommander. 9> INITIATION AU FORTH Par le SEFI Editions Cedic/Nathan Ouvrage d'initiation au Forth sur les ordinateurs THOMSON 10>FORTH MANUEL DE REFERENCE Par le SEFI Editions Cedic/Nathan La bible FORTH pour les ordinateurs THOMSON. Ouvrage pedagogique,comme tous les ouvrages Nathan. Quelques conseils de Lecture ATARI -" 1> LE LIVRE DU GEM SUR ATARI-ST Editions Micro-Application Ouvrage complet sur GEM , le premier de la serie des Micro-Application Indispensable. 2> LA BIBLE DE L'ATARI-ST Editions Micro-Application Ouvrage sur le hardware de l'ATARI et le systeme d'exploitation TOS Decrit parfaitement les appels au systeme d'exploitation depuis l'assembleur.Quelques erreurs ... 3> AU COEUR DE L'ATARI-ST Par Laurent BESLE Editions EYROLLES Ouvrage un peu succint qui veut decrire completement l'ATARI : le Hardware,le TOS,GEM .... en moins de 300 pages. 4> CLEFS POUR ATARI-ST SYSTEME DE BASE Par Daniel MARTIN/Guy HERZET aux editions du PSI Dommage que cet ouvrage consacre trop de pages aux langages fournis par ATARI qui sont obsoletes : BASIC et LOGO Un bon ouvrage tout de meme,tres structure. 5> CLEFS POUR ATARI-ST GEM Par Daniel MARTIN Editions du PSI Tres bon ouvrage sur GEM et les fonctions graphiques,tres structure. A posseder absolument. -5 < - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 01/02/87 - PRESENTATION = Le Forth que vous venez d'acquerir est une pre-version de ce qui deviendra avec le temps et la collaboration de tous un veritable outil de developpe- ment sur ATARI-ST .Il possede des particularites qui devrait le faire surpasser en rapidite,en souplesse,en interactivite toutes les autres implementations de Forth sur microprocesseur MC68000 : 1> Ce Forth est un veritable compilateur puisque le code produit lors de la compilation d'un mot est directement executable par le 68000 , contrairement a la plupart des interpreteurs Forth qui produise du code semi-compile. 2> Ce Forth compile "inline" les mots dont la section code est courte pour eliminer tout temps systeme . Au lieu de compiler un deroutement vers un mot predefini , Forth recopie la section code du mot predefini dans le mot en cours de definition . Ceci est veritablement tres important pour les mots tres courts ( + - DUP ...) dont le temps systeme serait superieur au temps utile proprement dit . 3> Ce Forth optimise le code produit (pratique inedite a ma connaissance) c'est a dire qu'il tente de supprimer le passage par la pile des donnees lorsque cela est possible , comprimant ainsi le code produit et surtout reduisant ainsi les temps d'execution. 4> Ce Forth utilise pleinement les vecteurs d'exception MC68000 pour intercepter les erreurs d'execution qui provoquent normalement un "plantage" et l'apparition des fameux champignons atomiques. Ceci permet d'eviter presque toutes les fausses manoeuvres de l'utilisateur et d'aider a la recherche des erreurs. 5> Ce Forth possede une pile de chaines de caracteres avec des mots de haut niveau permettant une programmation aisee des manipulations de chaines. 6> Ce Forth permet de definir une infinite de pointeurs en memoire avec predecrementation ou postincrementation. Deux de ces pionteurs sont ultra-rapides puisque ce sont des registres du microprocesseur MC68000. Les autres sont pratiquement aussi rapides sous certaines conditions qui seront explicitees. 7> Ce Forth possede un mini-editeur dans la ligne de commande qui permet de ne pas reecrire la derniere ligne de commande et d'y apporter les corrections necessaires. 8> Ce Forth integre un veritable editeur de fichier texte qui permet de ne pas sortir de l'environnement Forth lors de l'entree d'un texte source. Note: - Les Forth ont une predilection pour la gestion des programmes sources par blocs.Ce Forth utilise des blocs de 2048 bytes ( au lieu de 1024 ) ce qui permet d'utiliser la pleine capacite des ecrans actuels (25 lignes de 80 caracteres). L'editeur de bloc inclus dans ce Forth a ete developpe sur et pour ecran monochrome haute resolution.Il fonctionne aussi en moyenne resolution mais pas en basse resolution. Toutefois, il est possible d'utiliser des editeurs de texte classiques pour creer un fichier texte source de longueur variable. Compatibilite avec : editor.prg ( MODULA-2 ) edit.prg ( GST-C ) 1stword.prg ( 1STWORD ) textomat.prg ( TEXTOMAT-ST ) > PREAMBULE <" A>Quelques MOTS pour eviter l'appui sur le bouton Reset -7 Notations: \ (barre division inversee) et ce qui suit est du commentaire. represente l'appui sur la touche de ce nom. . Represente le travail en cours. - Les majuscules et les minuscules sont reconnues et differenciees Les mots Forth suivants doivent etre ecrit en majuscules - La liste des mots du vocabulaire de contexte ( FORTH a l'entree ) est affichee a l'ecran par : WORDS sur imprimante parallele par: PRT WORDS VDU - Le retour au bureau GEM est obtenue par: BYE B> UTILISATION DE L'EDITEUR DE BLOC INCORPORE -- Exemple de sequence de travail sur fichier x.BLK Appuyez sur la touche pour valider la ligne de commande. $" MUTIL.BLK" $FOPEN \ Ouverture du fichier utilitaires multiples 1 BLIST \ affichage du bloc 1 a l'ecran . \ . \ Les touches de fonction permettent l'edition et . \ le chargement d'un bloc quelconque existant . \ 1 BLOAD \ Chargement du bloc 1 10 BCREATE \ Creation du bloc de numero 10 10 BEDIT \ Edition du bloc 10 (voir BEDIT) 10 BLOAD \ Chargement du bloc 10 . \ Eventuellement correction par BEDIT . \ BACKUP \ Sauvegarde des blocs modifies,le fichier reste . \ ouvert . \ FLUSH \ Sauvegarde du fichier MUTIL.BLK sur disque avec . \ ses modifications et fermeture de ce fichier. BYE \ Retour au bureau gem L'extension Forth MUTIL.BLK definit de nouveaux mots qui permettent une manipulation aisee des blocs.Ces mots sont documentes dans le bloc "directory editeur-blocs" et ses dependences. rem: Pour utiliser un fichier qui ne se trouve pas dans le drive actif (voir Quit) faire preceder nom du fichier de: A:\ ou B:\ etc exemple1: $" A:\MUTIL.BLK" $FOPEN exemple2: $" B:\MONPROG.FTH" $FLOAD C>TOPOGRAPHIE MEMOIRE FORTH - Les adresses de chargement sont variables et dependent de la presence du TOS (Tramiel Operating System) en ROM ou non,du nombre d'accessoires de bureau,du ramdisk utilise .... -Forth est charge en memoire depuis le bureau GEM a l'adresse la plus basse disponible.Les adresses relogeables du noyau sont ensuite transformees en adresses absolues. -La memoire disponible entre la fin du noyau Forth et la memoire ecran est ensuite calculee.Cette memoire doit etre superieure a 128Koctets sinon l'installation de Forth est ajournee. Les 125Koctets de fin de memoire sont rendus au systeme pour les allocations dynamiques de memoire. La memoire entre la premiere adresse libre apres le noyau et la zone memoire a allocation dynamique est appele Zone memoire allouee a Forth -Le pointeur de pile Return (registre a7 du 68000) est initialise a la plus haute adresse disponible juste avant la zone memoire a allocation dynamique. L'origine de la pile Return peut etre visualise depuis Forth par : RPO D@ UD. -Forth initialise DP (dictionnary pointer) a la premiere adresse libre juste apres le noyau Forth. DP pointe donc la premiere adresse disponible dans la zone des definitions.Le contenu de DP peut etre visualise depuis Forth par : HERE UD. -Forth initialise le pointeur de pile data (registre a6 du 68000) a l'adresse HERE+(2/3 de la zone memoire allouee a Forth) L'origine de pile data peut etre visualise depuis Forth par : SPO D@ UD. -Forth initialise le pointeur de pile de chaine (registre d7 du 68000) a la suite de la pile data. Cette pile de chaine va a la rencontre de la pile Return Schema memoire Ram : - Indique une frontiere fixe. ^ Indique une limite decroissante dans le sens des adresses. + Indique une limite croissante dans le sens des adresses. (xxx) Variable dont le contenu pointe sur la memoire. 0000.0000 - | Vecteur RESET | 0000.0008 |-| | Vecteur d'exception | | MC 68000 | 0000.0400 |-| | Variables systeme | | ATARI | 0000.0800 |-| | TOS (si RAM) | | Accessoires de Bureau | | Ram_disk | | . | USERTAB |-| | Variables FORTH | | #200 Octets | TIB |-|  | #256 Octets | PAD |-| | #256 Octets | HELLO |-| | | | NOYAU FORTH | | Assembleur | | MC68000 | | | | #30 Koctets | | | (NOP) |-| | | | Extensions FORTH | | Standards | | | |-| | | | Vos Definitions | | | HERE |+| | | | Zone Libre | | | (SP) |^| | | | i Pile de Donnees | | | (SPO) |-| ($PO) |-| | | | Pile de Chaines | | | ($P) |+| | | | Zone Libre | | | (RP) |^| | | | Pile de Retour | | | (RPO) |-| | | | Zone memoire | | a | | Allocation | | Dynamique | | 125KOctets mimimum | | | SCREEN |-| | | | Zone memoire Ecran | | 32 Koctets | | | 000F.FFFF - ou 0007.FFFF (512K) NOTA1 - Si l'editeur de blocs et les buffers sont utilises,32Koctets de memoire sont preleves dans la zone memoire a allocation dynamique. Le mot Forth FLUSH rends cette memoire au systeme. NOTA2 - Le mot INSTALL.FORTH permet de retrecir et de reconfigurer differemment la zone memoire allouee a Forth. D>FICHIERS RESERVES - Deux fichiers sont reconnus par Forth et charges automatiquement s'ils existent au lancement de Forth : 1>MESSAGE.FTH Contient tous les messages emis par Forth lors d'erreur ... Il est possible de le modifier ou d'y ajouter vos messages ou vos commandes. 2>COMMAND.FTH Contient ce que Forth doit effectuer apres le chargement du fichier MESSAGE.FTH . Ceci est tres utile pour charger vos propres extensions ou lancer automatiquement une application. Un troisieme Fichier est reconnu par Forth : MUTIL.BLK Contient l'extension standard Forth. Si le fichier COMMAND.FTH n'est pas trouve,Forth vous propose de charger ce fichier par appui sur les touches Contrairement aux deux autres fichiers .FTH , ce fichier est seulement editable par l'editeur de bloc incorpore. E>LE NOYAU FORTH - Le noyau Forth contenu dans le fichier FORTH68K.TOS a ete ecrit completement en assembleur pour des raisons d'efficacite. Seuls les mots indispensables ont ete inclus dans ce noyau pour le rendre aussi concis que possible. F>EXTENSION FORTH - Des extensions Forth sont contenues dans le fichier MUTIL.BLK. Ce fichier contient le texte source commente et peut etre lu,charge et modifie par l'utilisateur. Le chargement se fait automatiquement au demarrage de Forth par appui sur les touches ou par ecriture de la commande dans le fichier COMMAND.FTH. G>DEVELOPPEMENTS FUTURS - Forth sera installe sous GEM (Graphic Environment Manager) et permettra le plein acces aux routines graphiques : -Trace de ligne -Remplissage de figures fermees -Utilisation souris -Lutins (sprites) . ainsi qu'aux fonctions de haut niveau GEM. -6 - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 29/03/87 - DESCRIPTION DU VOCABULAIRE DU NOYAU FORTH -) 1>NOTATIONS UTILISEES - n : entier 16 bits signe (simple precision) -32768<=n<=32767 u : entier 16 bits non signe (simple precision) 0<=u<=65535 d : entier 32 bits signe (double precision) -2.147.483.647 <= d <= 2.147.483.646 ud : entier 32 bits non signe (double precision) 0 <= ud <= 4.294.967.295 w : mot 16 bits l : mot 32 bits adr : adresse sur 32 bits adr$ : adresse sur 32 bits Utilise pour marquer le debut d'une chaine de caracteres. L'octet a l'adresse adr$ contient la longueur de la chaine. Cette chaine se termine par le caractere de terminaison 0 . $ : Indique une valeur hexadecimale Ex : $FF pour 255 en decimal lfa : "link field address" nfa : "name field address" cfa : "code field address" && : marque pour debut d'explication d'un mot donne sera utilise par le mot Forth WHATIS pour lire les fichiers *.DOC depuis Forth pour aider le programmeur. WHATIS DUP \ L'explication du mot DUP apparaitra a l'ecran Ecriture du passage des parametres: MOT1 ( adr1 n1 -> adr2 _ ) L'execution de MOT1 depilera d'abord un nombre simple precision n1 puis une adresse adr1 et empilera une adresse adr2 comme resultat. MOT2 ( l1 -> _ ) L'execution de MOT2 depilera un mot 32bits. Particularites de certains mots -Seuls les mots presentant une particularite sont signales: Valide en execution mais pas en compilation,immediat . -Par defaut (d'explication),les mots sont : Valide a la compilation et a l'execution,non immediat 2>CONSTITUTION D'UN MOT - Vous tapez dans la ligne de commande : NOM . Le mot : fait appel a BUILDS Examinons la tete de mot Forth ainsi cree par BUILDS (voir ce mot) -un mot 16 bits (offset de chainage) ou 32 bits (pointeur absolu) est reserve .L'adresse de ce mot est le lfa (link field address) -un mot 16 bits (1er octet indicateur,2eme octet longueur du champ code de NOM) est reserve.L'adresse de ce mot est le nfa (name field address) Voir le mot NFA' pour la fonction de cet octet indicateur. -un nombre pair d'octets est reserve pour la codification ascii du nom. Le nom est precede de sa longueur (1 octet) et est suivi du caractere NULL (0) si le nombre de lettres de nom est pair. Ex: 4 octets pour NOM , 6 octets pour NOMS -Commence alors le champ code de NOM dependant des mots qui le definit. La premiere adresse de ce champ est le cfa (code field address). Examinons le champ code Il est directement executable par le MC68000 et doit se terminer par rts ( $4E75:compile par le mot ; ) pour le retour au mot de niveau superieur. Il est donc possible d'inclure de nouvelles definitions assembleur de la facon suivante : exemple de definition de + : + [ 301E , D156 , ] ; \ est la definition exacte du mot Forth \ + que l'on connait \ $301E move.w (a6)+,d0 \ $D156 add.w d0,(a6) 3>LISTE DES MOTS DU NOYAU FORTH - && ! ( w adr -> _ _ ) - Range w a l'adresse adr. Attention: adr doit etre une adresse paire,sinon le vecteur d'exception MC68000 numero 3 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot) . Ex: VAR X \ Creation de la variable simple precision X 2 X ! \ Rangement de 2 dans la variable X && # ( ud1 -> ud2 ) - Genere a partir du nombre non signe double precision ud1 un caractere ascii et le place a l'adresse contenue par la user_variable FLD. Le contenu de FLD est decremente d'une unite sauf erreur ou debordement. ud2 est le resultat de la division non signe de ud1 par le contenu de BASE.Le reste de cette division est transforme en un code ascii affichable place dans la chaine de sortie dont la position courante est pointee par le contenu de FLD. Si FLD pointe le premier octet de PAD,le code de debordement est emis a la place du code ascii calcule. Si FLD ne pointe pas un caractere de PAD,l'execution est stoppee et un message d'erreur est emis. && #> ( ud _ -> adr u ) - Termine le formattage pour une edition par TYPE. Nettoie la pile data et empile l'adresse de la chaine a editer,puis le nombre de caractere de cette chaine. && #S ( ud1 -> ud2 ) - Execute le mot # autant de fois que necessaire jusqu'a l'obtention d'un quotient (division de ud1 par BASE) nul : ud2=0 Tous les caracteres ascii sont places s _ ) - CHARGE la chaine de caracteres commencant a l'adresse adr. Cette chaine de longueur quelconque (non precede de sa longueur sur 1 octet) dit se terminer par le caractere nul de code ascii 0. Forth interprete cette chaine de caracteres : -Execute les mots en mode execution -Compile les mots en mode compilation. Il est possible d'imbriquer a l'infini (ou presque) les mots $LOAD Les user_variables STREAM,OFFS,BLK sont d'abord sauvegardees dans la pile Return puis chargees de la maniere suivante pour commencer l'interpretation a l'adresse adr : -La user_variable STREAM contient adr -La user_variable OFFS est mis a 0 -La user_variable BLK est charge avec le nombre negatif contenu par BLKTICK.Cette user_variable est ensuite decrementee de 1 unite. Un appel est effectue au mot Forth INTERPRET. Le contenu precedent des user_variables STREAM,OFFS,BLK est ensuite restitue. Ex1: $" 2 U. : MOT NOP ; " 1. D+ $LOAD Affichera 2 et definira un nouveau mot MOT. Ex2: 10 BLOCK $LOAD equivalent a 10 BLOAD au contenu de BLK pres. && ( ( _ -> _ ) - Mot immediat. Le mot ( indique que le texte qui suit est du commentaire jusqu'a la rencontre du caractere delimiteur ) . Si le caractere delimiteur n'est pas rencontre avant la fin de l'Input Stream,un message d'erreur est emis et ABORT est execute. Ce mot agit de la meme facon que l'interpreteur soit en mode execution ou en mode compilation. && (COMPILE) ( adr -> _ ) - COMPILE la subroutine pointee par adr. voir COMPILE && * ( n1 n2 -> n3 _ ) - Effectue la Multiplication signee de n1 par n2 et laisse le produit n3 sur la pile (toutes valeurs sur 16 bits). Controle de l'operation: -Le depassement de capacite (produit superieur a 16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && */ ( n1 n2 n3 -> n4 _ _ ) - Effectue la multiplication de n1 par n2,divise le produit obtenu par n3 et laisse le quotient n4 sur la pile . Les operandes n1,n2,n3,n4 sont des valeurs 16bits signes. Le produit intermediaire n1*n2 est calcule sur 32bits signes. Controle des operations : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && */MOD ( n1 n2 n3 -> n4 n5 _ ) - Effectue la multiplication de n1 par n2,divise le produit obtenu par n3 et laisse le reste n4 puis le quotient n5 sur la pile . Le quotient est donc en sommet de pile data. Les operandes n1,n2,n3,n4,n5 sont des valeurs 16bits signes. Le produit intermediaire n1*n2 est calcule sur 32bits signes. Controle des operations : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && + ( n1 n2 -> n3 _ ) - Effectue l'addition n1+n2 et laisse la somme n3 sur la pile (toutes valeurs signees sur 16 bits). Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && +! ( n adr -> _ _ ) - Ajoute la valeur simple precision (16bits) signee n au contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4 X +! \ X est une variable simple precision (voir VAR) && , ( w -> _ ) - Range w a l'adresse pointee par le contenu de la user_variable DP. Le contenu de DP (dictionnary pointer) est incremente de 2 unites. Le contenu de DP doit etre pair sinon le vecteur d'exception MC68000 numero 3 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT. && - ( n1 n2 -> n3 _ ) - Effectue la soustraction n1-n2 et laisse la difference n3 sur la" pile (toutes valeurs signees sur 16 bits). Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && -! ( n adr -> _ _ ) - Soustrait la valeur signee simple precision (16bits) n du contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4 X -! \ X est une variable simple precision (voir VAR) && . ( n -> _ ) - Affiche le nombre signe n sur le peripherique de sortie _OUT . La valeur affichee est precedee du caractere blanc si n est positif, du signe "-" si n est negatif. && ." ( _ -> _ ) - Mot reserve a la compilation. Compile le texte qui suit jusqu'a la rencontre du caractere delimiteur " L'execution du mot affichera le texte compile a la position courante du curseur sur le peripherique _OUT. Ex: : AFF ." C'est le meilleur Forth" ; && .( ( _ -> _ ) - Mot immediat valide a l'execution et a la compilation. Affiche le texte qui suit jusqu'a la rencontre du caractere delimiteur ) a la position courante du curseur sur le peripherique de sortie _OUT. Ex: .( C'est le meilleur Forth) && .R ( n u -> _ _ ) - Affiche sur le peripherique de sortie _OUT le nombre n precede du caractere blanc si n est positif ou nul,precede du caractere "-" si n est negatif,dans un champ de u caracteres (emplacement pour le signe compris). Si u>256 , un message d'erreur est emis. Si le champ est trop petit pour l'affichage du nombre,un caractere de depassement est emis en premiere position (gauche). && / ( n1 n2 -> n3 _ ) - Effectue la division signee de n1 par n2 (n1/n2) et laisse le quotient n3 sur la pile (toutes valeurs sur 16 bits). Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && /MOD ( n1 n2 -> n3 n4 ) - Effectue la division signee de n1 par n2 (n1/n2) et laisse le reste n3 puis le quotient n4 sur la pile (toutes valeurs sur 16 bits). Le quotient de la division est donc place en sommet de pile data . Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && : ( _ -> _ ) - Mot reserve a l'execution. Cree un nouveau mot dans le vocabulaire courant et l'interpreteur passe en mode compilation . Si le mot existe deja dans le vocabulaire de contexte,un message est emis mais la compilation n'est pas interrompue. Un appel est fait a BUILDS pour creer la tete de mot. Le contenu de la user_variable 16bits CSP (control stack) est mis a 0 . Le contenu de la user_variable 16bits INLNSAVE est mis a -1 . Le contenu de la user_variable 16bits STATE est mis a -1 . La user_variable 32bits DPSAVE est chargee par le contenu de la user_variable DP . Les mots ou les nombres qui suivent dans l'Input Stream sont compiles jusqu'a la rencontre du mot ";" par un appel a INTERPRET . Si il y a impossibilite de creer ce nouveau mot un message d'erreur est emis. Ex: : DEUX 2 ; \ Definit un nouveau mot DEUX \ chaque execution de DEUX deposera 2 sur la pile && :VAR ( _ -> _ ) - Cree une tete de variable de nom dans le dictionnaire. Aucun octet n'est alloue a cette variable . Il est necessaire d'utiliser ALLOT pour reserver des octets dans le champ code de la variable. A la creation : -Utilise BUILDS (voir ce mot) pour la creation de la tete de mot. -Aucun code n'est compile a la suite des codes ascii representant le nom de la variable. -Le bit_var est positionne a 1 pour indiquer a l'interpreteur que ce mot est une variable. A l'execution : -L'execution de entraine le depot du cfa (code field address) de sur la pile data Ex1: :VAR TABLE 256 ALLOT \ Cree une table de 256 octets \ L'execution de TABLE deposera l'adresse du \ premier octet de la table sur la pile data. Ex2: Une definition possible de VAR (creation de variable simple precision) serait : : VAR :VAR 2 ALLOT ; LATEST C@ %1011 AND LATEST C! \ Rends le dernier mot defini *\ valide seulement en execution && ; ( _ -> _ ) - Mot immediat reserve a la compilation. Indique au compilateur la fin de definition d'un mot et valide le mot en inversant le bit de validite du "name field" du mot. -Le contenu de la user_variable 16bits CSP est teste: Si ce contenu n'est pas nul,un message d'erreur est emis et la compilation est stoppee. Si ce contenu est nul,tous les branchements realises par les structures de commande (IFx_ENDIF .. ) ont ete resolus.Le bit_smudge du name field pointe par LATEST est alors inverse pour marquer ce mot comme valide. -La longueur en octets du champ code du mot defini est calcule: Si cette longueur est inferieure a 10 octets et si la user_variable INLNSAVE est a -1,alors le bit_inline du name field du mot pointe par LATEST est inverse pour marquer ce mot pour la compilation in_line. Si cette longueur est inferieure a 255,l'octet indicateur de longueur de champ code du mot pointe par LATEST+1 est charge par cette longueur. Sinon cet octet est mis a 0 . -Le code MC68000 rts (Return From Subroutin $4E75) est alors range a l'adresse pointee par la user_variable DP .Puis le contenu de DP est incremente de 2 unites. -L'interpreteur repasse alors en mode execution. && ;S ( _ -> _ ) - Stoppe l'interpretation du flot d'entree actuel. Retourne a l'interpretation du flot appelant. Utilise pour empecher l'interpretation d'une fin de bloc. && < ( n1 n2 -> w _ ) - w est le resultat de la comparaison signee de n1 et n2 . Si n1 est inferieur a n2 (n1 _ ) - Initialise le formattage pour une edition (voir # #S HOLD #>). La user_variable FLD est initialisee par l'adresse du dernier octet de PAD. Les conversions numeriques de sortie se font dans la zone de 256 octets minimum appelee PAD en commencant par la fin de cette zone et en progressant dans le sens des adresses decroissantes lors de l'execution des mots # #S HOLD. Ex1: Une definition possible de UD. : UD. <# #S #> TYPE ; Ex2: Une definition possible de D. : D. DDUP DABS \ valeur absolue <# #S \ Initialisation et conversion DSWAP D>= \ Flag vrai si nombre positif IFT BL ELSE $2D ENDIF HOLD \ Insertion de Blanc " " ou moins "-" #> TYPE \ Affichage ; && <= ( n1 n2 -> w _ ) - w est le resultat de la comparaison signee de n1 et n2 . Si n1 est inferieur ou egal a n2 (n1<=n2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && <> ( n1 n2 -> w _ ) - w est le resultat de la comparaison de n1 et n2 . Si n1 est different de n2 (n1<>n2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && _ _ _ ) -" Recopie u octets (8bits) de l'adresse adr1 vers adr2 en commencant par la fin ( utilise dans le cas de chevauchement de table). Les adresses adr1 ou adr2 peuvent etre impaires. Si u=0 , _ _ _ ) -! Recopie u mots 16bits de l'adresse adr1 vers adr2 en commencant par la fin (utilise dans le cas de chevauchement de table mais moins rapide que MOVE). Les adresses adr1 ou adr2 doivent etre paires sinon _ ) - RESOUDS un branchement arriere.Mot reserve a la compilation.  Lors de la compilation de REPEAT,UNTILx ... ,un branchement arriere (vers une adresse inferieure au contenu de DP) est compile : Bcc label. Le label (offset) est defini par la difference entre le contenu de la user_variable DP et l'adresse adr deposee precedemment par BEGIN ... Si possible,l'offset sur 8 bits est calcule et depose a l'adresse contenue par la user_variable DP moins un octet. Sinon,l'offset sur 16 bits est calcule et depose a l'adresse contenue par la user_variable DP.Le contenu de DP est ensuite incremente de 2 unites. && = ( n1 n2 -> w _ ) - w est le resultat de la comparaison de n1 et n2 . Si n1 est egal a n2 (n1=n2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && > ( n1 n2 -> w _ ) - w est le resultat de la comparaison signee de n1 et n2 . Si n1 est superieur a n2 (n1>n2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && >= ( n1 n2 -> w _ ) - w est le resultat de la comparaison signee de n1 et n2 . Si n1 est superieur ou egal a n2 (n1>=n2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && >R ( w -> _ ) - Mot reserve a la compilation. Depile le mot 16 bits du sommet de la pile data et le place au sommet de la pile return. Ce mot travaille par paire avec son complement R> (voir ce mot). && >RESOLVE ( adr -> _ ) - RESOUDS un branchement avant.Mot reserve a la compilation. Lors de la compilation de IFx,WHILEx ... ,un branchement avant (vers une adresse superieure a l'adresse pointee par le contenu de la user_variable DP) est compile :Bcc label . L'adresse adr du label a resoudre ainsi qu'une marque d'identification sont alors empilees. Lors de la compilation de la fin de la structure de commande (rencontre de ELSE,ENDIF,REPEAT ...) un appel a >RESOLVE est effectue pour calculer l'offset sur 16bits entre adr et le contenu courant de DP.Le deplacement est alors compile a l'adresse adr. && ?ABORT" ( w -> _ ) - Mot immediat reserve a la compilation. A la compilation : -Compile un appel au sous-programme (?ABORT") -Isole une chaine de l'Input Stream et la compile a la position courante pointee par la user_variable DP (dictionnary pointer). La chaine commence apres le blanc suivant " et se termine a la rencontre du caractere delimiteur " de code ascii 34 . Si le code ascii 34 n'est pas rencontre un message d'erreur est emis et ABORT est execute. -Resouds le branchement avant de (?ABORT") par un appel a >RESOLVE. A l'execution : Execute le sous programme (?ABORT") Si w<>0: -Affiche a l'ecran la chaine compilee. -Effectue un branchement au mot ABORT (voir ce mot). Si w=0 -L'execution se poursuit par un branchement au mot suivant la chaine compilee. Ex: Le mot TEST va chercher les mots du flot d'entree: -Si un mot existe (chaine de longueur non nulle) ,il est affiche. -Si il n'y a plus de mot,le message apres ?ABORT" est affiche et ABORT est execute. : TEST 1 WHILET BL WORD DROP DDUP C@ 0 = ?ABORT" Plus de mot dans le flot d'entree" COUNT TYPE 1 ENDWHILE ; TEST Il fait beau \ Affiche : "Il fait beau" \ "" && ?DDUP ( l -> l .. ) - Duplique le mot 32bits du sommet la pile data si celui-ci n'est pas nul. Si l=0 , ?DDUP ne modifie pas la pile data. && ?DUP ( w -> w .. ) - Duplique le mot 16bits du sommet la pile data si celui-ci n'est pas nul. Si w=0 , ?DUP ne modifie pas la pile data. && ?ERROR ( n -> _ ) - Execute le mot Forth ERROR (voir ce mot) avec argument d'entree n si n est different de 0 . Dans le cas ou n est egal a 0,aucune action n'est effectuee (n est cependant elimine). && @ ( adr -> w ) - Empile le contenu 16bits de l'adresse adr. Attention: adr doit etre une adresse paire,sinon le vecteur d'exception MC68000 numero 3 est genere. Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot) . EX: VAR X \ Creation de la variable simple precision X . \ Voir le mot !  X @ \ Empile le contenu de X && ABORT ( _ -> _ ) - Reinitialise les piles data et return,passe en mode execution et redonne la main a l'utilisateur en se branchant a QUIT (voir ce mot). Aucun message n'est emis. Prealablement a la reinitialisation,les variables d'etat du moniteur Forth sont sauvegardees dans la table 16 mots 16 bits WHERETAB (voir ce mot). && ABS ( n1 -> n2 ) - n2 est la valeur absolue de n1 (toutes valeurs sur 16bits). && ALLOT ( u -> _ ) - Le contenu de la user_variable DP est incremente de u octets. Ce mot est utilise pour allouer u octets a un mot donne.Tous ces octets sont initialises a 0 . EX: VAR TABLE \ Creation de la variable table 254 ALLOT \ Allocation de 254 octets en plus des 2 octets \ alloue par VAR && AND ( w1 w2 -> w3 _ ) - w3 est le resultat du "et logique" entre w1 et w2 (toutes valeurs sur 16 bits). && ASHIFT.R ( n1 u -> n2 _ ) - n2 est le resultat de u decalages arithmetiques (modulo 64) vers la droite de n1 (conservation du signe). && BASE ( _ -> adr ) - Empile l'adresse d'une user_variable 16bits contenant la base courante pour les conversions numeriques d'entrees/sorties. 2 BASE ! permettra de travailler en binaire voir OCTAL DECIMAL HEXA Rem:Si un indicateur de base est present dans une chaine a evaluer par NUMBER (voir ce mot),alors la conversion numerique s'effectue dans la base specifiee par l'indicateur de base sans tenir compte du contenu de BASE. && BL ( _ -> 32 ) - Empile le code ascii etendu a 16bits du caractere blanc. && BUILDS ( _ -> _ ) - CONSTRUIT une tete de mot Forth et la place a la suite du dictionnaire Forth.LATEST pointe le nfa de cette tete de mot. Le nom du mot construit est celui suivant BUILDS. La tete de mot Forth ainsi cree est lie au dernier mot defini ayant la meme cle de hashcode dans le vocabulaire courant. La table de hashcode du vocabulaire courant est mis a jour. Les indicateurs du "name field" de ce mot construit sont positionnes par defaut de la maniere suivante: 7> bitsmudge=0 mot non valide 6> bitvar =0 mot different du type variable 5> bitpreced=0 mot non immediat 4> bitquick =0 mot ne possedant pas une version quick 3> bitinline=0 mot compile par branch subroutin 2> bitcomp =1 mot autorise a la compilation si valide 1> bitexec =1 mot autorise a l'execution si valide 0> bitlink =x ce bit est positionne a 0 si le link field (offset de de chainage) est sur 16bits.Il est positionne a 1 dans le cas de chainage absolue sur 32bits. Les numeros de 0 a 7 representent le numero du bit (notations Motorola) dans l'octet indicateur. Voir exemple d'utilisation dans LITERAL,DLITERAL && BYE ( _ -> _ ) - Provoque le retour au bureau gem sans aucun autre avertissement. Les fichiers ouverts par l'editeur de blocs prealablement mis a jour et refermes. && C! ( w adr -> _ _ ) - Range les 8 bits de poids faible de w a l'adresse adr. && C, ( w -> _ ) - Range les 8 bits de poids faibles de w a l'emplacement pointe par le contenu de la user_variable DP. DP (dictionnary pointer) est incremente d'une unite. Rem: Apres un nombre impair d'execution de "C," DP est aligne sur la prochaine adresse paire pour le mode compilation (prob. d'adressage impair des mots 16bits sur MC68000 ) && C->S ( n1 -> n2 ) - Les 8 bits de poids faible de n1 sont etendus avec conservation du signe pour obtenir un nombre 16bits signes n2. && C@ ( adr -> w ) - Empile le contenu 8bits de l'adresse adr. Les 8 bits de poids faible de w contiennent l'information,les 8bits de poids forts sont mis a 0 . && CFA' ( _ -> adr ) - Empile le CFA (code field address) du mot suivant de l'Input Stream (flot d'entree).Le CFA est l'adresse du premier octet du champ code directement executable par le MC68000. Ex: CFA' DUP \ empile le CFA de DUP && CLS ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,69 Si le peripherique de sortie est l'ecran (_OUT=2),celui-ci est efface et le curseur est place en haut a gauche de l'ecran. && CMOVE ( adr1 adr2 u -> _ _ _ ) -! Recopie u octets (8bits) de l'adresse adr1 vers adr2 . Permet d'avoir les adresses adr1 ou adr2 impaires . Si u=0 , CMOVE n'a aucun effet. Si u#0 , l'execution est la suivante : L'octet d'adresse adr1 est recopie a l'adresse adr2 L'octet d'adresse adr1+1 est recopie a l'adresse adr2+1 . L'octet d'adresse adr1+u-1 est recopie a l'adresse adr2+u-1 && COMPILE ( _ -> _ ) - Lorsqu'un mot contenant COMPILE est execute les 4 octets suivant COMPILE sont consideres comme l'adresse 32bits d'une subroutine a compiler a l'adresse fournie par DP (dictionnary pointer). L'execution du mot se poursuit apres ces 4 octets. ex1: : TEST1 COMPILE [ 12345678. D, ] ; A toute execution du mot TEST, "jsr #12345678" sera ajoute a la suite du dictionnaire c_a_d a l'adresse HERE; ex2: : NOOP COMPILE [ HERE 4. D+ D, ] ; A toute execution de NOOP, "jsr adr(;)" seront rajoute a la fin du dictionnaire. NOOP (NO OPeration) est un mot qui ne fait rien sinon retarder l'execution. ex3: : TEST2 COMPILE [ CFA' DUP D, ] ; CFA' DUP depose le cfa de DUP sur la pile data. D, range ce cfa a la fin du dictionnaire A toute execution de TEST2,le mot DUP sera compile. Rem:Une version courte de "jsr" (jump subroutin vers une adresse absolue 32bits) "bsr" (branch subroutin offset par rapport a pc sur 8 ou 16 bits) est compilee lorsque cela est possible. && CONS ( n -> _ ) - Mot reserve a l'execution. Cree une constante simple precision (16bits) de nom .Cette constante est initialisee a n lors de sa creation. A la creation : -Utilise BUILDS (voir ce mot) pour la creation de la tete de mot. -Compile le code 68000 suivant : move.w #n,-(a6) (rts -Positionne le bit_smudge et le bit_inline. A l'execution : -L'execution de entraine le depot de n (16bits) sur la pile data. Ex: 2 CONS DEUX && CONTEXT ( _ -> adr ) - Empile l'adresse d'une user_variable specifiant le vocabulaire de contexte : CONTEXT D@ D@ \ empile le nfa du dernier mot du vocabulaire \ de contexte && CONVERT ( ud1 adr1 _ -> ud2 adr2 w ) -' Commence (ud1=0) ou continue (ud1<>0) la CONVERSION de la chaine de caracteres a partir de l'adresse adr=adr1+1 .La conversion s'arrete des qu'un caractere non convertible est rencontre ou qu'un debordement est constate (ud2>32bits en arithmetique non signee). ud1 : resultat de la conversion precedente ou 0 adr1: pointe la chaine a convertir ud2 : resultat de la conversion adr2: adresse du caractere non convertible rencontre w : poids faibles=code ascii non convertible rencontre poids forts =$FF si il y a debordement 0 sinon La user_variable DPL memorise la derniere occurence de "." dans la chaine de caractere.Si aucun "." n'est rencontre dans la chaine,le contenu de cette variable est mis a -1. Ex: 234.567 DPL=3 ; 234. DPL=0 ; 234 DPL=-1 Ce qu'effectue CONVERT : *** depiler adr,ud incrementer(adr,1) convertible:=vrai repeter Si le code ascii pointe par adr represente un chiffre dans la base courante, alors ud est multiplie par la base courante et la valeur de ce chiffre est ajoute a ud ,adr est incremente de 1 ; sinon convertible:=faux jusqu'a ce non convertible ou debordement empiler ud,puis adr,puis w mise a jour DPL *** && COUNT ( adr1 _ -> adr2 u ) - Empile le nombre d'octets de la chaine commencant a l'adresse adr1. adr2=adr1+1 Une chaine est normalement constituee de la maniere suivante: (adr1) : 1er octet indiquant la longueur de la chaine -> u . . : u code ascii representant la chaine . (adr1)+u+1 : code de fin de chaine 0 (NULL) Rem:COUNT est souvent utilise avec TYPE (voir ce mot) && CREATE ( _ -> _ ) - Mot immediat reserve a la compilation. Cree une tete de mot "nom" a la suite du dictionnaire et reserve 3 mots 16 bits a la suite de la tete de mot,le premier etant le code machine jsr,les deux suivants etant mis a zero. Doit etre utilise conjointement avec DOES (voir ce mot) && CRLF ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 13,10 Ceci provoque un retour a ligne suivante du curseur sur le peripherique de sortie _OUT. && CURRENT ( _ -> adr ) - Empile l'adresse d'une user_variable specifiant le vocabulaire courant : CURRENT D@ D@ \ empile le nfa du dernier mot du vocabulaire \ courant , donne aussi par LATEST && CSWAP ( w1 -> w2 ) - w2 est le resultat de la permutation des 8 bits de poids faibles et des 8 bits de poids forts de w1. && CURDOWN ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,66 Si le peripherique de sortie est l'ecran (_OUT=2) et si le curseur n'est pas a la derniere ligne,CURDOWN provoque le deplacement du curseur d'une ligne vers le bas. && CURHOME ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,72 Si le peripherique de sortie est l'ecran (_OUT=2),CURHOME provoque le deplacement du curseur a la premiere ligne,premiere colonne c'est a dire en haut a gauche. && CURLEFT ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,68 Si le peripherique de sortie est l'ecran (_OUT=2) et si le curseur n'est pas a la premiere colonne,CURLEFT provoque le deplacement du curseur d'une colonne vers la gauche. && CURRIGHT ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,67 Si le peripherique de sortie est l'ecran (_OUT=2) et si le curseur n'est pas a la derniere colonne,CURRIGHT provoque le deplacement du curseur d'une colonne vers la droite. && CURSET ( u1 u2 -> _ _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,89,32+u1,32+u2 Si le peripherique de sortie est l'ecran (_OUT=2),CURSET provoque le deplacement du curseur ligne u1,colonne u2. Le coin en haut a gauche a pour coordonnee 0,0 && CURTAB ( u -> _ ) - Positionne le curseur a la colonne u de la ligne courante sur le peripherique _OUT. Si u=0,le curseur est positionne a la premiere colonne gauche. Si u est superieure a la longueur d'une ligne,le curseur est positionne a la derniere colonne. && CURUP ( _ -> _ ) - Emet vers le peripherique de sortie _OUT les codes ascii 27,65 Si le peripherique de sortie est l'ecran (_OUT=2) et si le curseur n'est pas a la premiere ligne,CURUP provoque le deplacement du curseur d'une ligne vers le haut. && CURX ( _ -> adr ) - Empile l'adresse de la user_variable 16bits utilisee par EDIT pour determiner la colonne de l'affichage du 1er octet de la chaine editee. Le numero de la colonne gauche de l'ecran est 0. (Voir CURY,EDIT). && CURY ( _ -> adr ) - Empile l'adresse de la user_variable 16bits utilisee par EDIT pour determiner la ligne de l'affichage du 1er octet de la chaine editee. Le numero de la ligne superieure de l'ecran est 0. (Voir CURX,EDIT). && D! ( l adr -> _ _ ) - Range le mot long 32bits a l'adresse adr. Attention: adr doit etre une adresse paire,sinon le vecteur d'exception MC68000 numero 3 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot) . Ex: DVAR Y \ Creation d'une variable double precision 12345678. Y D! \ Y prend la valeur 12345678. && D+ ( d1 d2 -> d3 _ ) - Effectue l'addition d1+d2 et laisse la somme d3 sur la pile (toutes valeurs signees sur 32 bits). Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && D+! ( d adr -> _ _ ) - Ajoute la valeur signee double precision (32bits) d au contenu de l'adresse adr et range le resultat a l'adresse adr . Controle de l'operation : -Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4. Y D+! \ Y est une variable double precision (voir DVAR) && D, ( l -> _ ) - Range l a l'adresse pointee par le contenu de la user_variable DP . Le contenu de DP (dictionnary pointer) est incremente de 4 unites. Le contenu de DP doit etre pair sinon le vecteur d'exception MC68000 numero 3 est genere.Ceci provoque l'affichage d'un message d'erreur l'execution forcee de ABORT . && D- ( d1 d2 -> d3 _ ) - Effectue la soustraction d1-d2 et laisse la difference d3 sur la pile (toutes valeurs signees sur 32 bits) Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && D-! ( d adr -> _ _ ) - Soustrait la valeur double precision (32bits) d du contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4. Y D-! \ Y est une variable double precision (voir DVAR) && D. ( d -> _ ) - Affiche le nombre signe d sur le peripherique de sortie _OUT . La valeur affichee est precedee du caractere blanc si d est positif, du signe "-" si d est negatif. && D.R ( d u -> _ _ ) - Affiche sur le peripherique de sortie _OUT le nombre d precede d'un caractere blanc si le nombre d est positif ou nul,d'un caractere "-" si le nombre d est negatif,dans un champ de u caracteres (emplacement pour le signe compris). Si n>256 , un message d'erreur est emis. Si le champ est trop petit pour l'affichage du nombre,un caractere de depassement est emis en premiere position (gauche). && D< ( d1 d2 -> w _ ) - w est le resultat de la comparaison signee de d1 et d2 . Si d1 est inferieur strictement a d2 (d1 w _ ) - w est le resultat de la comparaison signee de d1 et d2 . Si d1 est inferieur ou egal a d2 (d1<=d2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && D<> ( d1 d2 -> w _ ) - w est le resultat de la comparaison de d1 et d2 . Si d1 est different de d2 (d1<>d2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && D= ( d1 d2 -> w _ ) - w est le resultat de la comparaison de d1 et d2 . Si d1 est egal a d2 (d1=d2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && D> ( d1 d2 -> w _ ) - w est le resultat de la comparaison signee de d1 et d2 . Si d1 est superieur a d2 (d1>d2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && D>= ( d1 d2 -> w _ ) - w est le resultat de la comparaison signee de d1 et d2 . Si d1 est superieur ou egal a d2 (d1>=d2) alors w=$FFFF (65535 en decimal non signe, -1 en decimal signe), 0 dans le cas contraire. && D>R ( l > _ ) - Mot reserve a la compilation. Depile le mot 32 bits du sommet de la pile data et le place au sommet de la pile return. Ce mot travaille par paire avec son complement DR> (voir ce mot). && D@ ( adr -> l ) - Empile le contenu 32bits de l'adresse adr. Attention: adr doit etre une adresse paire,sinon le vecteur d'exception MC68000 numero 3 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot) . EX: DVAR X \ Creation de la variable double precision X . \ Voir D! X D@ \ Empile le contenu de X && DABS ( d1 -> d2 ) - d2 est la valeur absolue de d1 (toutes valeurs sur 32bits). && DAND ( l1 l2 -> l3 _ ) - l3 est le resultat du "et logique" entre l1 et l2 (toutes valeurs sur 32 bits). && DASHIFT.R ( d1 u -> d2 _ ) - d2 est le resultat de u decalages arithmetiques (modulo 64) vers la droite de w1 (conservation du signe). && DCONS ( d -> _ ) - Mot reserve a l'execution. Cree une constante double precision (32bits) de nom .Cette constante est initialisee a d lors de sa creation. A la creation : -Utilise BUILDS (voir ce mot) pour la creation de 6la tete de mot. -Compile le code 68000 suivant : move.l #d,-(a6) 'rts -Positionne le bit_smudge et le bit_inline A l'execution -L'execution de entrainera le depot de d (32bits) sur la pile data. Ex: 4. DCONS QUATRE && DDROP ( l -> _ ) - JETTE le mot 32 bits (double precision) situe en sommet de pile data. && DDUP ( l _ -> l l ) - DUPLIQUE le mot 32 bits (double precision) situe en sommet de pile data. && DECIMAL ( _ -> _ ) - Range 10 (en decimal) dans la user_variable BASE (voir ce mot). Toutes les entrees/sorties numeriques se feront en base decimale. && DEFINITIONS ( _ -> _ ) - Rends le vocabulaire de contexte vocabulaire courant. Ainsi toutes les nouvelles definitions de mot seront creees dans ce vocabulaire. EX : VOCABULARY VOC \ Cree le vocabulaire VOC dans le vocabulaire \ courant VOC \ Rends VOC vocabulaire de contexte DEFINITIONS \ Rends VOC aussi vocabulaire courant . \ Definitions des nouveaux mots FORTH DEFINITIONS \ Revient au vocabulaire Forth WORDS \ Edition du vocabulaire de contexte . ( Les definitions crees sous VOC n'apparaissent pas dans le vocabulaire Forth . Il faut rendre VOC vocabulaire de contexte ) VOC WORDS \ Ouf! Les mots crees sont bien la. && DLITERAL ( d -> _ ) - Mot immediat reserve a la compilation. Compile un nombre double precision (32bits) a l'adresse pointee par le contenu de la user_variable DP (dictionnary pointer). Le nombre est preleve dans la pile data. Chaque execution du mot contenant DLITERAL empilera d sur la pile data. Ex: Une definition possible de DCONS (creation de constante 32 bits) : DCONS BUILDS [COMPILE] DLITERAL [COMPILE] ; ; && DMAX ( d1 d2 -> d3 _ ) - d3 est le plus grand des nombres signes d1 d2 (toutes valeurs sur 32bits). && DMIN ( d1 d2 -> d3 _ ) - d3 est le plus petit des nombres signes d1 d2 (toutes valeurs sur 32bits). && DMOVE ( adr1 adr2 u -> _ _ _ ) -! Recopie u mots 32bits de l'adresse adr1 vers adr2 . Les adresses adr1 et adr2 doivent etre paires sinon DMOVE genere le vecteur d'exception MC68000 numero 3.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT. Si u=0 , DMOVE n'a aucun effet. Si u#0 , l'execution est la suivante : Le mot d'adresse adr1 est recopie a l'adresse adr2 Le mot d'adresse adr1+4 est recopie a l'adresse adr2+4 . Le mot d'adresse adr1+4u-4 est recopie a l'adresse adr2+4u-4 && DNEGATE ( d1 -> d2 ) - d2 est le complement a 2 de d1 (toutes valeurs sur 32bits) Une defintion possible de DNEGATE : : DNEGATE DNOT 1. D+ ; && DNOT ( l1 -> l2 ) - l2 est le resultat de l'inversion bit a bit de l1 (toutes valeurs sur 32 bits). && DOES ( _ -> _ ) - Definit la partie execution d'un mot cree par CREATE (voir ce mot). EX: Definition d'une constante et initialisation de pi : cons CREATE , DOES @ ; 3.14 cons pi Toute utilisation de cons definit une constante simple precision de valeur egal au sommet de pile et de nom la chaine de caracteres suivant cons. A la creation (execution de cons): CREATE construit la tete de mot "pi" "," range le contenu du sommet de la pile a l'adresse cfa+6 de "pi" . DOES compile un pointeur a l'adresse cfa+2 de pi vers le mot qui le suit cad @ . A l'execution de "pi" ,l'adresse cfa+6 de "pi" est empile puis le compteur programme du MC68000 est deroute vers @ c'est a dire vers la partie de cons suivant DOES . && DOR ( l1 l2 -> l3 _ ) - l3 est le resultat du "ou logique" entre l1 et l2 (toutes valeurs sur 32 bits). && DOVER ( l1 l2 _ -> l1 l2 l1 ) - EMPILE l'avant dernier mot 32 bits (double precision) de la pile data. && DP ( _ -> adr ) - Empile l'adresse d'une user_variable pointant le premier octet libre du dictionnaire c'est a dire l'emplacement ou seront compilees les prochaines definitions (voir HERE). && DPL ( _ -> adr ) - - Empile l'adresse d'une user_variable 16bits contenant la position du dernier point lors de la conversion d'une chaine en un nombre double precision par CONVERT,NUMBER. Ex1: 1.2.3 \ DPL prend la valeur 1 apres l'execution de CONVERT Ex2: 4 \ DPL prend la valeur -1 apres l'execution de CONVERT && DPICK ( n -> l ) - EMPILE le mot 32 bits l (double precision) contenue par la n_ieme cellule 32 bits de la pile data . L'argument n est valide de 0 a 16383 ($3FFF en hexa) 0 DPICK ne fait rien (mais n disparait) 1 DPICK est equivalent a DDUP 2 DPICK est equivalent a 2 PICK 4 PICK 3 DPICK est equivalent a DOVER etc ... && DR> ( _ -> l ) - Mot reserve a la compilation. Enleve le mot 32 bits du sommet de la pile return et le place dans la pile data.Ce mot travaille par paire avec son complement (D>R). A l'interieur d'une meme definition il doit y avoir de D>R que de DR> sinon lors de l'execution de ; (rts en MC68000) le compteur programme du 68000 est charge avec une valeur qui va probablement provoquer une erreur systeme. && DROLL ( u -> _ ) - Effectue une permutation circulaire des u cellules 32bits du sommet de la pile data.La u_ieme cellule 32bits est placee au sommet. Si u=0 ou si u=1 la pile est inchangee (u est elimine) 2 DROLL est equivalent a DSWAP 3 DROLL est equivalent a DROT (voir ce mot). && DROP ( w -> _ ) - JETTE le mot 16 bits (simple precision) situe en sommet de pile data. && DROT ( l1 l2 l3 -> l2 l3 l1 ) - Effectue une permutation circulaire des 3 cellules 32bits du sommet de la pile data.La troisieme cellule 32bits est placee au sommet. Avant permutation Apres permutation (sp)-> | l3 | (sp)-> | l1 | 1ere cellule de la pile (sommet) - - | l2 | | l3 | 2eme cellule de la pile - - | l1 | | l2 | 3eme cellule de la pile - - && DROT.L ( l1 u -> l2 _ ) - l2 est le resultat de u rotations circulaires (modulo 64) vers la gauche de l1 . && DROT.R ( l1 u -> l2 _ ) - l2 est le resultat de u rotations circulaires (modulo 64) vers la droite de l1 . && DRPICK ( n -> l ) - EMPILE le mot 32 bits l (double precision) contenue par la n_ieme cellule 32 bits de la pile return . L'argument n est valide de 0 a 16383 ($3FFF en hexa) 0 DPICK ne fait rien (mais n disparait) 1 DPICK est equivalent a DI (indice courant de boucle 1er niveau) 3 DPICK est equivalent a DIL (indice limite de boucle 1er niveau) 7 DPICK est equivalent a DJ (indice courant de boucle 2eme niveau) Note : La cellule 16 bits du sommet de la pile return a Numero d'emplacement 1 La deuxieme cellule 16bits de la pile return a pour Numero d'emplacement 2 .... && DSHIFT.L ( l1 u -> l2 _ ) - l2 est le resultat de u decalages (modulo 64) vers la gauche de l1. Les bits liberes sont mis a zero. && DSHIFT.R ( l1 u -> l2 _ ) - l2 est le resultat de u decalages (modulo 64) vers la droite de l1 Les bits liberes sont mis a zero. && DSWAP ( l1 l2 -> l2 l1 ) - Permute les deux mots 32bits (double precision) du sommet de la pile data. && DUP ( w _ -> w w ) - DUPLIQUE le mot 16 bits (simple precision) situe en sommet de pile data && DVAR ( _ -> _ ) - Mot reserve a l'execution. Cree une variable double precision (32bits) de nom .Cette variable est initialisee a 0 lors de sa creation. A la creation : -Utilise BUILDS (voir ce mot) pour la creation de la tete de mot. -Aucun code n'est compile a la suite des codes ascii representant le nom de la variable.Quatre octets sont alloues et DP est mis a jour. -Le bit_var est positionne a 1 pour indiquer a l'interpreteur que ce mot est une variable. A l'execution : -L'execution de entrainera le depot du cfa (code field address) de sur la pile data (voir les mots D@ D! D+! D-! UD+! UD-! pour la manipulation de valeur de la variable) Ex: DVAR VARIABLE_DX && DXOR ( l1 l2 -> l3 _ ) - l3 est le resultat du "ou exclusif" bit a bit entre l1 et l2 (toutes valeurs sur 32 bits). && EDIT ( adr1 adr2 u -> _ _ _ ) - EDITE a l'ecran la chaine de caracteres commencant a l'adresse adr1. 0 deplace le curseur vers la gauche - deplace le curseur vers la droite - efface la chaine (remet sa longueur a 0) - efface un caractere a droite du curseur - efface un caractere a droite du curseur - affiche la chaine pointee par PSTRING EDIT travaille en mode insertion c'est a dire qu'un caractere recu est insere dans la chaine editee a l'emplacement du curseur apres deplacement de la partie droite de la chaine depuis le curseur. rem: QUIT utilise EDIT pendant l'entree de la ligne de commande.PSTRING est est positionne a tib+$80 pendant EDIT puis sa valeur initiale est restituee.Quit memorise la derniere ligne de commande a cette meme adresse. L'appui sur la touche provoque donc le reaffichage de la derniere ligne de commande. && EMIT ( w -> _ ) - EMET vers le peripherique de sortie _OUT le code ascii represente par les 8bits de poids faibles de w. ( voir PRT pour sortie centronics,VDU pour sortie ecran ) && ERROR ( n -> _ ) - Provoque l'execution du vecteur d'exception MC68000 numero 35 correspondant a TRAP #3 . Ce vecteur est utilise par Forth pour deroutement en cas d'erreur. L'execution provoquee par TRAP #3 depend du contenu de la user_variable 32bits ON.ERROR Cas1: Le contenu de ON.ERROR est 0. Le mot Forth XERROR (voir ce mot) est alors execute. Cas2: Le contenu de ON.ERROR est different de 0. ON.ERROR doit dans ce cas pointe le debut de la routine d'erreur utilisateur. Un branchement est effectue a l'adresse contenue dans la user_variable ON.ERROR Ceci permet au programmeur de decider de la conduite a adopter en cas d'erreur survenant pendant l'execution. Dans le cas d'une application,il est souvent souhaitable d'afficher un message et de relancer l'application,plutot que de redonner le controle complet au terminal Forth. Un exemple est donne dans le fichier MESSAGE.FTH pour l'affichage d'erreurs Forth.En effet,Forth n'est rien d'autre qu'une application particuliere. && EXIT ( _ -> _ ) - Lors de l'execution du mot contenant EXIT,EXIT force la sortie prematuree de ce mot avant la rencontre du mot de terminaison normal ";" . L'execution se poursuit dans le mot de niveau superieur. Attention : Ce mot ne doit jamais etre utilise a l'interieur d'une boucle DO_LOOP ou de ses derives sous peine de provoquer une erreur systeme. Il faut utiliser LEAVE dans ce cas. Meme chose pour DDO_DLOOP et ses derives.Utiliser DLEAVE . && EXPECT ( adr u -> _ _ ) - Transfert les caracteres venant du peripherique d'entree _IN dans la zone memoire commencant a l'adresse adr jusqu'a reception du code retour chariot 13 (hexa $0D) ou de u caracteres. 0<=<255 (hexa $FF) Tous les caracteres recus sont affiches sur le peripherique de sortie _OUT. La chaine obtenue est rangee a l'adresse adr sous la forme: (octet longueur,"x",0) Si le peripherique d'entree est le clavier(_IN=2),chaque touche valide est affichee.La touche permet d'effacer le dernier caractere frappe.Si la chaine frappee est affichee sur plusieurs lignes d'ecran, une anomalie d'affichage se produit si on utilise la touche pour effacer un caractere d'une ligne,le curseur se trouvant sur la ligne suivante.En effet le TOS ne permet pas de changer de ligne par l'envoi du code 08 .Il est donc conseille de pas provoquer de debordement de ligne en choissant correctement u par rapport a la position courante du curseur. && FILL ( adr u1 u2 -> _ _ _ ) - Remplit la zone memoire de longueur u1 octets commencant a l'adresse adr du contenu represente par les 8 bits de poids faibles de u2. N'a aucune action si u1=0. && FIND ( adr1 _ -> adr2 w ) - RECHERCHE le mot represente par la chaine de caracteres pointee par adr1 dans le vocabulaire de contexte adr1 : adresse de la chaine de caracteres du mot a trouver octet 0 :longueur (n) de la chaine de caracteres octet 1 a n : code ascii octet n+1 : code NUL soit 00 adr2 : "NAME FIELD ADRESS" du mot si le mot est trouve ou adr1 sinon w : drapeau representant le succes ou l'echec de la recherche w=0 si non trouve w=$FFFF si trouve rem : adr1 doit etre une adresse paire car les caracteres sont compares deux a deux pour plus defficacite. label:cmpm.w (a1)+,(a3)+ dbne d2,label && FORGET ( _ -> _ ) - Efface du dictionnaire le mot ainsi que tous les mots definis depuis celui-ci sans distinction de vocabulaire. Il faut manier ce mot avec precaution.L'effacement d'un mot d'un vocabulaire pere peut detruire des mots du vocabulaire fils si a ete defini avant ces mots fils et provoquer une erreur systeme. Cette version de Forth ne controle pas s'il est possible d'effacer un mot sans detruire le chainage d'un autre vocabulaire.Cela peut etre fait car tous les vocabulaires sont lies via VOC_LINK. && FORTH ( _ -> _ ) - Nom du vocabulaire de base,pere de tous les vocabulaire. Tous les vocabulaires crees sont chainees a FORTH. L'execution de FORTH rends FORTH vocabulaire de contexte,vocabulaire dans lequel les mots seront exclusivement cherches. Pour rendre FORTH vocabulaire courant,vocabulaire dans lequel les nouvelles definitions seront ajoutees ,voir DEFINITIONS && HERE ( _ -> adr ) - Empile le contenu de la user_variable DP c'est a dire empile l'adresse de la premiere cellule libre du dictionnaire (voir DP). && HEXA ( _ -> _ ) - Range 16 (en decimal) dans la user_variable BASE (voir ce mot). Toutes les entrees/sorties numeriques se feront en base hexadecimale. && HOLD ( w -> _ ) - Range les 8bits de poids faible de w a l'adresse pointee par FLD. FLD est decremente d'une unite sauf cas suivant: Si FLD pointe le premier octet de PAD,le code de debordement est emis a la place du poids faible de w. Si FLD ne pointe pas un caractere de PAD,un message d'erreur est emis et ABORT est execute. && IMMEDIATE ( _ -> _ ) - Mot immediat valide a la compilation et a l'execution. Inverse le "precedence_bit" du dernier mot compile,pointe par LATEST pour le rendre immediat. Le dernier mot compile sera alors execute meme en mode compilation. && INTERPRET ( _ -> _ ) - INTERPRETE le flot d'entree (Input Stream) en commencant a partir du caractere pointe par STREAM+OFFS jusqu'a ce que le flot soit epuisee ou qu'une erreur soit detectee dans le flot d'entree. L'interpreteur utilise les mots suivants: WORD pour acquerir le mot suivant du flot FIND pour chercher si le mot est un mot valide du vocabulaire de de contexte NUMBER pour tenter de convertir le mot en un nombre simple ou double precision si ce mot n'est pas trouve STATE pour connaitre l'etat de l'interpreteur state=0->execution ou state<>0->compilation COMPILE pour compiler le mot acquis Fonctionnement de l'interpreteur : -" ** etat execution Acquisition du mot suivant. Recherche de ce mot. Si le mot est trouve,FIND a place sur la pile de donnee le nfa du mot.Le cfa (Code Field Address) du mot est alors calcule et le champ code du mot trouve est execute. On recommence alors avec le mot suivant. Si le mot n'a pas ete trouve,l'interpreteur tente de convertir le mot en un nombre valide dans la base courante et dans la precision choisie. En cas de succes,ce nombre est empile.On recommence alors avec le mot suivant. En cas d'echec,un message d'erreur est emis et l'interpretation est stoppee. ** etat compilation Acquisition du mot suivant Recherche de ce mot. Si le mot est trouve,l'interpreteur compile cd range a la position courante du pointeur de dictionnaire (DP),l'un des codes machine suivant : (branch ou jump subroutin) BSR suivi de l'offset sur 8 ou 16 bits de la position cfa du mot par rapport a la position courante de DP JSR suivi de l'adresse absolue du cfa du mot sur 32 bits. Si le mot n'est pas ete trouve,l'interpreteur tente de convertir le mot en un nombre valide dans la base courante et dans la precision choisie. En cas de succes,l'interpreteur compile le code machine suivant: Si le mot est en simple precision, LITERAL : move.w valeur_sur_16bits,-(a6) Si le mot est en double precision, DLITERAL: move.l valeur_sur_32bits,-(a6) En cas dechec,l'interpreteur arrete la compilation,passe en mode execution si l'Input Stream n'est pas une ligne de commande,affiche un message d'erreur,et revient en attente d'une ligne de commande. Optimisation a la compilation : - Certains mots courts sont optimises a la compilation. ** Compilation in_line . Au lieu de compiler un branch subroutin vers un mot court, le champ code du mot court est recopie dans le champ code du mot en cours de compilation. Tous les mots dont la longueur du champ code est inferieure a 10 octets sont automatiquement compiles "enligne". ** compilation quick Au lieu de compiler un branch subroutin ou d'effectuer une compilation en ligne,certains mots dont le bit Q du name field est positionne a 1 prenne en charge leur propre compilation.Le compilateur Forth est donc deroute vers le code machine situe en memoire apres leur definition propre.Le code machine du champ code normal de ce mot est utilise seulement en mode execution directe ou s'il y a impossibilite d'effectuer la compilation rapide optimisee. Ex1: : TEST1 DUP + ; DUP et + sont compiles in_line sur au total 6 octets utilisation du champ code normal de ces mots - DUP move.w (a6),-(a6) - + move.w (a6)+,d0 add.w d0,(a6) - Ex2: : TEST2 4 + ; La compilation rapide optimise le code produit. Au lieu de compiler: - 4 move.w #4,-(a6) - + move.w (a6)+,d0 add.w d0,(a6) - La version Quick de + compile : - 4+ addq.w #4,(a6) - rem: dans le cas de +,-,D+,D-,les literaux superieurs a 8 sont compiles en utilisant la possibilite de valeur immediate dans le code MC68000 : addi.w #10,(a6) Liste des mots qui possede une version Quick + - U+ U- +! -! U+! U-! UD+ UD- D+ D- D+! D-! UD+! UD-! @ D@ ! D! = <> < <= > >= U> U<= D< D= D<> D<= D> D>= UD> UD<= XDROP PICK DPICK RPICK DRPICK D'autre mots auront une version quick dans les prochaines versions de ce Forth pour le rendre plus puissant: C@ C! . Ceci explique pourquoi ce Forth ne possede pas les mots de la forme : 0< 0> 0= 1+ 2+ .etc. Les expressions 0 < 0 > 0 = 1 + 2 + sont remplacees automatiquement par leur formes contractees ci-dessus par le compilateur grace a la compilation quick.Toutes les variantes le sont egalement : 45 + (mot generalement non inclus dans le dictionnaire d'origine Forth) est optimise de meme que 2+ Il est meme possible de definir les mots standards Forth sans augmenter aucunement le temps systeme grace a la compilation in_line. : 0> 0 > ; : 1+ 1 + ; etc.... && KEY ( _ -> w ) - Va chercher le caractere suivant aupres du peripherique d'entree _IN. Si aucun caractere n'est disponible,KEY se met en attente. Le code ascii du caractere est contenu dans les 8bits de poids faibles de w,les 8bits de poids forts de w sont mis a 0. && KSTAT ( _ -> w ) - Empile l'etat du peripherique d'entree _IN. Si aucun caractere n'est disponible , w=0 Si un ou plusieurs caracteres sont disponibles , w=-1 Ce mot permet d'eviter l'attente d'un caractere par KEY en testant si un caractere est disponible avant de faire un appel a KEY. && LATEST ( _ -> adr ) - Delivre le nfa (name field address) du dernier mot defini dans le vocabulaire courant. && LITERAL ( n -> _ ) - Mot immediat reserve a la compilation. Compile un nombre simple precision (16bits) a la position courante de DP (dictionnary pointer). Le nombre est preleve dans la pile data. Chaque execution du mot contenant LITERAL empilera n sur la pile data. Ex: Une definition possible de CONS (creation de constante) : CONS BUILDS [COMPILE] LITERAL [COMPILE] ; ; && M* ( n1 n2 -> d1 _ ) - Effectue la multiplication signee de n1 par n2 (valeurs sur 16 bits) et laisse le produit d1 (valeur sur 32 bits) sur la pile. Controle de l'operation: -Pas d'erreur possible. && M/ ( d1 n1 -> n2 _ ) - Effectue la division signee de d1 (valeur sur 32 bits) par n1 (valeur sur 16 bits) et laisse le quotient n2 (valeur sur 16 bits) sur la pile. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && M/MOD ( d1 n1 -> n2 n3 ) - Effectue la division signee de d1 (valeur sur 32 bits) par n1 (valeur sur 16 bits) et laisse le reste n2 (valeur sur 16 bits) puis le quotient n3 sur la pile data . Le quotient est donc sommet de la pile data. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && MAX ( n1 n2 -> n3 _ ) - n3 est le plus grand des nombres signes n1 n2 (toutes valeurs sur 16bits). && MIN ( n1 n2 -> n3 _ ) - n3 est le plus petit des nombres signes n1 n2 (toutes valeurs sur 16bits). && MMOD ( d1 n1 -> n2 _ ) - Effectue la division signee de d1 (valeur sur 32 bits) par n1 (valeur sur 16 bits) et laisse le reste n2 (valeur sur 16 bits) sur la pile. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique signee) genere le vecteur d'exception MC68000 No 7 . && MOD ( n1 n2 -> n3 _ ) - Laisse le reste n3 de la division signee n1/n2 sur la pile (toutes valeurs sur 16 bits) Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && MOVE ( adr1 adr2 u -> _ _ _ ) - Recopie u mots 16bits de l'adresse adr1 vers adr2 . Les adresses adr1 et adr2 doivent etre paires sinon MOVE genere le vecteur d'exception numero 3.Cela provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT. Si u=0 , MOVE n'a aucun effet. Si u#0 , l'execution est la suivante : Le mot d'adresse adr1 est recopie a l'adresse adr2 Le mot d'adresse adr1+2 est recopie a l'adresse adr2+2 . Le mot d'adresse adr1+2u-2 est recopie a l'adresse adr2+2u-2 && NEGATE ( n1 -> n2 ) - n2 est le complement a 2 de n1 (toutes valeurs sur 16bits) Une definition possible de NEGATE : : NEGATE NOT 1 + ; && NFA' ( _ -> adr ) - Empile le NFA (name field adress) du mot suivant de l'Input Stream (flot d'entree).Le NFA est l'adresse du premier octet du champ qui decrit le nom du mot. : adresse absolue (32bits) du NFA du mot precedent si L=1 : offset NFA (16bits) du mot precedent si L=0 : 8bits indicateurs ( S V P Q I C E L ) S : Smudge_bit 1 si mot valide V : Value_bit 1 si variable P : Precedence_bit 1 si mot immediat Q : Quick_bit 1 si mot optimisateur I : Inline_bit 1 si compilation en ligne possible C : Compilation_bit 1 si mot autorise en compilation E : Execution_bit 1 si mot autorise en execution L : Link_bit 1 si liaison codee sur 32bits : longueur du champ code en octets Si >255 cet octet est mis a 0. : Nombre de lettres du nom du mot sans compter le 0 de fin de chaine si nombre pair de lettres. : Premier code ascii du nom du mot. Ex: NFA' DUP \ empile le NFA de DUP && NFA> ( adr1 -> adr2 ) - A partir du NFA d'un mot,calcule le CFA et empile cette adresse. (voir CFA' NFA'). && NOT ( w1 -> w2 ) - w2 est le resultat de l'inversion bit a bit de w1 (toutes valeurs sur 16 bits). && NUMBER ( adr$ _ -> eval w ) - Evalue le NOMBRE represente par la chaine pointee par adr$ dans la base courante ou dans la base indiquee par la tete de chaine. Ce mot utilise le mot Forth CONVERT. adr$: adresse de la chaine a evaluer chaine=(longueur,"nnnn",00) eval: resultat de levaluation adr$ ou l ou w w : prend 4 valeurs: -2 : le premier caractere de la chaine est un code ascii valide et le resultat de l'evaluation un nombre non signe. -1 : le premier caractere de la chaine est "-" et le resultat de l'evaluation est un nombre negatif. 0 : erreur dans l'evaluation debordement de capacite,caractere invalide dans la chaine, adr est laisse dans la pile (eval). 1 : le premier caractere de la chaine est "+" et le resultat de l'evaluation est un nombre positif. De plus,la user_variable DPL permet de connaitre la precision (simple ou double precision) du resultat de l'evaluation eval *** Code particulier *** Indicateur de precision : "." Si la chaine de caractere ne contient pas le code ascii de "." , le resultat de l'evaluation doit pouvoir etre ecrit sur 16 bits. Si la chaine de caractere contient le code ascii de "." ,le resultat de l'evaluation doit pouvoir etre ecrit sur 32 bits Indicateur de signe : "+" ou "-" Si le premier caractere de la chaine est le caractere positif "+" ou le le caractere negatif "-" , NUMBER cherche a evaluer un nombre positif ou negatif.Si l'evaluation est impossible dans la precision demandee,elle est ajournee ( val=adr et w=0 ). Si aucun indicateur n'est present,le resultat est non signe. Indicateur de base : "$" ou "#" ou "@" ou "%" Si le premier caractere de la chaine est different de l'un des 4 caracteres ci-dessus,la base choisie pour l'evaluation est la base courante contenue dans la user_variable BASE. Dans le cas contraire,la chaine est evaluee dans la base definie par l'indicateur de base : $ pour base hexadecimale # pour base decimale @ pour base octale % pour base binaire L'indicateur de signe s'il est present doit etre place juste derriere l'indicateur de base (il devient le premier caractere dont il est question dans le paragraphe indicateur de signe) Note ---- La user_variable BASE est inchangee pour l'operation suivante. L'interpreteur Forth utilise NUMBER pour evaluer les nombres.Toutes facilites decrites ci-dessus sont donc offertes pendant l'execution et la compilation de mots. Ceci permet de rentrer une valeur dans une base quelconque sans changer la base courante. Ex1: Nombres valides en simple precision #+20 (20 en decimal) %-11 (-3 en decimal signe) @10 (8 en decimal) $FFFF (-1 en decimal signe ou 65535 en decimal non signe) Ex2: Nombres valides en double precision %10. (2 en decimal) #-.3 (-3 en decimal) $-F. (-15 en decimal) Ex3: Nombres non valides en simple precision #+12A $F %1 #3-5 Ex4: Nombres non valides en double precision @12228. $. #12345.A $.+5 && OCTAL ( _ -> _ ) - Range 8 (en decimal) dans la user_variable BASE (voir ce mot). Toutes les entrees/sorties numeriques se feront en base octale. && OFFS ( _ -> adr ) -  Empile l'adresse de la user_variable 32bits contenant l'offset ( c_a_d le deplacement ) par rapport a l'adresse de base STREAM du flot d'entree (Input Stream). Tout mot de chargement d'une chaine de caracteres ($LOAD),d'un bloc (BLOAD),d'un fichier ($FLOAD) sauvegarde ce pointeur,l'utilise pour effectuer l'interpretation,puis restitue son ancien contenu. Le mot INTERPRET utilise commence l'interpretation a l'adresse pointee par STREAM+OFFS. OFFS evolue au cours de l'interpretation a chaque extraction d'un mot de l'Input Stream par WORD (voir ce mot). && ON.ERROR ( _ -> adr ) - Empile l'adresse de la user_variable 32bits pointant la routine a executer sous TRAP #3 . (voir ERROR) && OR ( w1 w2 -> w3 _ ) - w3 est le resultat du "ou logique" bit a bit entre w1 et w2 (toutes valeurs sur 16 bits). && OVER ( w1 w2 _ -> w1 w2 w1 ) - Empile l'avant dernier mot 16 bits (simple precision) de la pile data. && PAD ( _ -> adr ) - Empile l'adresse du premier octet d'une zone de 256 octets minimum. Cette zone memoire brouillon (Provisionnal Area Data) est utilise par: BEDIT pour memoriser les lignes de bloc (memo1 memo2 memo3) # #S HOLD pour les conversions numeriques de sortie $" xxx" car PSTRING est initialise a PAD && PICK ( n -> w ) - EMPILE le mot 16 bits w (simple precision) contenue par la n_ieme cellule 16 bits de la pile data. L'argument n est valide de 0 a 15383 ($3FFF en hexa) 0 PICK ne fait rien (mais n disparait) 1 PICK est equivalent a DUP 2 PICK est equivalent a OVER etc ... && PRT ( _ -> _ ) - Range 0 dans la user_variable _OUT pour selectionner le peripherique de sortie centronics (generalement imprimante parallele) Les sorties se feront sur ce peripherique pour les mots : . U. D. UD. .R U.R D.R UD.R .( ." WORDS EMIT TYPE && PSTRING ( _ -> adr ) - Empile l'adresse de la user_variable 32bits PSTRING. Cette variable contient l'adresse ou seront rangees certaines chaines de caracteres. Voir les mots $" EDIT . PSTRING est initialise a PAD par COLD && QUIT ( _ -> _ ) - Initialise la pile return (a7),fait passer en mode execution (state=0) puis passe le controle au terminal.Forth est alors en attente d'une ligne de commande. Quit est une boucle infinie qui utilise EDIT,INTERPRET (voir ces mots). Le "drive" (lecteur de disquettes) actif par defaut est visualise sous la forme A> B> . A l'entree dans Forth depuis le bureau gem,le drive actif est celui a partir duquel Forth a ete lance par double-clicage. Si Forth passe en mode compilation,le caractere ">" est place a la suite du symbole drive actif : A>> B>> . && R> ( _ -> w ) - Mot reserve a la compilation. Enleve le mot 16 bits du sommet de la pile return et le place dans la pile data.Ce mot travaille par paire avec son complement (>R). A l'interieur d'une meme definition il doit y avoir de >R que de R> sinon lors de l'execution de ; (rts en MC68000) le compteur programme du 68000 est charge avec une valeur qui va probablement provoquer une erreur systeme. && ROLL ( u -> _ ) - Effectue une permutation circulaire des u cellules 16bits du sommet de la pile data.La u_ieme cellule 16bits est placee au sommet. Si u=0 ou si u=1 la pile est inchangee (u est elimine) 2 ROLL est equivalent a SWAP 3 ROLL est equivalent a ROT (voir ce mot). && ROT ( w1 w2 w3 -> w2 w3 w1 ) - Effectue une permutation circulaire des 3 cellules 16bits du sommet de la pile data .La troisieme cellule 16bits est placee au sommet. Avant permutation Apres permutation (sp)-> | w3 | (sp)-> | w1 | 1ere cellule de la pile (sommet) - - | w2 | | w3 | 2eme cellule de la pile - - | w1 | | w2 | 3eme cellule de la pile - - && ROT.L ( w1 u -> w2 _ ) - w2 est le resultat de u rotations circulaires (modulo 64) vers la gauche de w1 . && ROT.R ( w1 u -> w2 _ ) - w2 est le resultat de u rotations circulaires (modulo 64) vers la droite de w1 . && RP! ( adr -> _ ) - Charge le pointeur de pile return (registre a7 du MC68000) par l'adresse adr. Apres l'execution du mot en cours,l'execution se poursuivra donc a l'adresse contenue par la cellule 32bits d'adresse adr. A manier avec infiniment de precaution ! && RP@ ( _ -> adr ) - Empile l'adresse du sommet de la pile return (contenu du registre a7 du MC68000). && RPICK ( n -> w ) - EMPILE le mot 16bits w (simple precision) contenue par la n_ieme cellule 16 bits de la pile return . L'argument n est valide de 0 a 16383 ($3FFF en hexa) 0 PICK ne fait rien (mais n disparait) 1 PICK est equivalent a I (indice courant de boucle 1er niveau) 2 PICK est equivalent a IL (indice limite de boucle 1er niveau) 5 PICK est equivalent a J (indice courant de boucle 2eme niveau) Note : La cellule 16 bits du sommet de la pile return a Numero d'emplacement 1 La deuxieme cellule 16bits de la pile return a pour Numero d'emplacement 2 .... && RPO ( _ -> adr ) - Empile l'adresse de la user_variable dont le contenu est l'adresse origine de la pile return. QUIT reinitialise le contenu du pointeur pile return (registre a7) par le contenu de RPO. && S->D ( n -> d ) - Transforme le nombre signe 16bits n en un nombre signe 32bits d avec conservation du signe. && SHIFT.L ( w1 u -> w2 _ ) - w2 est le resultat de u decalages (modulo 64) vers la gauche de w1 . Les bits liberes sont mis a zero. && SHIFT.R ( w1 u -> w2 _ ) - w2 est le resultat de u decalages (modulo 64) vers la droite de w1 . Les bits liberes sont mis a zero. && SMUDGE ( _ -> _ ) - Mot immediat valide a la compilation et a l'execution. Inverse le bit de validite (smudge_bit ) du dernier mot compile pointe par LATEST. && SP! ( adr -> ... ) - Charge le pointeur de sommet de pile data (registre a6 du 68000) par l'adresse adr. A utiliser avec precaution ! && SP@ ( _ -> adr ) - Empile l'adresse du sommet de la pile data (contenu du registre a6) juste avant l'execution de SP@. && SPO ( _ -> adr ) - Empile l'adresse de la user_variable dont le contenu est l'adresse origine de la pile data. ABORT reinitialise le contenu du pointeur pile data (registre a6) par le contenu de SPO. && STREAM ( _ -> adr ) - Empile l'adresse de la user_variable 32bits contenant l'adresse de base (c_a_d l'adresse du 1er octet) du flot d'entree (Input Stream). Tout mot de chargement d'une chaine de caracteres ($LOAD),d'un bloc (BLOAD),d'un fichier ($FLOAD),sauvegarde ce pointeur,l'utilise pour effectuer l'interpretation,puis restitue son ancien contenu. Le mot INTERPRET commence l'interpretation a l'adresse pointe par STREAM+OFFS. && SWAP ( w1 w2 -> w2 w1 ) - Permute les deux mots 16bits du sommet de la pile data. && TAB ( _ -> adr ) - Empile l'adresse de la user_variable 16bits contenant le deplacement du curseur en cas d'appui sur dans BEDIT (voir ce mot). && TIB ( _ -> adr ) - Empile l'adresse du premier octet d'une zone de 256 octets minimum. Cette zone memoire (Terminal Input Buffer) est utilise par : EDIT pour rangement de la chaine rentree au clavier. QUIT pour memorisation de la ligne de commande && TRACE ( _ -> _ ) - Active le Mode Trace du 68000. Le programme est execute instruction par instruction (pas a pas). L'etat des differentes piles est controlee. Si l'une d'elles est saturee ou depilee,un message d'erreur est emis et ABORT est execute. Dans les prochaines versions,un vrai mode pas a pas programmable par l'utilisateur ( visualisation des piles ... ) sera mis en place. && TRAVERSE ( adr1 -> adr2 ) - adr1 : nfa (name field address) d'un mot courant adr2 : nfa du mot precedent ce mot courant 00 si il n'existe pas de mot precedent. Permet de remonter jusqu'a la racine du vocabulaire Forth && TYPE ( adr u -> _ _ ) - Emet vers le peripherique de sortie la suite de code ascii commencant a l'adresse adr.Si un code ascii nul 00 est rencontre,l'emission est stoppee immediatement.Si aucun code nul n'est rencontre,u codes (u>0) sont emis sucessivement. Si u=0 alors les codes ascii sont emis jusqu'a la rencontre du caractere nul. Dans tous les cas,le nombre maximum de code emis ne peut etre superieure a 65536 && U* ( u1 u2 -> u3 _ ) - Effectue la multiplication non signee de u1 par u2 et laisse le produit u3 sur la pile (toutes valeurs sur 16 bits) Controle de l'operation: -Le depassement de capacite (produit superieur a 16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && U*/ ( u1 u2 u3 -> u4 _ _ ) - Effectue la multiplication de u1 par u2,divise le produit obtenu par par u3 et laisse le quotient u4 sur la pile . Les operandes u1,u2,u3,u4 sont des valeurs 16bits non signes. Le produit intermediaire u1*u2 est calcule sur 32bits non signes. Controle des operations : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && U*/MOD ( u1 u2 u3 -> u4 u5 _ ) -! Effectue la multiplication de u1 par u2,divise le produit obtenu par par u3 et laisse le reste u4 puis le quotient u5 sur la pile . Le quotient est donc en sommet de pile data. Les operandes u1,u2,u3,u4,u5 sont des valeurs 16bits non signes. Le produit intermediaire u1*u2 est calcule sur 32bits non signes. Controle des operations : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && U+ ( u1 u2 -> u3 _ ) - Effectue l'addition u1+u2 et laisse la somme u3 sur la pile (toutes valeurs non signees sur 16 bits). Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && U+! ( u adr -> _ _ ) - Ajoute la valeur simple precision (16bits) non signee u au contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4 X U+! \ X est une variable simple precision (voir VAR) && U- ( u1 u2 -> u3 _ ) - Effectue la soustraction u1-u2 et laisse la difference u3 sur la pile (toutes valeurs non signees sur 16 bits). Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && U-! ( u adr -> _ _ ) - Soustrait la valeur non signee simple precision (16bits) u du contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4 X U-! \ X est une variable simple precision (voir VAR) && U. ( u -> _ ) - Affiche sur le peripherique _OUT le nombre non signe u a la position courante du curseur. && U.R ( u1 u2 -> _ _ ) - Affiche sur le peripherique de sortie _OUT le nombre u1 dans un champ de u2 caracteres.Si u>256 , un message d'erreur est emis. Si le champ est trop petit pour l'affichage du nombre,un caractere de depassement est emis en premiere position (gauche). && U/ ( u1 u2 -> u3 _ ) - Effectue la division non signee de u1 par u2 (u1/u2) et laisse le quotient u3 sur la pile (toutes valeurs sur 16 bits). Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && U/MOD ( u1 u2 -> u3 u4 ) - Effectue la division non signee de u1 par u2 (u1/u2) et laisse le reste u3 puis le quotient u4 sur la pile (toutes valeurs sur 16 bits). Le quotient de la division est donc place en sommet de pile data . Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && UD+ ( ud1 ud2 -> ud3 _ ) - Effectue l'addition ud1+ud2 et laisse la somme ud3 sur la pile  (toutes valeurs non signees sur 32 bits). Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && UD+! ( ud adr -> _ _ ) - Ajoute la valeur double precision (32bits) non signee ud au contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4. Y UD+! \ Y est une variable double precision (voir DVAR) && UD- ( ud1 ud2 -> ud3 _ ) - Effectue la soustraction ud1-ud2 et laisse la difference ud3 sur la pile (toutes valeurs non signees sur 32 bits). Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere.Ceci provoque l'affichage d'un message d'erreur et l'execution forcee de ABORT (voir ce mot). && UD-! ( ud adr -> _ _ ) - Soustrait la valeur non signee double precision (32bits) ud du contenu de l'adresse adr et range le resultat a l'adresse adr. Controle de l'operation : -Si il y a debordement en arithmetique non signee,le vecteur d'exception MC68000 numero 7 est genere. -Si adr n'est pas une adresse paire,le vecteur d'exception MC68000 numero 3 est genere. Ex: 4. Y UD-! \ Y est une variable double precision (voir DVAR) && UD. ( ud -> _ ) - Affiche sur le peripherique _OUT le nombre non signe ud a la position courante du curseur. && UD.R ( ud u -> _ _ ) - Affiche sur le peripherique de sortie _OUT le nombre ud dans un champ de u caracteres .Si n>256 , un message d'erreur est emis. Si le champ est trop petit pour l'affichage du nombre,un caractere de depassement est emis en premiere position (gauche). && UDMAX ( ud1 ud2 -> ud3 _ ) - ud3 est le plus grand des nombres non signes ud1 ud2 (toutes valeurs sur 32bits). && UDMIN ( ud1 ud2 -> ud3 _ ) - ud3 est le plus petit des nombres non signes ud1 ud2 (toutes valeurs sur 32bits). && UM* ( u1 u2 -> ud3 _ ) - Effectue la multiplication non signee de u1 par u2 (valeurs sur 16 bits) et laisse le produit ud3 (valeur sur 32 bits) sur la pile. Controle de l'operation: -Pas d'erreur possible. && UM/ ( ud u1 -> u2 _ ) - Effectue la division non signee de ud (valeur sur 32 bits) par u1 (valeur sur 16 bits) et laisse le quotient u2 (valeur sur 16 bits) sur la pile. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && UM/MOD ( ud u1 -> u2 u3 ) - Effectue la division non signee de ud (valeur sur 32 bits) par u1 (valeur sur 16 bits) et laisse le reste u2 (valeur sur 16bits) puis quotient u3 (valeur sur 16 bits) sur la pile. Le quotient est donc en sommet de pile data. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && UMAX ( u1 u2 -> u3 _ ) - u3 est le plus grand des nombres non signes u1 u2 (toutes valeurs sur 16bits). && UMIN ( u1 u2 -> u3 _ ) - u3 est le plus petit des nombres non signes u1 u2 (toutes valeurs sur 16bits). && UMMOD ( ud u1 -> u2 _ ) - Effectue la division non signee de ud (valeur sur 32 bits) par u1 (valeur sur 16 bits) et laisse le reste u2 (valeur sur 16 bits) sur la pile. Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . -Un depassement de capacite (quotient>16bits en arithmetique non signee) genere le vecteur d'exception MC68000 No 7 . && UMOD ( u1 u2 -> u3 _ ) - Laisse le reste u3 de la division non signee u1/u2 sur la pile data (toutes valeurs sur 16bits). Controle de l'operation : -Une division par 0 genere le vecteur d'exception MC68000 No 5 . && UNTRACE 2( _ -> _ ) - Desactive le mode TRACE (voir ce mot) && USERTAB ( _ -> adr ) - Empile la premiere adresse de la table des user_variables. Grace a cette adresse,il est possible d'acceder aux user_variables non definies en tant que mot dans le noyau Forth en ajoutant l'offset de la variable desiree par rapport au debut de la table. && VAR ( _ -> _ ) - Mot reserve a l'execution. Cree une variable simple precision (16bits) de nom .Cette variable est initialisee a 0 lors de sa creation. A la creation : -Utilise BUILDS (voir ce mot) pour la creation de la tete de mot. -Aucun code n'est compile a la suite des codes ascii representant le nom de la variable.Deux octets sont alloues et DP est mis a jour. -Le bit_var est positionne a 1 pour indiquer a l'interpreteur que ce mot est une variable. A l'execution : -L'execution de entraine le depot du cfa (code field address) de sur la pile data (voir les mots @ ! +! -! U+! U-! pour la manipulation de valeur de la variable) Ex: VAR VARIABLE_X && VDU ( _ -> _ ) - Range 2 dans la user_variable _OUT pour selectionner le peripherique de sortie console (ecran) Les sorties se feront sur ce peripherique pour les mots : . U. D. UD. .R U.R D.R UD.R .( ." WORDS EMIT TYPE && VOCABULARY ( _ -> _ ) - Cree dans le vocabulaire courant un nouveau vocabulaire de nom . L'execution ulterieure de rendra vocabulaire de contexte. L'interpreteur recherche d'abord les mots dans le vocabulaire de contexte puis dans le vocabulaire FORTH. Pour ajouter un mot dans le vocabulaire ,il faut le rendre vocabulaire courant (voir DEFINITIONS). && WHERETAB ( _ -> adr ) - Empile l'adresse du premier octet de la zone 32 octets de sauvegarde de l'etat du moniteur Forth avant ABORT. Le contenu de certaines user_variables sont sauvegardees dans cette zone par ABORT : adr : BLK (16bits) adr+2 : STATE (16bits) adr+4 : STREAM (32bits) adr+8 : OFFS (32bits) adr+12 : LATEST (32bits) adr+16 : SP (32bits) adr+20 : a : zone 12 octets libres adr+31 : && WORD ( w1 _ -> adr$ w2 ) - Isole un MOT a partir du flot d'entree (Input Stream) pointe par STREAM+OFFS. w1 : l'octet de poids faible represente le code ascii du caractere delimiteur adr$: pointeur de la zone memoire ou le mot a ete copie. w2 : l'octet de poids faible represente le code ascii du caractere qui a stoppe la copie. l'octet de poids fort est mis a $FF si la longueur du mot est superieur a 255,sinon il est egal a $00. **** Fonctionnement de WORD: Ignore les caracteres delimiteurs d'entree c a d incremente OFFS jusqu'a la rencontre d'un caractere different du caractere delimiteur. Copie les caracteres du flot d'entree a partir du pointeur de position (STREAM+OFFS) de ce flot La copie est stoppee : Si le caractere delimiteur est rencontre. Si un caractere de controle (code ascii <32) est rencontre. Si la longueur du mot est superieur a 255. STREAM+OFFS pointe alors le caractere suivant celui qui a provoque l'arret si le caractere delimiteur est rencontre,ou le caractere qui a stoppe la copie sinon . LE mot,precede de sa longueur,suivi du code de fin chaine 00,est place en memoire a l'adresse adr$ ( a la fin du dictionnaire Forth c a d a l'adresse HERE+4 ). rem : si STREAM+OFFS pointe sur un caractere de controle, l'execution de WORD rend une chaine vide de longueur nulle et OFFS est inchange. ex : si STREAM+OFFS pointe sur "babcdex'cr'fghx" cr=code ascii $0D l'execution consecutive de WORD dans un mot defini donnera "b" WORD -> "a" "x" WORD -> "bcde" "x" WORD -> "" && WORDS ( _ -> _ ) - LISTE les mots en partant du vocabulaire de contexte et en enchainant avec les vocabulaires peres jusquau vocabulaire FORTH. Le peripherique de sortie est selectionne par la user_variable _OUT. L'appui sur une touche differente de stoppe momentanement le listage.Il est repris des qu'un nouvel appui sur une touche est detecte (attention a la repetition automatique du clavier si la touche est enfoncee trop longtemps). L'appui sur la touche stoppe definitivement le listage et l'execution se poursuit au niveau superieur. && XDROP ( n -> _ ) - Enleve n cellules 16bits de la pile data,la cellule contenant n etant non comprise. 0 XDROP ne fait rien. 1 XDROP est equivalent a DROP 2 XDROP est equivalent a DDROP .... && XERROR ( n -> _ ) - Affiche a l'ecran le message suivant : Et execute le mot Forth ABORT. && XOR ( w1 w2 -> w3 _ ) - w3 est le resultat du "ou exclusif bit a bit" entre w1 et w2 (toutes valeurs sur 16 bits). && [ ( _ -> _ ) - Le crochet ouvert [ fait passer Forth en mode execution en mettant le contenu de la user_variable STATE a 0 . && [COMPILE] ( _ -> _ ) - Mot immediat reserve a la compilation. Lors de la compilation d'un mot,[COMPILE] force la compilation du mot suivant du flot d'entree (Input Stream) quelque soit la priorite de ce mot. [COMPILE] permet donc de compiler un mot immediat qui serait normalement execute pendant la compilation. Ex: Creation d'un mot equivalent a LITERAL : VALEUR [COMPILE] LITERAL ; IMMEDIATE && \ ( _ -> _ ) - Ce mot indique que le reste de la ligne est du commentaire. Les caracteres du flot d'entree (Input Stream) suivant \ sont donc ejectes jusqu'a la rencontre du code ascii 13 retour chariot,suivi du code ascii 10 pour nouvelle ligne. Agit de la meme facon en mode compilation ou en mode execution. && ] ( _ -> _ ) - Le crochet ferme ] fait passer Forth en mode compilation en mettant le contenu de la user_variable STATE a $FFFF . && _CONIN ( _ -> w1 w2 ) - Va chercher aupres du peripherique d'entree _IN le caractere suivant. Si aucun caractere n'est disponible,_CONIN se mets en attente. Si le peripherique d'entree est le clavier (_IN=2) les 8 bits de poids faible de w1,w2 representent respectivement: w2 code de lecture du clavier (scancode) w1 code ascii du caractere frappe && _IN ( _ -> adr ) - Empile l'adresse de la user_variable 16bits contenant le numero du peripherique d'entree: 0 : PRT Interface centronics 1 : AUX Interface RS232 2 : CON Clavier 3 : MID Interface MIDI && _OUT ( _ -> adr ) - Empile l'adresse de la user_variable 16bits contenant le numero du peripherique de sortie: 0 : PRT Interface centronics 1 : AUX Interface RS232 2 : CON ecran 3 : MID Interface MIDI 4 : IKBD Port du clavier 5 : VT52 Terminal VT52 (voir VDU,PRT) -2  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 04/01/87 - LES CHAINES DE CARACTERES - A>INTRODUCTION - Notations - La pile de donnees est symbolisee ( _ -> _ ) La pile de chaine est symbolisee ( _ "> _ ) Un commentaire est indique par \ Exemple : " ICI" empilera la chaine de 3 caracteres ICI dans la pile de chaine. La pile de donnees est inchangee ( _ -> _ ) La pile de chaine est modifiee ( _ "> str ) (STRing) Les mots de manipulation de chaines qui font intervenir exclusivement la pile de chaines sont precedes de " Ex: "DUP "DROP .... Les mots de manipulation de chaines qui font intervenir les variables chaines ou les chaines en memoire avec la pile de chaines sont precedes de $ Ex: $@ $! .... Les mots de manipulation de chaines qui ne font pas intervenir la pile de chaine sont precedes de $$ Ex: $$! .... Rem:Dans certains cas la pile de donnees fournit des arguments pour une manipulation qui se fait sur la pile de chaines. Ex: " FORTH68K" 5 "LEFT Laissera la chaine de 5 caracteres FORTH sur la pile de chaines et enlevera le nombre 5 de la pile de donnees Caracteristiques des Chaines - Le premier octet de la chaine est repere position 1 La position 0 est inEvalide et provoquera un message d'erreur. Caracteristiques de la pile de chaines -& La longueur des chaines n'est pas limite a 255 comme dans les variables chaines mais peut aller jusqu'a 32765. (pas 32767) Cela permet des manipulations sans contraintes de longueur. Une erreur d'execution sur la pile de chaine provoque l'affichage d'un message d'erreur et l'execution de ABORT qui reinitialise la pile data,la pile return et interrompt l'execution. La pile de chaines est inchangee. A>DEFINITIONS DES MOTS RESIDENTS - && " ( _ -> _ ) ( _ "> str ) - Isole une chaine de caracteres du flot d'entree et l'empile sur la pile de chaines. La chaine commence apres le blanc suivant le caractere " et se termine a la rencontre du caractere delimiteur de code ascii 34 " Tous les caracteres sont autorises a l'exception du caractere delimiteur " Ex : " Je suis une chaine de caractere" && "C! ( u1 u2 -> _ ) ( str1 "> str2 ) -' Les 8bits de poids faibles de u1 ecrasent l'octet qui se trouve a la position u2 dans la chaine str1 Si la position u2 est hors limite ou si la pile de chaine est vide, un message d'erreur est emis et ABORT est execute. Ex: HEXA \ Base 16 " NNNTES" \ Empile la chaine de 6 car. NNNTES 41 2 "C! \ Remplace le deuxieme N par A (code ascii $41) "TYPE \ Affichage pour verification && "C@ ( u1 -> u2 ) ( str1 "> _ ) -# L'octet qui se trouve a la position u1 de str1 est mis dans les 8bits de u2.Les 8 bits de poids forts de u2 sont mis a 0 . Si la position u1 est hors limite ou si la pile de chaine est vide, un message d'erreur est emis et ABORT est execute. Ex: HEXA \ Base 16 " NANTES" \ Empile la chaine de 6 car. NANTES 2 "C@ \ Remplace le deuxieme caractere A U. \ Affichage pour verification (code ascii $41) && "CAT ( _ -> _ ) ( str1 str2 "> str3 ) -) Concatene les chaines str1 et str2 et empile le resultat str3 sur la pile de chaine. Si le resultat est trop long (>32765) ou si la pile de chaines est insuffisante (moins de 2 chaines empilees),un message d'erreur est emis et ABORT est execute (str1 et str2 reste empilees). Ex: " PAUL" " EMILE" "CAT \ Donne " PAUL EMILE" " VICTOR" "CAT \ Donne " PAUL EMILE VICTOR" "TYPE \ Verification && "CLEAR ( _ -> _ ) ( strings "> _ ) -& Reinitialise la pile de chaines et la vide de tout contenu . ABORT ne modifie pas la pile de chaines . && "COMP ( _ -> n ) ( str1 str2 "> _ _ ) -) Compare la chaine str1 avec la chaine str2 et empile le resultat n sur la pile de donnees . Si la pile de chaines est insuffisante (moins de 2 chaines empilees), un message d'erreur est emis et ABORT est execute . (Les chaines str1 et str2 restent empilees). si str1>str2 alors n=1 c'est a dire si les codes ascii qui composent la chaine str1 ont une valeur numerique superieure a ceux qui composent str2 Si str1=str2 alors n=0 c'est a dire si les codes ascii qui composent la chaine str1 ont une valeur numerique egale a ceux qui composent str2 ,avec str1 et str2 de meme longueur. Si str1 u ) ( _ "> _ ) - Empile sur la pile de donnees le nombre de chaines presentes sur la pile de chaines. La pile de chaines est inchangee. Si la pile de chaines est vide alors u=0 . && "DROP ( _ -> _ ) ( str "> _ ) - Enleve la chaine qui se trouve au sommet de la pile de chaine. Si la pile de chaine est vide,un message d'erreur est emis et ABORT est execute. && "DUP ( _ -> _ ) ( str "> str str ) -& Duplique la chaine de caracteres qui se trouve au sommet de la pile de chaines. Si la pile de chaine est vide,un message d'erreur est emis et ABORT est execute. && "LEFT ( u -> _ ) ( str1 "> str2 ) -% Les u premiers caracteres de gauche de str1 sont conserves pour constituer la chaine str2. Si la pile de chaine est vide,un message d'erreur est emis et ABORT est execute. Si u=0,une chaine nulle est empilee. Si u est superieur a la longueur de str1 alors la pile de chaine est inchangee (str2=str1). Ex: " PAUL EMILE VICTOR" \ Empile la chaine 4 "LEFT \ Prends les 4 caracteres de gauche \ soit PAUL "TYPE \ Verification && "LEN ( _ -> u ) ( str "> str ) -! Empile la longueur de la chaine str du sommet de pile de chaines. Si la pile de chaines est vide un message d'erreur est emis et ABORT est execute. && "NULL ( _ -> _ ) ( _ "> str ) -! Empile une chaine nulle sur la pile de chaine . Une chaine a une longueur nulle. && "PICK ( u -> _ ) ( _ "> str ) -! Empile sur la pile de chaine la Uieme chaine contenue dans cette pile avant l'execution de "PICK. Si la pile de chaines est insuffisante (moins de u chaines empilees), un message d'erreur est emis et ABORT est execute . (La pile de chaine n'est pas modifiee.) 0 "PICK ne fait rien 1 "PICK est equivalent a "DUP .... && "POS ( u1 -> u2 ) ( str1 str2 "> _ _ ) -* Recherche l'occurrence de la chaine str2 dans la chaine str1 en commencant a la position u2 Si str2 est trouve dans str1 alors u2 est la position de la chaine str2 dans str1 . Si la chaine str2 n'est pas trouve dans str1 alors u2=0 Si la pile de chaines est insuffisante (moins de 2 chaines empilees) ou si u2=0,un message d'erreur est emis et ABORT est execute . (Les chaines str1 et str2 restent empilees). Ex DECIMAL \ base 10 " NANTES PARIS LYON MARSEILLE" \ Chaine str1 "DUP " NANTES" 1 "POS U. \ Position de NANTES =1 "DUP " PARIS" 1 "POS U. \ Position de PARIS =8 "DUP " PARIS" 10 "POS U. \ Pas trouve =0 "DUP " LYON" 10 "POS U. \ Position de LYON =14 "DUP " PARIS" 100 "POS U. \ Hors chaine str1 =0 && "RIGHT ( u -> _ ) ( str1 "> str2 ) -% Les u derniers caracteres de droite de str1 sont conserves pour constituer la chaine str2. Si la pile de chaine est vide,un message d'erreur est emis et ABORT est execute. Si u=0,une chaine nulle est empilee. Si u est superieur a la longueur de str1 alors la pile de chaine est inchangee (str2=str1). Ex: " PAUL EMILE VICTOR" \ Empile la chaine 6 "RIGHT \ Prends les 6 caracteres de droite \ soit VICTOR "TYPE \ Verification && "SEG ( u1 u2 -> _ _ ) ( str1 "> str2 ) -* Constitue la chaine str2 en prenant u2 caracteres de str1 a partir la position u1 dans str1. Si u1=0,un message d'erreur est emis et ABORT est execute. (La pile de chaines est inchangee) Si u1 est superieure a la longueur de str1,une chaine nulle est empilee. Si la chaine contient moins de u2 caracteres a partir de la position u1, la chaine str2 est constituee des caracteres de droite de str1 a partir de la position u1. Ex: DECIMAL \ base 10 " JULES VERNE" \ Empile la chaine "DUP 7 5 "SEG \ Extrait les 5 caracteres VERNE "TYPE \ Verification "DUP 10 100 "SEG \ extrait NE "TYPE \ verification && "SIZE ( _ -> ud ) ( _ "> _ ) - Empile sur la pile de donnees le nombre d'octets utilise par la pile de chaines. La pile de chaines n'est pas modifiee. && "SWAP ( _ -> _ ) ( str1 str2 "> str2 str1 ) -/ Effectue la permutation des deux chaines situees au sommet de la pile de chaines. Ex: " ALBERT " " CAMUS " \ Chargement de la pile "SWAP \ Permutation "TYPE \ Verification \ Affichage de 'CAMUS ALBERT ' && "TYPE ( _ -> _ ) ( str "> _ ) -! Affiche sur le peripherique _OUT la chaine se trouvant en sommet de pile de chaine . Ex: " FRANZ KAFKA" \ Chargement de la pile "TYPE \ Affichage && ]" ( _ -> _ ) ( _ "> str ) - Mot immediat valide a la compilation A la compilation -Isole la chaine qui suit ]" du flot d'entree jusqu'a la rencontre du caractere delimiteur " Si le caractere delimiteur n'est pas rencontree,un message d'erreur est emis et ABORT est execute. -Compile un appel au sous-programme (]") qui sera execute pendant l'execution du mot en cours de definition. -Compile la chaine de caracteres a la position courante de dp (dictionnary pointer). A l'execution Le sous-programme (]") est execute: -La chaine compilee est empilee dans la pile de chaine -Un branchement est effectuee au mot suivant la chaine. Ex: L'execution de EDGAR_POE deposera 'HISTOIRES EXTRAORDINAIRES' sur la pile de chaines. : EDGAR_POE ]" HISTOIRES EXTRAORDINAIRES" ; && $! ( adr -> _ ) ( str "> _ ) - Extrait la chaine du sommet de pile de chaine et la range a l'adresse adr normalement delivre par une variable chaine. L'octet a l'adresse adr est lue pour connaitre la longueur maximum de la zone de rangement utile.Si la zone est trop petite pour contenir la chaine str,alors un message d'erreur est emis et ABORT est execute. Visualisation de la zone de rangement apres $! - : Longueur de la zone de rangement,inchangee 0<= x <=255 - : Longueur de la chaine rangee (Nb de codes ascii utiles) - : Premier code ascii de la chaine - <.> : Code ascii Numero 2 a x-1 - : Dernier code ascii de la chaine - : Octet nul,symbole de fin de chaine - <.> : Zone Inchangee Remarque : Pour une zone de rangement utile de x caracteres la zone memoire a prevoir est x+3 Ex: 20 $VAR A$ \ Creation d'une variable chaine de 20 \ caracteres utiles " VICTOR HUGO" A$ $! \ Chargement de A$ A$ $TYPE \ Affichage de A$ && $" ( _ -> _ ) ( _ "> _ ) - Isole une chaine du flot d'entree et la recopie a l'adresse delivree par la uservariable PSTRING. La chaine commence apres le caractere blanc suivant " et se termine a a la rencontre du caractere delimiteur de code ascii 34 " Si le code ascii 34 n'est pas rencontre,un message d'erreur est emis et ABORT est execute. Une definition possible de $" serait : DECIMAL : $" ( _ -> _ ) 34 WORD \ Isole la chaine 34 <> \ Teste si caractere delimiteur ?ABORT" " \ Erreur " non rencontre PSTRING D@ \ Adresse de la zone de transfert 2 DPICK C@ 2 U+ \ Nb d'octet a transferer CMOVE \ Transfert PSTRING D@ \ Empile l'adresse de transfert ; $\ Fin && $$! ( adr1 adr2 -> _ _ ) ( _ "> _ ) -' Va chercher la chaine de caracteres de la zone memoire commencant a l'adresse adr1 et la range dans la zone memoire commencant a l'adresse adr2. Ces zones memoire doivent etre organisees de la meme facon que pour $! (voir ce mot). Si la zone commencant a l'adresse adr2 est trop petite,un message d'erreur est emis et ABORT est execute. Ex : 20 $VAR X$ \ Creation de la variable chaine X$ 30 $VAR Y$ \ Creation de la variable chaine Y$ " FRANCE" X$ $! \ Chargement de X$ X$ Y$ $$! \ Recopie de X$ dans Y$ Y$ $TYPE \ Verification && $@ ( adr -> _ ) ( _ "> str ) - Va chercher la chaine de caracteres de la zone memoire commencant a l'adresse adr et l'empile dans la pile de chaine. Cette zone memoire doit etre organisee de la meme facon que pour $! (voir ce mot). Ex : En reprenant l'exemple de $! A$ $@ \ Empile le contenu de la variable chaine1 A$ \ dans la pile de chaine "TYPE \ Affichage && $GET ( adr -> _ ) ( _ "> str ) -" Va chercher la chaine de caracteres commencant a l'adresse adr et l'empile dans la pile de chaines. Le premier code ascii est a l'adresse adr . Il n'y a pas d'octet indicateur de longueur. La chaine se termine lorsque le caractere de terminaison de chaines est trouve ( code Null 0 ). && $TYPE ( adr -> _ ( _ "> _ ) - Affiche sur le peripherique _OUT la chaine de caractere situee dans la zone memoire commencant a l'adresse adr. Cette memoire doit etre organisee de la meme facon que pour $! (voir ce mot). Ex : En reprenant l'exemple de $! A$ $TYPE \ Affiche le contenu de la variable chaine A$ && $VAR ( u -> _ ) ( _ "> _ ) -$ Mot reserve a l'execution. Cree une variable chaine de nom .Cette variable est initialisee a nulle lors de cette creation. Si u>255 alors un message d'erreur est emis et ABORT est execute. La zone utile de rangement sera de u caracteres. Le premier octet de la zone de rangement est initialise a u. Les u+2 octets suivants sont mis a 0 Voir les mots $!,$@ $$ ! pour manipulation de cette variable chaine. * =! FIN =" D - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 04/01/87 - UTILISATION DES POINTEURS MEMOIRE -! A>PRESENTATION - Le registre d'adresse a5 et le registre de donnees d7 du MC68000 sont utilises pour la gestion de pointeurs en memoire. Les modes d'adressage performants du MC68000 sont utilises pour accroitre la rapidite de transfert d'information en memoire et simplifier le travail sur la pile de donnes. A partir du registre a5,il set possible de developper une infinite de pointeurs grace au mot X<->V qui echange le contenu d'une variable defini en FORTH avec le contenu du registre. Ces outils permettront au developpeur Forth d'orienter sa programmation comme il le souhaitera : - Creation de piles annexes - Lecture ou ecriture rapide en memoire - Transfert de blocs d'informations. - . B>UTILISATION - Notations - Le mode predecremente note (-X) decremente d'abord le registre X d'une entite logique avant d'effectuer une operation . Le mode postincremente note (X+) incremente le registre X d'une entite logique apres avoir effectue une operation. L'entite logique peut etre l'octet,le mot 16bits,le mot long 32bits. Le registre X est decremente ou incremente d'une valeur correspondante a l'entite logique pour pointer l'element precedent ou suivant . Notons (..) les modes (-X) ou (X+) pour la suite : Le transfert de la memoire vers la pile data est note (..)> Le transfert de la pile data vers la memoire est note >(..) Le transfert d'octet est note C>(..) ou C(..)> Le transfert de mot 16bits est note >(..) ou (..)> Le transfert de mot 32bits est note D>(..) ou D(..)> Attention - Une contrainte technologique d'adressage PAIR au niveau de la pile data fait que lors du transfert d'octet,un mot 16bits est empile ou depile de la pile data.Les 8bits de poids forts de ce mot sont ignores. De meme ,lors de transfert de mots 16bits ou 32bits,le registre X doit contenir une adresse paire. APPLICATONS - 1>Constitution d'une pile ascendante annexe -+ Appellons cette pile PILE et definissons des mots semblables a >R D>R R> DR> pour cette pile DECIMAL DVAR PILXE_ORG \ Creation d'une variable double longueur 1000 ALLOT \ Allocation de 1000 Octets pour PILE HERE PILE_ORG D! \ Sauvegarde de l'origine de PILE HERE XP! \ Initialisation du pointeur X 10 ALLOT \ Une petite securite pour les debordements Les definitions qui suivent ne sont nullement obligatoires et n'apportent rien au niveau fonctionnement.Elles sont la pour essayer d'eclaircir l'utilisation de la pile ascendante par analogie avec les mots qui utilisent la pile de retour. Notez en plus qu'il n'introduisent aucun temps systeme (contrairement aux autres forth) grace a la compilation "inline". : C>PILE C>(-X) ; \ Transfert au niveau de l'octet : CPILE> C(X+)> ; : >PILE >(-X) ; \ Transfert au niveau du mot 16bits : PILE> (X+)> ; : D>PILE D>(-X) ; \ Transfert au niveau du mot 32bits : DPILE> D(X)> ; : NETTOIE_PILE PILE_ORG D@ XP! ; : PROFONDEUR_PILE PILE_ORG D@ XP@ UD- ; Restriction d'utilisation -Ne pas melanger les octets et les mots ou alors faire tres attention de transferer un nombre pair d'octet avant de transferer un mot. -Aucune precaution n'est prise pour les debordement de cette pile annexe. 2>A suivre - D'autres exemples d'utilisation seront fournis dans les prochaines versions,notamment pour la gestion multi-pointeurs  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 12/01/87 - Creation de tableau de dimensions quelconques -- Deux mots permettent la creation et l'acces aux tableaux de dimensions limitees exclusivement par la memoire disponible. Ceci est fidele a la philosophie Forth : Au lieu d'imposer des tableaux predefinis,il est preferable de fournir a l'utilisateur des outils pour les creer a son propre gre. && DIM ( u1 ... ui uj uk -> adr _ _ ... _ ) -+ Initialise et reserve la memoire pour la gestion d'un tableau de i dimensions (u1, ... ,ui) . Chaque cellule elementaire de ce tableau occupera uk octets. L'argument uj permet a DIM de connaitre le nombre de dimensions de ce tableau ( uj doit donc etre egal a i ) Chaque dimension comporte un nombre d'elements egal a sa limite+1. L'indice d'acces peut varier entre 0 et la limite inclus. Ex : la dimension 1 comporte u1+1 elements ( 0<=ind1<= u1 ) la dimension 2 comporte u2+1 elements ( 0<=ind2<= u2 ) . la dimension i comporte ui+1 elements ( 0<=indi<= ui ) L'adresse d'une cellule elementaire est donc definie par un ensemble d'indice ( 1 indice par dimension ) La memoire necessaire a ce tableau est reservee a la position courante de DP (dictionnary pointer). Un certain nombre d'octets appele tete de tableau dependant du nombre de dimensions est d'abord reserve pour la gestion de ce tableau par ARRAY. Le nombre d'octets necessaire aux cellules est ensuite reserve et chaque octet est mis a 0 . Si la memoire est insuffisante c'est a dire si il y a interference avec la pile de donnees,un message d'erreur est emis et ABORT est execute. L'adresse adr de la premiere cellule du tableau est empilee permettant une initialisation du tableau differente de 0. Le dernier octet de la derniere cellule du tableau a pour adresse HERE-1 Precisions sur la constitution de la tete de tableau: -5 Elle commence a l'adresse cfa (code field address) du tableau. Les 6 premiers octets sont normalement initialises par CREATE (voir exemple d'utilisation) Les octets suivants a partir de cfa+6 sont initialises par DIM Les nombres 32bits (coefficients ou adresse) sont reperes par le symbole >> . Les coefficients (valeurs pour l'acces aux cellules) sont calcules a la creation du tableau de facon a reduire le temps d'acces aux cellules. Adresse Description Contenu - - - : Code MC68000 JSR $4EB9 > : adresse saut (mot suivant DOES) ... : Nombre de dimensions du tableau Uj : Valeur limite de la dimension i Ui : Nombre d'octets par cellule Uk : Valeur limite de la dimension i-1 Ui-1 > : Coefficient de calcul pour ARRAY (Ui)*(Uk) : Valeur limite de la dimension i-2 Ui-2 > : Coefficient de calcul pour ARRAY (Ui-1)*(Ui)*(Uk) : Valeur limite de la dimension i-3 Ui-3 > : Coefficient de calcul pour ARRAY (Ui-2)*(Ui-1)*(Ui)*(Uk) . : Valeur limite de la dimension 1 U1 > : Coefficient de calcul pour ARRAY +(U2)*(..)*(Ui-2)*(Ui-1)*(Ui)*(Uk) : Premiere cellule du tableau indices 0,0,...,0 : Deuxieme cellule du tableau indices 0,0,...,1 . : Derniere cellule du tableau indices u1,u2,...,ui (immediatement apres l'execution de DIM) && ARRAY ( u1 ... ui adr1 -> adr2 _ ... _ ) -+ Ce mot permet de calculer l'adresse d'une cellule elementaire dans un tableau cree par DIM . adr1 est l'adresse de tete de ce tableau (La zone memoire pointee a ete initialise precedemment par DIM adr1=cfa+6) u1 ... ui sont les indices d'acces a une cellule elementaire pour chacune des dimensions 1 a i. Si l'un des indices est hors limite par rapport a l'initialisation effectuee dans DIM,un message d'erreur est emis et ABORT est execute. Exemples: - 1> Outil de creation d'un tableau d'octets a une dimension \ Creation de l'outil de definition : VAR_1D_C ( u -> _ ) \ u+1 cellules dans le tableau CREATE \ Creation de la tete de mot et execution de ce \ qui suit a la definition du mot 1 \ Tableau a 1 dimension 1 \ 1 octet par cellule elementaire DIM \ Cree le tableau DDROP \ L'adresse fournit par DIM n'est pas utile DOES \ Definit la partie execution ARRAY \ Calcule l'adresse de la cellule ; \ Utilisations 1000 VAR_1D_C X \ Creation du tableau a 1 dimension de nom X \ comprenant 1001 octets 99 400 X C! \ Pourrait s'ecrire en Pascal X(400):=99 401 X C@ 502 X C! \ Pourrait s'ecrire en Pascal X(502):=X(401) 255 VAR_1D_C Y \ Creation du tableau a 1 dimension de nom Y \ comprenant 256 octets 2> Outil de creation d'un tableau de mots double precision a 3 dimensions \ Creation de l'outil de definition : VAR_3D_D ( u1 u2 u3 -> _ _ _ _ ) CREATE \ Creation de la tete de mot et execution de ce \ qui suit a la definition du mot 3 \ Tableau a 3 dimensions 4 \ 4 octets par cellule elementaire DIM \ Cree le tableau DDROP \ L'adresse fournit par DIM n'est pas utile DOES \ Definit la partie execution ARRAY \ Calcule l'adresse de la cellule ; \ Utilisations 2 4 6 VAR_3D_D Z \ Creation du tableau a 3 dimension de nom Z \ comprenant 3*5*7 mots double precision 9 \ Pourrait s'ecrire en Pascal 0 0 0 Z D! \ Z(0,0,0):=9 0 0 0 Z D@ \ Pourrait s'ecrire en Pascal 2 4 6 Z D! \ Z(2,4,6):=Z(0,0,0) 4. \ Pourrait s'ecrire en Pascal 0 0 0 Z D+! \ Z(0,0,0):=Z(0,0,0)+4  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 19/03/87 - STRUCTURES DE COMMANDE - De facon a reduire les temps d'execution en utilisant au maximum les possibites de branchement offertes par le MC68000,ce Forth est tres riche en structure de commande. Plusieurs groupes de structure de commandes ont ete constitues: -Les conditionnelles -Les repetitivesU -Les iteratives -Les selections multiples -L 1>LES CONDITIONELLES - && ELSE ( _ -> _ ) - Mot immediat reserve a la compilation A employer dans une structure de commande conditionnelle IFx_ELSE_ENDIF. A la compilation : -Teste si la marque $1111 est presente en sommet de pile data (voir IFx) Si cette marque d'identification des structures de commande IFx_ELSE_ENDIF n'est pas presente, un message d'erreur est emis et ABORT (voir ce mot) est execute. -Compile le code machine bra (branch avec offset sur 1 mot 16bits) -Resouds le branchement avant du IFx precedent par un appel a >RESOLVE -Empile l'adresse suivant le code bra pour la resolution du branchement par ENDIF -Empile la marque d'identification $1111 pour ENDIF A l'execution : Si la clause IFx est verifiee,la sequence de mots suivant IFx est executee jusqu'a la rencontre du bra compile (voir ci-dessus) qui provoque le branchement apres ENDIF. && ENDIF ( _ -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande IFx_ENDIF ou IFx_ELSE_ENDIF. A la compilation : -Teste la presence de la marque d'identification $1111 en sommet de pile data.Si une mauvaise imbrication est detectee par ce biais , un message derreur est emis et ABORT (voir ce mot) est execute. -Resouds le branchement avant de ELSE ou de IFx par un appel a >RESOLVE (voir ces mots) A lexecution : ENDIF est invisible. && IFF ( w -> _ ) - Mot immediat reserve a la compilation:"iffalse" A employer dans une structure de commande alternative IFF_ELSE_ENDIF. ou conditionnelle IFF_ENDIF. A la compilation : -Compile tst.w (a6)+,bne label (offset sur 16 bits). Le label sera resolu par ENDIF ou par ELSE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $1111 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition IFF est verifiee si w est egal 0 . Si la condition est verifiee,la sequence d'instructions entre IFF et ELSE ou ENDIF (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant ELSE ou ENDIF. && IFM ( n -> _ ) - Mot immediat reserve a la compilation:"ifminus" A employer dans une structure de commande alternative IFM_ELSE_ENDIF ou conditionnelle IFM_ENDIF. A la compilation : -Compile tst.w (a6)+,bge label (offset sur 16bits). Le label sera resolu par ENDIF ou par ELSE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $1111 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition IFM est verifiee si n est strictement inferieur a 0. Si la condition est verifiee,la sequence d'instructions entre IFM et ELSE ou ENDIF (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant ELSE ou ENDIF. && IFP ( n -> _ ) - Mot immediat reserve a la compilation:"ifplus" A employer dans une structure de commande alternative IFP_ELSE_ENDIF ou conditionnelle IFP_ENDIF. A la compilation : -Compile tst.w (a6)+,ble label (offset sur 16bits). Le label sera resolu par ENDIF ou par ELSE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $1111 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition IFP est verifiee si n est superieur strictement a 0 . Si la condition est verifiee,la sequence d'instructions entre IFP et ELSE ou ENDIF (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant ELSE ou ENDIF. && IFT ( w -> _ ) - Mot immediat reserve a la compilation:"iftrue" A employer dans une structure de commande alternative IFT_ELSE_ENDIF ou conditionnelle IFT_ENDIF. A la compilation : -Compile tst.w (a6)+,beq label (offset sur 16bits). Le label sera resolu par ENDIF ou par ELSE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $1111 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition IFT est verifiee si w est different de 0. Si la condition est verifiee,la sequence d'instructions entre IFT et ELSE ou ENDIF (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant ELSE ou ENDIF. -L 2> LES REPETITIVES - Deux classes de repetitives sont offertes: -Avec indices simple precision 16bits -32768<=indices<=32767 DO ... LOOP , ?DO ... LOOP , DO ... +LOOP , ?DO ... +LOOP avec des mots specialises I , IL , J , K , LEAVE -Avec indices double precision 32bits -2.147.483.647<=indices<=2.147.483.647 DDO ... DLOOP , ?DDO ... DLOOP , DDO ... D+LOOP , ?DDO ... D+LOOP avec des mots specialises DI , DIL , DJ , DK , DLEAVE Le nombre d'imbrications possibles des repetitives est illimite (il est tout de meme limite par la capacite de la pile return). Il est possible d'imbriquer des repetitives de classes differentes mais les mots d'acces aux indices de repetitives de niveaux inferieurs J,K,DJ,DK seront errones.Il est toutefois possible d'obtenir ces indices par RPICK et DRPICK (voir ces mots) en calculant la position de l'indice cherche dans la pile return. Les Repetitives simple precision - && +LOOP ( n -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande repetitive DO_+LOOP ou ?DO_+LOOP. A la compilation : -Teste la presence de la marque d'identification des boucles simple precision $7777 en sommet de pile data Si la marque est erronnee ,un message d'erreur est emis et ABORT est execute. -Compile "inline" le code (+LOOP) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Resouds le branchement arriere de +LOOP vers le mot suivant DO ou ?DO par un appel a _ ) \ n Indice limite -4 \ -4 Indice debut DO I . \ Affichage de l'indice courant 2 +LOOP \ Incremente l'indice de boucle de 2 ; 8 COMPTE \ de -4 a +8 (indice limite)  && ?DO ( n1 n2 -> _ _ ) - Mot immediat reserve a la compilation. A employer dans une structure de commande repetitive ?DO_LOOP ou ?DO_+LOOP. A la compilation : -Compile un appel a un sousprogramme (?DO) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Empile l'adresse contenu par DP .A cette adresse sera rangee l'adresse du mot suivant LOOP ou +LOOP pour sortie forcee de la boucle ?DO_LOOP ou ?DO_+LOOP par LEAVE. -Reserve 2 mots 16 bits (initialises a 0) en incrementant DP de 4 unites pour le stockage de cette adresse. -Empile la marque d'identification $7777 des boucles repetitives simple precision pour le controle par LOOP ou +LOOP. -Incremente CSP (control stack) d'une unite . A l'execution : Le sousprogramme (?DO) est execute : L'indice_debut n2 est compare (avec signe) a l'indice_limite n1. -Si n2>n1 un branchement est effectue vers le mot suivant LOOP. La sequence d'instruction incluse dans la boucle ?DO_LOOP n'est donc pas executee. -Si n2<=n1 alors (?DO) empile successivement dans la pile return l'adresse pour LEAVE (voir ce mot) puis les parametres 16bits de la boucle indice_limite n1 puis indice_debut n2. L'indice_debut n2 est donc place en sommet de pile return . Au cours de l'execution de la boucle ?DO_LOOP ou ?DO_+LOOP, l'indice courant est accessible par I (voir ce mot). && DO ( n1 n2 -> _ _ ) - Mot immediat reserve a la compilation A employer dans une structure de commande/ repetitive DO_LOOP ou DO_+LOOP. A la compilation : -Compile un appel a un sousprogramme (DO) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Empile l'adresse contenue par DP .A cette adresse sera rangee l'adresse du mot suivant LOOP ou +LOOP pour sortie forcee de la boucle DO_LOOP ou DO_+LOOP par LEAVE. -Reserve 2 mots 16 bits (initialises a 0) en incrementant DP de 4 unites pours le stockage de cette adresse. -Empile la marque d'identification $7777 des boucles repetitives pour le controle par LOOP ou +LOOP. -Incremente CSP (control stack) d'une unite . A l'execution : Le sousprogramme (DO) est execute : Celui-ci empile successivement dans la pile return -L'adresse pour LEAVE (voir ce mot) -Les parametres 16bits de la boucle indice_limite n1 puis indice_debut n2. L'indice_debut n2 est donc place en sommet de pile return . Au cours de l'execution de la boucle DO_LOOP ou DO_+LOOP, l'indice courant est accessible par I (voir ce mot). && I ( _ -> n ) - Lit le mot 16bits au sommet de la pile return et l'empile sur la pile data. n est l'indice courant 1er niveau dans le cas d'une boucle simple precision DO_LOOP (ou de ses derives) . && IL ( _ -> n ) - Lit le deuxieme mot 16bits de la pile return et l'empile sur la pile data. n est l'indice limite 1er niveau dans le cas d'une boucle simple precision DO_LOOP (ou de ses derives). && J ( _ -> n ) - Lit le cinquieme mot 16bits de la pile return d'adresse (sp)-$8 et l'empile sur la pile data. n est l'indice courant 2eme niveau dans le cas d'une boucle DO_LOOP a l'interieur d'une boucle DO_LOOP (ou de ses derives). && K ( _ -> n ) - Lit le neuvieme mot 16bits de la pile return d'adresse (sp)-$10 et l'empile sur la pile data. n est l'indice courant 3eme niveau dans le cas d'une boucle simple precision DO_LOOP a l'interieur d'une boucle DO_LOOP elle-meme a l'interieur d'une boucle DO_LOOP (ou de ses derives). && LEAVE ( _ -> _ ) - Mot immediat reserve a la compilation. Force la sortie immediate d'une boucle simple precision DO_LOOP ou de ses derives. Doit etre imperativement etre utilise dans ces conditions sinon LEAVE peut provoquer une erreur systeme. L'execution des mots compris entre LEAVE et LOOP est abandonnee. La pile return est nettoyee et un branchement est effectue au mot suivant LOOP. && LOOP ( _ -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande repetitive DO_LOOP ou ?DO_LOOP. A la compilation : -Teste la presence de la marque d'identification des boucles simple precision $7777 en sommet de pile data. Si la marque est erronnee ,un message d'erreur est emis et ABORT est execute. -Compile "inline" le sous-programme (LOOP) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Resouds le branchement arriere de LOOP vers le mot suivant DO ou ?DO par un appel a _ ) - Mot immediat reserve a la compilation. Termine une structure de commande repetitive DDO_D+LOOP ou ?DDO_D+LOOP. A la compilation : -Teste la presence de la marque d'identification de la boucle DDO ou ?DDO $BBBB en sommet de pile data. Si la marque est erronnee ,un message d'erreur est emis et ABORT Aest execute. -Compile "inline" le code (D+LOOP) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Resouds le branchement arriere de D+LOOP vers le mot suivant DDO ou ?DDO par un appel a _ ) \ d Indice limite -4. \ -4. Indice debut DDO DI D. \ Affichage de l'indice courant 2. D+LOOP \ Incremente l'indice de boucle de 2. ; 8. COMPTE \ de -4 a +8 (indice limite)  && ?DDO ( d1 d2 -> _ _ ) - Mot immediat reserve a la compilation. A employer dans une structure de commande repetitive ?DDO_LOOP ou ?DDO_D+LOOP. A la compilation : -Compile un appel a un sousprogramme (?DDO) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Empile l'adresse contenu par DP .A cette adresse sera rangee l'adresse du mot suivant DLOOP ou D+LOOP pour sortie forcee de la boucle ?DDO_DLOOP ou ?DDO_D+LOOP par DLEAVE. -Reserve 2 mots 16 bits (initialises a 0) en incrementant DP de 4 unites pour le stockage de cette adresse. -Empile la marque d'identification $BBBB des boucles double precision pour le controle par DLOOP ou D+LOOP. -Incremente CSP (control stack) d'une unite . A l'execution : Le sousprogramme (?DDO) est execute : L'indice_debut d2 est compare (avec signe) a l'indice_limite d1. -Si d2>d1 un branchement est effectue vers le mot suivant DLOOP ou D+LOOP.La sequence d'instruction incluse dans la boucle ?DDO_DLOOP ou ?DDO_D+LOOP n'est donc pas executee. -Si d2<=d1 alors (?DDO) empile successivement dans la pile return l'adresse pour DLEAVE (voir ce mot) puis les parametres 32bits de la boucle indice_limite d1 puis indice_debut d2. L'indice_debut d2 est donc place en sommet de pile return . Au cours de l'execution de la boucle ?DDO_LOOP ou ?DDO_D+LOOP , l'indice courant est accessible par DI (voir ce mot). && DDO ( d1 d2 -> _ _ ) - Mot immediat reserve a la compilation A employer dans une structure de commande repetitive DDO_DLOOP ou DDO_D+LOOP. A la compilation : -Compile un appel a un sousprogramme (DDO) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Empile l'adresse contenue par DP .A cette adresse sera rangee l'adresse du mot suivant DLOOP ou D+LOOP pour sortie forcee de la boucle DDO_DLOOP ou DDO_D+LOOP par DLEAVE. -Reserve 2 mots 16 bits (initialises a 0) en incrementant DP de 4 unites pours le stockage de cette adresse. -Empile la marque d'identification $BBBB des boucles repetitives double precision pour le controle par DLOOP ou D+LOOP. -Incremente CSP (control stack) d'une unite . A l'execution : Le sousprogramme (DDO) est execute : Celui-ci empile successivement dans la pile return -L'adresse pour DLEAVE (voir ce mot) -Les parametres 32bits de la boucle indice_limite d1 puis indice_debut d2. L'indice_debut d2 est donc place en sommet de pile return . Au cours de l'execution de la boucle DDO_DLOOP ou DDO_D+LOOP, l'indice courant est accessible par DI (voir ce mot). && DI ( _ -> d ) - Lit le mot 32bits au sommet de la pile return et l'empile sur la pile data. d est l'indice courant 1er niveau dans le cas d'une boucle double precision DDO_DLOOP (ou de ses derives) . && DIL ( _ -> d ) - Lit le deuxieme mot 32bits de la pile return et l'empile sur la pile data. d est l'indice limite 1er niveau dans le cas d'une boucle double precision DDO_DLOOP (ou de ses derives).  && DJ ( _ -> d ) - Lit le cinquieme mot 32bits de la pile return d'adresse (sp)-$C et l'empile sur la pile data. d est l'indice courant 2eme niveau dans le cas de boucles double precision DDO_DLOOP a l'interieur d'une boucle DDO_DLOOP (ou de ses derives). && DK ( _ -> d ) - Lit le neuvieme mot 32bits de la pile return d'adresse (sp)-$18 et l'empile sur la pile data. d est l'indice courant 3eme niveau dans le cas de boucles double precision DDO_DLOOP a l'interieur d'une boucle DDO_DLOOP elle-meme a l'interieur d'une boucle DDO_DLOOP (ou de ses derives). && DLEAVE ( _ -> _ ) - Mot immediat reserve a la compilation. Force la sortie immediate d'une boucle double precision DDO_DLOOP ou de ses derives. Doit etre imperativement etre utilise dans ces conditions sinon DLEAVE peut provoquer une erreur systeme. L'execution des mots compris entre DLEAVE et DLOOP est abandonnee. La pile return est nettoyee et un branchement est effectue au mot suivant DLOOP. && DLOOP ( _ -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande repetitive double precision DDO_DLOOP ou ?DDO_DLOOP. A la compilation : -Teste la presence de la marque d'identification des boucles double precision $BBBB en sommet de pile data. Si la marque est erronnee ,un message d'erreur est emis et ABORT est execute. -Compile "inline" le sous-programme (DLOOP) qui sera execute pendant la partie "runtime" du mot en cours de definition. -Resouds le branchement arriere de DLOOP vers le mot suivant DDO ou ?DDO par un appel a LES ITERATIVES - && BEGIN ( _ -> _ ) - Mot immediat reserve a la compilation. Commence une structure de commande BEGIN_WHILEx_REPEAT ou BEGIN_UNTILx. A la compilation : -Empile le contenu de DP -Empile la marque d'identification $3333 -Incremente le contenu de CSP (control stack) A l'execution : BEGIN est invisible. && ENDWHILE ( _ -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande WHILEx_ENDWHILE . A la compilation : -Teste la presence de la marque d'identification $5555 (normalement depose par WHILEx) en sommet de pile data. Si la marque est erronnee ,un message d'erreur est emis et ABORT (voir ce mot) est execute. -Depile une adresse de la pile data et la sauvegarde -Compile bra ( branchement ) et fait appel a RESOLVE (voir ces mots) -Soustrait une unite de CSP (control stack) A lexecution : ENDWHILE provoque un saut inconditionnel au mot suivant WHILEx. && REPEAT ( _ -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande BEGIN_WHILEx_REPEAT . A la compilation : -Teste la presence de la marque d'identification $5555 (normalement depose par WHILEx) en sommet de pile data. -Depile une adresse de la pile data et la sauvegarde -Teste la presence de la marque d'identification $3333 (normalement depose par BEGIN -Compile bra ( branchement ) et fait appel a RESOLVE (voir ces mots) -Soustrait 2 unites de CSP (control stack) Pour chaque test,si la marque est erronnee,un message d'erreur est emis et ABORT (voir ce mot) est execute. A lexecution : REPEAT provoque un saut inconditionnel au mot suivant BEGIN. && UNTILF ( w -> _ ) - Mot immediat reserve a la compilation:"until_false" A employer dans une structure de commande iterative pour sortir de cette iteration : BEGIN ... UNTILF . A la compilation : -Teste la presence de la marque d'identification $3333 (normalement deposee par BEGIN) en sommet de pile data. Si la marque est erronnee,un message d'erreur est emis et ABORT (voir ce mot) est execute. -Compile tst.w (a6)+,bne label (offset sur 8 ou 16 bits). -Le label est resolu par un appel a 0),un branchement arriere est effectue vers le mot suivant BEGIN. && UNTILM ( n -> _ ) - Mot immediat reserve a la compilation:"until_minus" A employer dans une structure de commande iterative pour sortir de cette iteration : BEGIN ... UNTILM . A la compilation : -Teste la presence de la marque d'identification $3333 (normalement deposee par BEGIN) en sommet de pile data. Si la marque est erronnee,un message d'erreur est emis et ABORT (voir ce mot) est execute. -Compile tst.w (a6)+,bge label (offset sur 8 ou 16 bits). -Le label est resolu par un appel a =0),un branchement arriere est effectue vers le mot suivant BEGIN. && UNTILP ( n -> _ ) - Mot immediat reserve a la compilation:"until_plus" A employer dans une structure de commande iterative pour sortir de cette iteration : BEGIN ... UNTILP . A la compilation : -Teste la presence de la marque d'identification $3333 (normalement deposee par BEGIN) en sommet de pile data. Si la marque est erronnee,un message d'erreur est emis et ABORT (voir ce mot) est execute. -Compile tst.w (a6)+,ble label (offset sur 8 ou 16 bits). -Le label est resolu par un appel a 0) est verifiee,la sequence d'instructions suivant UNTILP est executee. Si la condition n'est pas verifiee (n<=0),un branchement arriere est effectue vers le mot suivant BEGIN. && UNTILT ( w -> _ ) - Mot immediat reserve a la compilation:"until_true" A employer dans une structure de commande iterative pour sortir de cette iteration : BEGIN ... UNTILT . A la compilation : -Teste la presence de la marque d'identification $3333 (normalement deposee par BEGIN) en sommet de pile data. Si la marque est erronnee,un message d'erreur est emis et ABORT (voir ce mot) est execute. -Compile tst.w (a6)+,beq label (offset sur 8 ou 16 bits). -Le label est resolu par un appel a 0),la sequence d'instructions suivant UNTILT est executee. Si la condition n'est pas verifiee (w=0),un branchement arriere est effectue vers le mot suivant BEGIN. && WHILEF ( w -> _ ) - Mot immediat reserve a la compilation:"whilefalse" A employer dans une structure de commande iterative pour sortir de cette iteration (BEGIN_WHILEF_REPEAT ou WHILEF_ENDWHILE). A la compilation : -Compile tst.w (a6)+,bne label (offset sur 16 bits). Le label sera resolu par REPEAT ou par ENDWHILE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $5555 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition WHILEF est verifiee si w est egal 0 . Si la condition est verifiee,la sequence d'instructions entre WHILEF et REPEAT ou ENDWHILE (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant REPEAT ou ENDWHILE. && WHILEM ( n -> _ ) - Mot immediat reserve a la compilation:"whileminus" A employer dans une structure de commande iterative pour sortir de cette iteration (BEGIN_WHILEM_REPEAT ou WHILEM_ENDWHILE). A la compilation : -Compile tst.w (a6)+,bge label (offset sur 16bits). Le label sera resolu par REPEAT ou par ENDWHILE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $5555 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition WHILEM est verifiee si n est strictement inferieur a 0 . Si la condition est verifiee,la sequence d'instructions entre WHILEM et REPEAT ou ENDWHILE (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant REPEAT ou ENDWHILE. && WHILEP ( n -> _ ) - Mot immediat reserve a la compilation:"while_plus" A employer dans une structure de commande iterative pour sortir de cette iteration (BEGIN_WHILEP_REPEAT ou WHILEP_ENDWHILE). A la compilation : -Compile tst.w (a6)+,ble label (offset sur 16bits). Le label sera resolu par REPEAT ou par ENDWHILE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $5555 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition WHILEP est verifiee si n est superieur strictement a 0 . Si la condition est verifiee,la sequence d'instructions entre WHILEP et REPEAT ou ENDWHILE (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant REPEAT ou ENDWHILE. && WHILET ( w -> _ ) - Mot immediat reserve a la compilation:"while_true" A employer dans une structure de commande iterative pour sortir de cette iteration (BEGIN_WHILET_REPEAT ou WHILET_ENDWHILE). A la compilation : -Compile tst.w (a6)+,beq label (offset sur 16 bits). -Le label sera resolu par REPEAT ou ENDWHILE (voir ces mots) -L'adresse du label a resoudre et une marque d'identification $5555 sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition WHILET est verifiee si w est different de 0 . Si la condition est verifiee,la sequence d'instructions entre WHILET et REPEAT ou ENDWHILE (voir ces mots) est executee.Sinon,un branchement est effectue vers le mot suivant REPEAT ou ENDWHILE. -L 4>LES SELECTIONS MULTIPLES - && CASE ( _ -> _ ) - Mot immediat reserve a la compilation. Commence une structure de commande CASE_OF_ENDOF_ENDCASE . Les structures CASE_ENDCASE peuvent etre imbriquees . A la compilation : -Empile le contenu de CASEPTR -Sauvegarde le pointeur de pile (registre a6) dans CASEPTR -Empile la marque d'identification $9999 -Incremente le contenu de CSP (control stack) A l'execution : CASE est invisible. Ex:Affichage de la touche frappee si touche 1,2,3 Sortie par appui sur : TEST ( _ -> _ ) \ Pas d'argument d'entree BEGIN CRLF KEY DUP [ HEXA ] 0D = \ Teste si touche WHILEF \ Code ascii $0D CASE 31 OF ." Touche 1" ENDOF \ $31 code ascii de la touche 1 32 OF ." Touche 2" ENDOF \ $32 code ascii de la touche 2 33 OF ." Touche 3" ENDOF \ $33 code ascii de la touche 3 ." Autre Touche" ENDCASE REPEAT DROP \ Nettoie la pile data ; && ENDCASE ( w -> _ ) - Mot immediat reserve a la compilation. Termine une structure de commande CASE_OF_ENDOF_ENDCASE. A la compilation : 1>Teste la presence de la marque d'identification $9999 en sommet de pile data.Si une mauvaise imbrication est detectee par ce biais , un message derreur est emis et ABORT (voir ce mot) est execute. 2>Resouds le branchement avant de ENDOF par un appel a >RESOLVE w (voir ce mot) 3>Decremente CSP (control stack) d'une unite. Les operations 1> 2> et 3> sont repetees jusqu'a ce que le pointeur de pile data pointe la meme adresse que le contenu de CASEPTR. -Le contenu precedent (avant CASE) de CASEPTR est restituee. -Le code correspondant a DROP (addq.l #2,a6) est compile. A lexecution : DROP est execute. && ENDOF ( _ -> _ ) - Mot immediat reserve a la compilation. A employer dans une structure de commande CASE_OF_ENDOF_ENCASE. A la compilation : -Teste la presence de la marque d'identification $AAAA en sommet de pile data.Si une mauvaise imbrication est detectee par ce biais , un message derreur est emis et ABORT (voir ce mot) est execute. -Compile bra label (offset sur 16bits) Le label sera resolu par ENDCASE. -Resouds le branchement avant de OF par un appel a >RESOLVE (voir ce mot) -Empile sucessivement l'adresse du label a resoudre puis la marque d'identification $9999 pour OF et ENDCASE A lexecution : ENDOF effectue le branchement sur le code compile par ENDCASE. && OF ( w1 w2 -> w1 _ ) - Mot immediat reserve a la compilation. A employer dans une structure de commande CASE_OF_ENDOF_ENDCASE. A la compilation : -Teste la presence de la marque d'identification $9999 laisse par CASE ou ENDOF. -Compile move.w (a6)+,d0|cmp.w (a6),d0|bne label (offset sur 16bits). Une forme contractee est compilee si le dernier objet compile est un literal simple longueur: cmpi.w #..,(a6)|bne label. Le label sera resolu par ENDOF (voir ce mot). -L'adresse du label a resoudre et une marque d'identification $AAAA sont successivement empilees. -Le contenu de CSP est incremente d'une unite. A lexecution : La condition OF est verifiee si w1=w2. Si la condition est verifiee,la sequence d'instructions entre OF et ENDOF (voir ce mot) est executee.Sinon,un branchement est effectue vers le mot suivant le prochain ENDOF. -L  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 01/02/87 - ECRITURE DES FICHIERS SOURCE FORTH -" 1>UTILISATION DE L'EDITEUR DE BLOCS INCORPORE -- Un Editeur de blocs Forth incorpore au noyau Forth permet d'editer individuellement des pages ecran.La longueur de ces blocs est fixe et correspond au nombre de caracteres affichable sur un ecran (augmente des caracteres de controle) en haute et moyenne resolution d'ou le nom de pages ecran. L'editeur est de type pleine page,c'est a dire que le curseur d'edition peut se deplacer sur toute la page a l'aide des touches "fleches". Reportez-vous au mot BEDIT pour connaitre les possibites de cet editeur. Pour memoriser ces pages sur disque,il faut d'abord creer un fichier de blocs Forth (Voir $FCREATE) de type "BLK" imperativement. Pour ouvrir un fichier existant,utilisez $FOPEN . Ensuite les pages necessaires sont crees au fur et a mesure des besoins (Voir BCREATE). Un fichier de blocs peut contenir de 0 a 1022 pages ecran numerotees 1 a 1022. Si une sauvegarde sur disque n'est pas envisagee,les numeros de pages peuvent etre compris entre 1 et 32767 (Par appel direct a BUFFER). Un des avantages de cet editeur est que les numeros de pages ne sont pas forcement consecutifs.Ceci permet de laisser des trous dans la e numerotation pour des adjonctions futures (comparable a la numerotation de 10 en 10 des lignes basic). De plus,un mot de renumerotation des pages a ete prevu (BRENAME). Pour faciliter l'ecriture des fichiers sources Forth,des mots complementaires travaillant sur le fichier actif existent : - BCOPY Copie un bloc dans un autre - BPRINT Sort un bloc sur imprimante parallele - BWIPE Efface un bloc (le remplit de blancs) - BSWAP Echange de deux blocs - BRENAME Change le numero d'un bloc existant. - BPRIOR Force un bloc a rester en memoire (evite les acces disque) . Il est aussi possible de travailler alternativement sur deux fichiers ouverts.Le dernier fichier ouvert ($FOPEN) ou cree ($FCREATE) est dit actif.Si un fichier etait deja ouvert lors de l'execution de $FOPEN ou $FCREATE, alors ce fichier est devenu inactif. Il est possible d'inverser les fichiers actifs et inactifs par $FSWAP. Les mots de manipulations de blocs interfichiers sont : - BEXPORT Exporte un bloc vers le fichier *.BLK inactif - BIMPORT Importe un bloc existant venant du fichier *.BLK inactif Pour gerer completement jusqu'a deux fichiers de 2 Mega_octets (1022 pages de 2 Kilo_octets) chacun , cet editeur utilise seulement 32 Kilo_octets de memoire ! Des techniques de memoire virtuelle avec faute de page ont ete utilisees pour rendre transparent a l'utilisateur la gestion des pages. L'editeur essaie de conserver en memoire les pages les plus frequemment appelees pour eviter les acces disque. Note personnelle: - Ce type d'editeur propre a Forth a tendance a disparaitre au profit d'editeur travaillant sur des textes sources de longueur quelconque genre "1st Word".Toutefois,mon experience personnelle sur Forth m'a prouve que la mise au point d'une definition de mot est plus rapide avec l'editeur de blocs car la structuration en blocs permet des aller-retour ultra-rapide entre la compilation et l'edition et ceci definitions par definitions. Les mots de manipulations de blocs decrits ci-dessus permettent en outre de reorganiser completement un fichier *.BLK pendant et apres la mise au point. Sa faible longueur (moins de 6Koctets gestion des buffers incluse) a permis de l'inclure dans le noyau. Il est tout de meme possible de charger un fichier texte grace au mot $FLOAD.Les versions ulterieures de forth permettront d'appeler un editeur exterieur a Forth depuis Forth avec retour a celui-ci. 2>UTILISATION D'UN EDITEUR DE TEXTE CLASSIQUE -- Si l'editeur de bloc Forth vous semble trop contraignant,vous pouvez utiliser un editeur de texte classique . Comme sigle de reconnaissance,il est souhaitable (mais pas imperatif) d'utiliser l'extension .FTH pour ces fichiers sources Forth. Cet editeur devra respecter les regles generalement admises pour les textes sources de langage: -Les seuls caracteres de controle admis sont le code retour chariot (code ascii decimal 13 ) suivi du code fin de ligne (code ascii decimal 10 ).Chaque ligne devra donc etre terminee par les codes . Les autres caracteres de controle (tabulation,marque de changement de caracteres,sonnerie....) provoqueraient l'arret du chargement et l'affichage d'un message d'erreur. -Le fichier peut etre de longueur quelconque Il sera charge dans son integralite en une seule passe sauf en cas de rencontre d'erreur .Dans ce cas,le chargement sera stoppe et un message d'erreur sera emis. Le chargement du fichier x.FTH depuis Forth s'effectue de la maniere suivante: $"x.FTH" $FLOAD. Les mots specialises pour la gestion des blocs sont interdits -> BLOAD BEDIT BLIST . Tous les autres mots sont autorises: commentaires \ ( .. ) . 3>LISTE DES MOTS DE L'EDITEUR DE BLOCS -& && $FCLOSE ( _ -> _ ) - Ferme le fichier actif s'il est ouvert. Le fichier inactif devient actif s'il existe. Si une erreur se produit,un message d'erreur est emis et ABORT est execute. Si le fichier actif etait un fichier source Forth ( *.BLK),alors les buffers contenant un bloc Forth mis_a_jour sont recopies dans le fichier avant fermeture. Les buffers utilises par ce fichier sont liberes. && $FCREATE ( adr$ -> _ ) - 1 CREE un fichier accessible en lecture/ecriture dans le directory courant si un pathname n'est pas specifie.Le pathname (eventuel) suivi du nom de fichier doit etre place a l'adresse adr$. Si le fichier existe deja ou si il n'y a plus de handle disponible un message d'erreur est emis. Si un fichier etait ouvert avant l'execution de $FCREATE ce fichier est devenu inactif.Le dernier fichier ouvert est toujours actif (sauf utilisation de $FSWAP). Le No d'acces (file handle) est place dans la user_variable FHDLE. Si le type du fichier est "BLK",ce fichier est initialise pour contenir un fichier de blocs Forth: Les 2048 premiers octets sont reserves pour contenir des pointeurs de blocs. <0000 _ 0003> : 4 octets contenant un sigle de reconnaissance de de fichiers bloc <$42,$4C,$4B,$00> pour BLK <0004 _ 0005> : Offset/2048 du bloc 1 <0006 _ 0007> : Offset/2048 du bloc 2 <0008 _ 0009> : Offset/2048 du bloc 3 . <2046 _ 2047> : Offset/2048 du bloc 1022 L'offset est le nb d'octets entre le debut du fichier et le bloc considere.A l'initialisation,tous les offsets sont mis a 0 pour indiquer qu'aucun bloc n'existe. Les blocs sont alloues individuellement par BCREATE (voir ce mot). Un buffer est aussi requis pour la gestion des blocs (pointe par BLKDIRAD).Toute tentative de creation ou d'acces a un bloc se fera par l'intermediaire de ce buffer qui contient les 2048 premiers octets du fichier. EX: Creation d'un nouveau fichier et chargement $" xxxx.BLK" $FCREATE 1 BCREATE \ Creer le bloc numero 1 1 BEDIT \ Edite le bloc 1 pour entree programme 1 BLOAD \ Chargement $FCLOSE \ Ferme le fichier "xxxx.BLK" apres mise a \ jour && $FLOAD ( adr$ -> _ ) - CHARGE le fichier dont le nom (eventuellement pathname) est stocke dans la chaine de caractere commencant a l'adresse adr$. Si le fichier n'est pas trouve,un message d'erreur est emis. L'interpretation commence au debut du fichier.Si une erreur est detectee pendant le chargement,un message d'erreur est emis et ABORT est execute. Ce mot est utilise pour charger un fichier cree avec un editeur de texte exterieur a Forth.Pendant le chargement du fichier,la user_variable BLK est egale a -2. Ex: $" TEST.FTH" $FLOAD && $FOPEN ( adr$ -> _ ) - OUVRE un fichier accessible en lecture/ecriture dans le directory courant si un pathname n'est pas specifie.Le pathname (eventuel) suivi du nom de fichier est place a l'adresse adr$ . Si le fichier n'existe pas ou si il n'y a plus de handle disponible un message d'erreur est emis. Si un fichier etait ouvert avant l'execution de $FOPEN ce fichier est devenu inactif.Le dernier fichier ouvert est toujours actif (sauf utilisation de $FSWAP). Le No d'acces (file handle) est place dans la user_variable FHDLE. Si le type du fichier est "BLK",un buffer est requis pour la gestion des blocs (table de pointeurs).Toute tentative de creation ou d'acces a un bloc se fera par l'intermediaire de ce buffer (pointe par BLKDIRAD) qui contient les 2048 premiers octets du fichier. && $FSWAP ( _ -> _ ) - Le fichier actif devient inactif et reciproquement. Si un seul fichier est ouvert,un message d'erreur est emis et ABORT est execute. Ce mot permet de travailler alternativement sur 2 fichiers avec l'editeur de bloc incorpore. Les blocs en memoire marques mis_a_jour sont d'abord sauvegardes dans le fichier *.BLK ouvert,puis les parametres du fichier inactif sont places dans les user_variables BLKDIRAD,BLKDIRNB,FHDLE pour le rendre actif. && B/BUFF ( _ -> 2048 ) - Empile le nombre d'octets disponibles par buffer ( 2048 decimal soit $800 en hexadecimal ) en simple precision. && BACKUP ( _ -> _ ) - Recopie sur disque tous les blocs mis a jour sans fermer le fichier *.BLK ouvert et en conservant les blocs en memoire. Cette fonction est tres utile pour sauvegarder perodiquement les modifications apportees (evite la perte d'information en cas de coupure secteur ... ). && BCOPY ( n1 n2 -> _ _ ) - Effectue une copie du bloc n1 dans le bloc n2. 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BCOPY appelle BLOCK (voir ce mot) avant d'effectuer la copie. ` Le contenu du bloc n1 est inchange.Le contenu bloc n2 est ecrase et devient identique au contenu du bloc n1 . que le bloc n1. && BCREATE ( n -> _ ) - CREE le bloc n dans le Fichier *.BLK ouvert. 1<=n<=1022 Si le fichier n'est pas ouvert,si le bloc existe deja ou si n est hors limite, un message d'erreur est emis. Si n est valide,2048 octets sont ajoutes a la fin du fichier ouvert pour contenir le bloc n.La table des pointeurs de blocs (pointe par le contenu de BLKDIRAD) est mise a jour. && BEDIT ( n -> _ ) - EDITE a l'ecran le bloc n . 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BEDIT appelle BLOCK (voir ce mot) avant d'editer le bloc n. L'editeur de blocs permet le travail sur le bloc Forth en type pleine page.Il integre les fonctions suivantes: Deplace le curseur d'un caractere vers la droite Deplace le curseur d'un caractere vers la gauche Deplace le curseur d'une ligne vers le haut Deplace le curseur d'une ligne vers le bas Positionne le curseur en debut de ligne suivante Aligne le curseur avec le prochain mot de la ligne superieure Tres utile pour les indentations. Avance le curseur de n caracteres vers la droite n peut etre redefini par n1 TAB ! Deplace la ligne contenant le curseur d'edition d'une ligne vers le haut.Toutes les lignes suivantes sont decalees d'un cran vers le haut.Une ligne contenant des caracteres blancs est placee en derniere ligne.La ligne ecrasee est memorisee dans memo2 acessible par Deplace la ligne contenant le curseur d'edition d'une ligne vers le bas.Toutes les lignes suivantes sont decalees d'un cran vers le bas.Une ligne contenant des caracteres blancs est placee a la place de la ligne d'origine. La ligne perdue (derniere ligne de l'ecran) est memorisee dans memo2 accessible par Permet a tout moment de remettre la ligne courante dans l'etat ou elle etait avant l'entree du curseur dans celle-ci. L'entree dans une nouvelle ligne provoque la memorisation de celle-ci dans le tampon memo1. Echange le contenu de la ligne courante avec le contenu de memo1. Place a la ligne courante du curseur le contenu du tampon memo2.Le contenu precedent de la ligne est perdu. Echange le contenu de la ligne courante avec le contenu de memo2. La sequence permet de memoriser une ligne dans memo2 sans modifier cette ligne. Place a la ligne courante du curseur le contenu du tampon memo3.Le contenu precedent de la ligne est perdu. Echange le contenu de la ligne courante avec le contenu de memo3. La sequence permet de memoriser une ligne dans memo3 sans modifier cette ligne. Sort du mode edition en positionnant le flag de modification du bloc edite a 1.De cette facon,le buffer contenant le bloc en cours d'edition sera recopie sur la memoire de masse si ce buffer est requis ou si la mise a jour et fermeture du fichier .BLK a ete demande (BFLUSH,FLUSH) Reaffiche a l'ecran le buffer edite.Cette fonction permet de controler que le contenu du buffer est bien conforme a ce qui etait affiche.Cette fonction devrait disparaitre dans les prochaines versions de Forth. Active le mode insertion pour le bloc edite. Desactive le mode insertion.Les caracteres frappes ecrasent les caracteres precedents. Note: - BLIST appelle BEDIT si la touche edition est appuyee.Le contenu de memo2 et memo3 est conserve d'un bloc a l'autre au travers des "BLIST multiples" permettant de transferer des lignes d'un bloc a un autre. && BEMPTY ( n -> _ ) - Reinitialise les temoins d'occupation du bloc de numero n dans BUFBLK, BUFFREE,BUFUPDAT Si le bloc n'est pas present en memoire,un message d'erreur est emis et ABORT est execute. Le contenum du buffer contenant le bloc n n'est pas affecte. Meme si le bloc est marque mis_a_jour,il n'est pas recopie sur disque. Ceci est donc un moyen de ne pas modifier l'original sur disque apres une modification erronee du bloc n. Toute demande d'acces a ce bloc provoquera la lecture du bloc sur disque. && BEXPORT ( n1 n2 -> _ _ ) - Exporte le bloc n1 dans le bloc n2 du fichier inactif. Deux fichiers doivent etre ouverts pour cette operation. Le bloc n1 est un bloc accessible par BLOCK (voir ce mot). Le bloc n2 doit exister dans le fichier inactif. Si ces conditions ne sont pas respectees,un message d'erreur est emis et ABORT est execute. Si n1 et n2 sont valides,le contenu du bloc n2 est remplace par une copie du bloc n1. && BIMPORT ( n1 n2 -> _ _ ) - Importe le bloc n1 du fichier inactif dans le bloc n2. Deux fichiers doivent etre ouverts pour cette operation. Le bloc n2 est un bloc accessible par BLOCK (voir ce mot). Le bloc n1 doit exister dans le fichier inactif. Si ces conditions ne sont pas respectees,un message d'erreur est emis et ABORT est execute. Si n1 et n2 sont valides,le contenu du bloc n2 est remplace par une copie du bloc n1. && BFLUSH ( n -> _ ) - Libere le buffer contenant le bloc de numero n. 1<=n<=1022 (Cas 1) ou 1<=n _ ) - LISTE le bloc n du fichier *.BLK ouvert. 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BLIST appelle BLOCK (voir ce mot) avant de lister le bloc n. Le numero du dernier bloc liste est memorise dans la user_variable SCR. L'appui sur les touches de fonctions permettent: Sortie du mode listage Lister le bloc precedent existant (pas forcement n-1) Lister le bloc suivant existant (pas forcement n+1) Editer le bloc courant Charger le bloc courant && BLK ( _ -> adr ) - Empile l'adresse de la uservariable 16bits contenant le numero du dernier bloc charge. Contenu de BLK dans les cas suivants : 0 : Entree au Clavier (ligne de commande) -1 : Lors de l'execution de $LOAD -2 : Lors de l'execution de $FLOAD && BLOAD ( n -> _ ) - Lance l'interpretation du bloc n en le prenant comme input stream (flot d'entree). Preserve d'abord les pointeurs les pointeurs de l'input stream actuel STREAM,OFFS,BLK.Le moniteur Forth interprete alors le bloc n ,puis restaure l'ancienne input stream si aucune erreur n'est rencontree. En cas d'erreur,un message est emis et le controle est redonne au terminal. && BLOCK ( n -> adr ) - Delivre l'adresse du buffer contenant le bloc n. 1<=n<=1022 (Cas 1) 1<=n<=32767 (Cas 2) Le numero du buffer alloue (0 a 15) est memorise dans LASTBUF. Cas 1 : Le bloc n n'est pas present en memoire -Si un fichier *.BLK n'est pas ouvert et actif,ou si n est hors limite, ou si le bloc n'existe pas dans le fichier *.BLK alors un message d'erreur est emis et ABORT est execute. -Si le numero n est valide,le bloc n est transfere depuis la memoire de masse contenant le fichier *.BLK dans le buffer le moins recemment accede. Si le bloc occupant precedemment ce buffer a ete modifie (BUPDATE), il est d'abord recopie sur la memoire de masse. -L'adresse adr du premier octet de ce buffer est empilee. Cas 2 : Le bloc est present en memoire dans un buffer -L'adresse adr du premier octet de ce buffer est empilee. && BNEXT ( n1 -> n2 ) - Delivre le numero du bloc de rang immediatement superieur a n1 pour le fichier .BLK ouvert. L'utilisation de ce mot suppose qu'un fichier .BLK soit ouvert, sinon BNEXT delivrera 0. Si n1=0,n2 est le numero du premier bloc existant. Si n1 est le numero du dernier bloc existant,n2=0. Les numeros de blocs du fichier .BLK ne sont pas forcement consecutifs puisqu'ils sont crees individuellement par l'utilisateur. Inclus dans une structure de commande iterative ou repetitive,BNEXT permet d'obtenir les numeros des b locs existants dans l'ordre croissant. && BPREVIOUS ( n1 -> n2 ) - Delivre le numero du bloc de rang immediatement inferieur a n1 pour le fichier .BLK ouvert. L'utilisation de ce mot suppose qu'un fichier .BLK soit ouvert, sinon BPREVIOUS delivrera 0 sans message d'erreur. Si n1>1023,n2 est mis a zero. Si n1=1023,n2 est le numero du dernier bloc existant. Si n1 est le numero du premier bloc existant,n2=0. Les numeros de blocs du fichier .BLK ne sont pas forcement consecutifs puisqu'ils sont crees individuellement par l'utilisateur. Inclus dans une structure de commande iterative ou repetitive BPREVIOUS permet de connaitre les numeros des blocs existants dans l'ordre decroissant. && BPRINT ( n -> _ ) - Emet vers l'imprimante (sortie parallele) le contenu du bloc n. 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BPRINT appelle BLOCK (voir ce mot) avant d'imprimer le bloc n. && BPRIOR ( _ -> _ ) - Marque le buffer auquel il a ete fait reference en dernier pour le rendre prioritaire.Le Numero interne de ce buffer est contenu dans LASTBUF. Le bloc contenu par ce buffer sera donc conserver en memoire et ne sera pas repris par BLOCK ou BUFFER. Il sera libere par l'un des mots suivants : BEMPTY,EMPTY-BUFFERS,BFLUSH,FLUSH Ce mot permet de requisitionner un buffer pour un usage special (par exemple pour un jeu d'essai) tout en travaillant sur un ou deux fichiers blocs Forth. Ex : 2000 BUFFER \ Requisition d'un buffer dont le numero d'acces BPRIOR \ sera 2000 . 2000 BWIPE \ Formattage de ce bloc 2000 BEDIT .... \ Rentree du programme de test 2000 BLOAD \ et essai. .... FLUSH \ fin de la session de travail && BREAD ( n1 n2 adr -> _ _ _ ) - Lit le bloc n2 (2048 octets) du fichier *.BLK sur disque et le range dans le buffer commencant a l'adresse adr. Si n1<>0,alors le fichier *.BLK est le fichier actif. Si n1=0 ,alors le fichier *.BLK est le fichier inactif. 0<=n2<=1022 Si n2=0,alors adr est factice(remplace par le contenu de BLKDIRAD) Si le fichier *.BLK n'est pas ouvert,si n2 est hors limite,si une erreur de lecture survient alors un message d'erreur est emis et ABORT est execute. && BRENAME ( n1 n2 -> _ _ ) - Le bloc n1 est renomme n2. 1<=n1<=1022 1<=n2<=1022 Le bloc n1 doit exister dans le fichier *.BLK ouvert et actif. Le bloc n2 ne doit pas exister dans le fichier *.BLK ouvert et actif. Apres l'execution de BRENAME,le bloc n1 n'existe plus et le bloc n2 contient ce que contenait bloc n1. Cette fonction n'exige pas de lecture/ecriture sur disque et est donc tres rapide.Elle effectue seulement une manipulation des pointeurs dans le repertoire de blocs qui sera recopie sur disque a la fin de la session de travail. Elle peut etre utilise pour restructurer tout un fichier source Forth lorsque celui-ci devient trop charge et que le besoin de blocs consecutifs se fait sentir. Des mots specialises peuvent etre developpes selon les besoins : Ex : Transfert de n3 blocs Le bloc n1 est renomme n2 Le bloc n1+1 est renomme n2+1 . etc : TRANSFERT ( n1 n2 n3 -> _ _ _ ) 1 ?DO DDUP BRENAME SWAP 1 + SWAP 1 + LOOP DDROP ; && BSWAP ( n1 n2 -> _ _ ) - Echange le contenu du bloc n1 avec le contenu du bloc n2. 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BSWAP appelle BLOCK (voir ce mot) avant d'echanger les blocs. && BUFFER ( n -> adr ) - Reserve un buffer en lui assignant le Numero de bloc n. 1<=n<=32767 Si un buffer a deja ete reserve sous ce numero,un message d'erreur est emis et ABORT est execute. adr est l'adresse du premier octet du buffer alloue.Le contenu du buffer est inchange. Le numero du buffer alloue (0 a 15) est memorise dans LASTBUF. Si aucun buffer n'est libre,le buffer le moins recemment accede et non mis a jour est repris. Si tous les buffers ont ete mis a jour,le buffer le moins recemment accede et non prioritaire est requisitionne. Si ce buffer contient un bloc forth,une tentative de sauvegarde sur disque de ce buffer est effectuee. Si la sauvegarde echoue,un message d'erreur est emis et ABORT est execute. k Les outils d'allocation des buffers sont les suivants: -16 buffers de 2048 octets sont disponibles a l'initialisation. La numerotation interne 0 a 15 de ces buffers est completement transparente pour l'utilisateur.L'argument d'entree a placer sur la pile de donnees pour les mots Forth d'edition est toujours un numero de bloc. -Une table de 16 mots de 16bits BLKTAB contient les numeros de bloc contenu par les buffers. Si un buffer est inutilise,l'emplacement correspondant contient la valeur 0 . Les buffers reserves par le systeme pour la gestion des repertoires de blocs ont pour numeros de bloc 0.Cela permet au systeme de differencier les blocs repertoires non accessibles par l'utilisateur des autres blocs crees par l'utilisateur. -Les buffers systeme sont pointes par BLKDIRAD (variable 64bits pour memoriser 2 adresses) et BLKDIRNB (variable 32bits pour memoriser 2 numeros internes de buffer). -Un mot 16bits BUFFREE permet de coder l'etat libre des buffers. Chaque bit representant l'etat libre (bit=1) ou occupe (bit=0) du buffer correspondant. -Un mot 16bits BUFUPDAT permet de coder l'etat mis_a_jour des buffers. Chaque bit representant l'etat mis_a_jour (bit=1) ou non (bit=0) du buffer correspondant. BUPDATE permet de forcer le bit mis_a_jour du dernier buffer alloue. -Un mot 16bits BUFBLK permet de differencier les buffers contenant un bloc Forth (bit=1) et les buffers demandes directement par un appel a BUFFER (bit=0). Ceci permet a BFLUSH et FLUSH de ne sauvegarder dans le fichier *.BLK que les buffers contenant un bloc Forth lu par BLOCK. -Une table de 16 mots 16bits TICKTAB permet de gerer les priorites entre les buffers.A chaque buffer alloue,un ticket est delivre permettant de dater l'evenement.De plus,chaque acces a ce buffer par BLOCK modifie la valeur de ce ticket. Un ticket nul dans cette table rends le buffer prioritaire. BPRIOR permet de mettre a 0 le ticket du dernier buffer alloue. Ce buffer est alors considere comme protege pour BLOCK et BUFFER. Il redeviendra libre par BFLUSH,FLUSH,BEMPTY,EMPTY-BUFFERS. && BUFFO ( _ -> adr ) - Empile l'adresse de la uservariable pointant le premier octet de la zone memoire utilisee par les buffers. Cette zone est utilise pour la gestion des blocs . Si l'editeur de bloc et la gestion des blocs (BUFFER,BLOCK) n'est pas utilise,cette zone de 32768 octets ( $8000 en hexadecimal) est disponible pour l'utilisateur. && BUPDATE ( _ -> _ ) - Met le bit mis_a_jour du buffer auquel il a ete fait reference en dernier a 1.Le Numero interne de ce buffer est contenu dans LASTBUF. Le bloc contenu par ce buffer sera donc sauvegarder si ce buffer est requis de nouveau. && BWIPE ( n -> _ ) - Efface le contenu du bloc n. 1<=n<=1022 (Cas 1) ou 1<=n<=32767 (Cas 2) BWIPE appelle BLOCK (voir ce mot) avant d'effacer le bloc n. Un bloc Forth initialise par BWIPE (ou BCREATE) contient : -24 lignes de 80 caracteres utiles mis a blancs (code ascii 32) suivi de CR (carriage return code ascii 13) suivi de LF (line feed code ascii 10) -Un code 0 pour marquer la fin du bloc -79 caracteres blancs non utilises (seront utilises dans les versions ulterieures de Forth). Soit 24*(80+2)+1+79=2048 octets && BWRITE ( adr n1 n2 -> _ _ _ ) - Le contenu du buffer (2048 octets) commencant a l'adresse adr est ecrit dans le bloc n2 du fichier *.BLK sur disque . Si n1<>0,alors le fichier *.BLK est le fichier actif. Si n1=0 ,alors le fichier *.BLK est le fichier inactif. 0<=n2<=1022 Si n2=0,alors adr est factice(remplace par le contenu de BLKDIRAD) Si le fichier *.BLK n'est pas ouvert,si n2 est hors limite,si une erreur d'ecriture survient alors un message d'erreur est emis et ABORT est execute. && EMPTY-BUFFERS ( _ -> _ ) - Reinitialise tous les temoins d'occupation des blocs de numero different de 0 (0=bloc systeme). Le contenu des buffers ne sont pas affectes. Les blocs marques mis_a_jour ne sont pas recopies sur disque. Ceci est donc un moyen de ne pas modifier l'original sur disque apres une modification erronee. Toute demande d'acces a un bloc provoquera la lecture du bloc sur disque. && FHDLE ( _ -> adr ) - - Empile l'adresse de la uservariable 32bits contenant le numero d'acces (file_handle) des fichiers crees par $FCREATE ou ouverts par $FOPEN. Toutes les entrees/sorties relatives aux blocs utilisent cette variable. Les 16bits de poids de poids fort contiennent le Numero d'acces du fichier actif. Les 16bits de poids de poids faible contiennent le Numero d'acces du fichier inactif. && FLUSH ( _ -> _ ) - Recopie dans le fichier *.BLK ouvert les blocs Forth qui ont modifies. Si la sauvegarde echoue ( pas de fichier *.BLK ouvert,erreur No bloc, erreur ecriture ),un message d'erreur est emis et ABORT est execute. Les fichiers de numero d'acces contenu dans FHDLE sont fermes. Les indicateurs et pointeurs de buffers sont reinitialises: BUFBLK(0),BUFFREE($FFFF),BUFUPDAT(0),BLKDIRAD(0) Tous les buffers sont liberes. && SCR ( _ -> adr ) - Empile l'adresse de la user_variable 16bits contenant le numero du dernier bloc liste (BLIST) ou edite (BEDIT). && TICKET ( _ -> adr ) - Empile l'adresse de la user_variable 16bits TICKET. Cette variable est utilise dans la gestion des blocs pour dater les acces aux buffers. -5 - FORTH MC68000 SUR ATARI-ST - Par D. LETOURNEL - 18/03/87 - ACCES AUX FONCTIONS DU SYSTEME D'EXPLOITATION -- Quelques mots Forth en permettent le plein acces : && REG0> ( _ -> n ) - Empile le contenu des 16 bits de poids faible du registre d0 du MC68000. Utilise pour connaitre le parametre de retour des fonctions du systeme d'exploitation. && DREG0> ( _ -> d ) - Empile le contenu 32bits du registre d0 du MC68000. Utilise pour connaitre le parametre de retour des fonctions du systeme d'exploitation. && GEM.AES ( adr -> _ ) - Execute une fonction de l'AES (Application Environment Service) adr est l'adresse du bloc de parametres contenant les pointeurs vers les tables de variables GEM . Contenu du bloc de parametres : pointeur vers le tableau CONTROL pointeur vers le tableau GLOBAL pointeur vers le tableau INT_IN pointeur vers le tableau INT_OUT pointeur vers le tableau ADR_IN pointeur vers le tableau ADR_OUT Absolument toutes les fonctions de l'AES sont accessibles en initialisant les tableaux cites ci-dessus suivant la fonction desiree. Il est impossible de lister ici toutes les fonctions disponibles. Se referer aux ouvrages specialises sur GEM (voir bibliographie). Note : L'adresse adr doit etre le resultat de l'evaluation d'une variable ( DVAR,VAR,:VAR ) ou d'un literal sinon une erreur se produira a la compilation. Cette restriction (peu contraignante) permet d'accelerer l'appel de la fonction AES Exemples : : XX DDUP GEM.AES ; va provoquer une erreur a la compilation : XX AESPB GEM.AES ; est correct si AESPB est une variable && GEM.VDI ( adr -> _ ) - Execute une fonction du VDI (Virtual Interface Device) adr est l'adresse du bloc de parametres contenant les pointeurs vers les tables de variables GEM . Contenu du bloc de parametres : pointeur vers le tableau CONTROL pointeur vers le tableau INT_IN pointeur vers le tableau PTS_IN pointeur vers le tableau INT_OUT pointeur vers le tableau PTS_OUT Absolument toutes les fonctions du VDI sont accessibles en initialisant les tableaux cites ci-dessus suivant la fonction desiree. Il est impossible de lister ici toutes les fonctions disponibles. Se referer aux ouvrages specialises sur GEM (voir bibliographie). Note : L'adresse adr doit etre le resultat de l'evaluation d'une variable ( DVAR,VAR,:VAR ) ou d'un literal sinon une erreur se produira a la compilation. Cette restriction (peu contraignante) permet d'accelerer l'appel de la fonction VDI Exemples : : XX DDUP GEM.VDI ; va provoquer une erreur a la compilation : XX VDIPB GEM.VDI ; est correct si VDIPB est une variable && TRAP ( n -> _ ) - Execute le vecteur d'exception n . 0<=n<=15 Le pointeur de pile utilisateur devient le pointeur de pile de donnees Forth. Le processeur passe en mode superviseur et la routine correspondante a l'appel est executee. Cette routine doit se terminer par le code MC68000 rte qui fait repasser le processeur en mode utilisateur. TRAP restaure ensuite les anciens pointeurs de pile Forth. Si des parametres ont ete empiles dans la pile de donnees Forth avant l'appel de TRAP,ces parametres seront toujours presents sur la pile de donnees Forth apres l'execution du mot TRAP. Le numero du vecteur n est cependant ejecte de la pile de donnees Forth. (Voir exemples) 1>Rappel sur le fonctionnement du MC68000 -) Le processeur se trouve toujours dans l'un des 2 modes suivants: -Utilisateur Dans ce mode qui est le mode normal lors de l'execution d'un programme utilisateur (en l'occurence votre programme),le processeur possede un jeu restreint d'instructions et un acces restreint a la memoire. Le pointeur de pile systeme est le registre a7 note usp (user stack pointer). Le passage en mode superviseur est declenche lors du traitement d'une exception : -Interruption externe Processeur clavier,Timer,MMU (gestion memoire),Reset . -Exception interne Rencontre d'une instruction privilegiee Instruction Trap .... -Superviseur Dans ce mode,le processeur a acces total a la memoire et au jeu complet d'instructions. Le pointeur de pile systeme est le registre a7' note ssp (supervisor stack pointer). Le retour au mode utilisateur se fait par des instructions specialisees. L'existence du mode superviseur assure la securite d'un systeme informatique.Les programmes et donnees de l'utilisateur ont leur propre espace memoire et ne peuvent acceder a des informations qui ne doivent pas etre modifiees. 2>Utilisation des vecteurs d'exception Trap -+ Les numeros de vecteurs autorises par le MC68000 sont compris entre 0 et 15 inclus. Les acces aux fonctions du systeme d'exploitation de l'ATARI se font principalement grace aux vecteurs Trap du MC68000. Des parametres doivent etre place sur la pile utilisateur usp avant l'appel de la fonction desire. Quatre de ces vecteurs sont utilises le systeme d'exploitation de l'ATARI : - Trap #1 : BDOS (Basic Disk Operating System) Routines de haut niveau principalement pour la gestion des entrees/sorties sur ecran et disques . - Trap #2 : GEM (Graphics Environment Manager) Routines pour VDI (Virtual Device Interface) et AES (Application Environnement Service) - Trap #13 : BIOS (Basic Input/Output System) Routines de bas niveau de gestion des entres/sorties du systeme (utilise par le BDOS) - Trap #14 : XBIOS (eXtended Basic Input/Output System) Routines de bas niveau complementaires au BIOS Un vecteur est utilise par ce Forth pour deroutement en cas d'erreur - Trap #3 : VERROR Les autres vecteurs Trap sont disponibles pour l'utilisateur et peuvent etre utilises depuis Forth. L'utilisation de ces vecteurs disponibles necessitent une initialisation de la table des Traps.De plus,la routine a executer dit se terminer par le code MC68000 Rte (ReTurn from Exception $4E73) 3>Passages de parametres d'entrees aux Routines depuis Forth -< Ce Forth permet l'acces a toutes les routines du systeme grace au mot Forth TRAP (utilisez GEM.AES et GEM.VDI pour les fonctions AES et VDI) . Il est necessaire de placer les parametres d'entrees necessaires sur la pile de DONNEES Forth , suivi du code de la fonction avant l'appel de la fonction desiree. J'insiste sur le fait qu'il s'agit bien de la pile de donnees Forth et non la pile de retour qui est pourtant bien pointee par le registre a7 (usp) du MC68000. Ces parametres doivent etre places dans l'ordre exact comme dans un appel direct en assembleur c'est a dire avec le code de la fonction en sommet de pile. Reportez-vous a la liste des fonctions disponibles dans les ouvrages qui traitent de l'ATARI (voir Bibliographie). 4>Parametres de retour des routines -# A l'exception de Trap #2,toutes les routines ont leur parametre de retour dans le registre d0 du MC68000. Deux mots Forth permettent d'empiler le contenu de ce registre REG0> (16bits) et DREG0> (32bits) Attention : - Entre les mots Forth TRAP et REG0> ou DREG0> , seuls les mots DROP, DDROP, XDROP sont autorises sous peine de perdre le contenu de d0 En effet,beaucoup de mots Forth utilisent le registre d0 pour leur usage propre . 5>Exemples - 1_Passage en mode superviseur et utilisateur Pour explorer le contenu des variables systemes ATARI,charger des nouveaux vecteurs d'exceptions ...,il est necessaire de passer en mode superviseur. Ne pas oublier de revenir en mode utilisateur avant la sortie de Forth ! Creation des mots necessaires : DVAR SSP \ Variable pour sauvegarde du pointeur de pile superviseur : SUPER ( _ -> _ ) \ Pour passer en mode Superviseur 0. $20 1 TRAP \ Utilisation de la fonction $20 du BDOS 3 XDROP \ Nettoyage de la pile de donnees Forth DREG0> SSP D! \ Sauvegarde du pointeur de pile ssp ; : USER ( _ -> _ ) \ Pour revenir en mode Utilisateur SSP D@ \ Restitution du pointeur de pile ssp $20 1 TRAP \ Appel de la fonction $20 du BDOS 3 XDROP \ Nettoyage de la pile de donnees Forth ; Utilisation de ces mots : SUPER \ Ici , nous en mode superviseur, Prudence! 444. @ . \ Lecture du semaphore de verification d'ecriture \ sur disque inaccessible en mode utilisateur. \ Peut etre mis a 0 pour accelerer les sorties \ A deconseiller ! . \ N'importe quel programme peut etre execute en mode . \ Superviseur. USER \ Ouf ! Retour en mode utilisateur sans problemes. 2_Emission d'un caractere a l'ecran : AFFICHE ( n -> _ ) \ n code ascii du caractere 2 \ Code pour peripherique ecran 3 #13 TRAP \ Appel de la fonction 3 du BIOS 3 XDROP \ Nettoyage de la pile de donnees Forth ; $41 AFFICHE \ Affiche la lettre A a la position courante \ du curseur sur l'ecran 3_Une definition possible du mot KEY resident dans le noyau Forth : KEY ( _ -> n ) _IN @ \ Peripherique d'entree 2 #13 TRAP \ Appel de la fonction 2 du BIOS DDROP \ Nettoyage de la pile de donnees Forth REG0> \ Code ascii de la touche enfoncee ; KEY . \ Attente d'un carctere et affichage du \ code ascii  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 19/03/87 - INTERFACE AVEC LE TOS - && DIRCREATE ( adr$ -> _ ) - Cree un nouveau dossier dont le nom est la chaine de caracteres commencant a l'adresse adr$ dans le directory courant ( * ). Caracteristiques de cette chaine : -Les codes ascii commencent a l'adresse adr$ (avec octet longueur de chaine) -Si la chaine contient des noms de directory avant le nom propre du dossier a creer,ces directory et sous directory remplacent le directory courant ( * ) L'ensemble de ces directory constitue le nom de cheminement (pathname) -Un nom est constitue de 8 caracteres maximum pour le corps,un "point",3 caracteres maximum pour l'extension, suivi d'un caractere NUL (0). Ex: chaine precedee du pathname (nom de cheminement) Ex: C:\DOSS1.X\DOSS2.Y\DOSSIER.TST  Si une erreur se produit,l'execution est interrompue et un message d'erreur est emis. C'est la fonction $39 du gemdos. && DIRDELETE ( adr$ -> _ ) - Supprime le dossier dont le nom est la chaine de caracteres commencant a l'adresse adr$. (voir DIRCREATE pour les caracteristiques de cette chaine) Si une erreur se produit,l'execution est interrompue et un message d'erreur est emis. C'est la fonction $3A du gemdos. && DIRGET ( adr$ u -> _ ) - Delivre dans le tampon d'adresse adr (minimum 64 octets) le directory courant du drive u -1 pour drive actif 0 pour drive A: 1 pour drive B: .... Si une erreur se produit,l'execution est stoppee et un message d'erreur est emis. C'est la fonction $47 du gemdos (ameliore) && DIRSET ( adr$ -> _ ) - Fixe le directory courant dans le drive actif. Le pathname (nom de cheminement) est donne par la chaine a l'adresse adr (avec octet indicateur de longueur,suivi du caractere NUL). Toutes les entrees/sorties sur fichiers se feront dans ce directory sans avoir besoin d'indiquer le pathname. Si une erreur se produit,l'execution est stoppee et un message d'erreur est emis. C'est la fonction $3B du gemdos. && DOSERR ( _ -> d ) - Empile le contenu de la uservariable 32 bits contenant le Numero de la derniere erreur DOS (Disk operating system). DOSERR est mis a 0 si le dernier acces disque s'est effectuee correctement. Code des erreurs: - Pour le bios - 0 : Pas d'erreur -1 : Erreur generale -2 : Drive non pret -3 : Ordre inconnu -4 : Erreur CRC (parite) -5 : Ordre incorrect -6 : Piste non trouvee -7 : Media inconnu -8 : Secteur non trouve -9 : (pas de papier) -10 : Ordre d'ecriture -11 : Ordre de lecture -12 : Erreur courante -13 : Disquette protegee en ecriture -14 : Disquette changee en cours d'operation -15 : Peripherique inconnu -16 : Mauvais secteur detecte pendant verification -17 : Pas de disquette dans le drive - Pour le gemdos - -32 : Numero de fonction non valable -33 : Fichier non trouve -34 : Nom d'acces non trouve -35 : Trop de fichiers ouvert simultanement -36 : Saisie impossible -37 : Numero de reference non valable -39 : Memoire insuffisante -40 : Adresse du bloc memoire non valable -46 : Description de l'unite de disquette incorrecte -49 : Plus d'autre Fichiers (en Cas d'appel a FSNEXT) && DVFREE ( u -> ud ) - Delivre le nombre d'octets libres sur le drive u. -1 pour drive actif 0 pour A: 1 pour B: 2 pour C: . C'est une version simplifiee de la fonction $36 du gemdos. && DVGET ( _ -> u ) - Empile le numero du drive actif (Toutes les entrees/sorties sur disque se font sur ce drive par defaut) 0 pour A: 1 pour B: 2 pour C: . C'est la fonction $19 du gemdos. && DVSET ( u -> _ ) - Determine le drive qui sera actif apres l'execution de DVSET (Toutes les entrees/sorties sur disque se feront sur ce drive par defaut) 0 pour A: 1 pour B: 2 pour C: . C'est la fonction $0E du gemdos. && DVTAGET ( -> adr ) - Empile l'adresse du tampon DTA (drive transfert address) utilise par le gemdos pour stocker les informations relatives a un fichier donne. Utilise par FSFIRST,FSNEXT (voir ces mots) Ce tampon doit avoir une longueur de 44 octets minimum. C'est la fonction $2F du gemdos. && DVTASET ( adr -> _ ) - Fixe l'adresse du tampon DTA (drive transfert address) utilise par le gemdos pour stocker les informations relatives a un fichier donne. Utilise par FSFIRST,FSNEXT (voir ces mots) Ce tampon doit avoir une longueur de 44 octets minimum. C'est la fonction $1A du gemdos. && FATTRIB ( adr$ u1 u2 -> u3 _ _ ) -# Permet de changer le type d'un fichier. Le fichier est defini par la chaine a l'adresse adr$ (voir DIRCREATE pour les caracteristiques de cette chaine). Le type du fichier est defini par u2 (voir FCREATE) Le type est modifie si u1=1 sinon c'est une simple lecture de du type. FATTRIB delivre dans tous les cas la valeur de ce type par u3. Si une erreur se produit,un message d'erreur est emis et ABORT est Dexecute. C'est la fonction $43 du gemdos. && FCLOSE ( u -> _ ) - Ferme le fichier de numero u (file handle) obtenue par FCREATE ou FOPEN (voir ces mots) Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $3E du gemdos. && FCREATE ( adr$ u1 -> u2 _ ) - Cree un fichier dans le directory courant du drive actif sauf indication differente dans la chaine qui contient le nom du fichier a l'adresse adr$. (voir DIRCREATE pour les caracteristiques de cette chaine) Le type du fichier cree est defini par u1 $00 : fichier normal lecture/ecriture $01 : fichier a lecture seule $02 : fichier cache (transparent au repertoire) $04 : fichier systeme,transparent au repertoire $08 : fichier contenant un nom dans les 11 octets $10 : fichier sous directory $20 : fichier decrit et referme correctement FCREATE delivre un numero d'acces au fichier cree u2 (file handle) utilise par FREAD,FWRITE,FCLOSE Apres FCREATE,le fichier est accessible suivant son type. Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $3C du gemdos. && FDELETE ( adr$ -> _ ) - Supprime le fichier dont le nom est la chaine de caracteres commencant a l'adresse adr$. (voir DIRCREATE pour les caracteristiques de cette chaine) Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $41 du gemdos. && FGET.STRING ( u -> adr ) - Isole la chaine de caracteres suivante du fichier de numero d'acces u (file handle) et la recopie en memoire commencant a l'adresse adr. La lecture du fichier commence a la position courante du pointeur de lecture (voir FSEEK) et s'arrete a la rencontre des caracteres de code ascii $0D,suivi de $0A. Si un caractere NULL (code ascii 00) est rencontre ou si la chaine isolee a une longueur superieure a 255,un message d'erreur est emis et ABORT est execute. Si la chaine est correcte,elle rangee a l'adresse adr pointe par la user_variable PSTRING sous la forme (longueur,"code ascii",00). Apres cette operation,le pointeur de lecture est positionne apres le premier code ascii $0A rencontre. Si une erreur se produit,un message d'erreur est emis et ABORT est execute. Note ---- La zone pointee par PSTRING doit avoir une longueur minimum de 260 octets quelque soit la longueur des chaines isolees. && FOPEN ( adr$ u1 -> u2 _ ) - Ouvre le fichier specifie dans la chaine d'adresse adr$. (Voir DIRCREATE,FCREATE pour les caracteristiques de cette chaine) Le mode d'acces est defini par u1 $00 : fichier ouvert en lecture $01 : fichier ouvert en ecriture $02 : fichier ouvert en lecture/ecriture FOPEN delivre un numero d'acces au fichier cree u2 (file handle) utilise par FREAD,FWRITE,FCLOSE Si une erreur se produit,un message d'erreur est emis et ABORT est execute. && FPUT.STRING ( adr$ u -> _ _ ) - Ecrit la chaine de caracteres commencant a l'adresse adr$ dans le fichier de numero d'acces u a la position courante du pointeur d'ecriture (voir FSEEK). La chaine commencant a l'adresse adr$ doit etre de la forme (octet_longueur,code_ascii,00). Elle est recopiee sous la forme (code_ascii,$0D,$0A) a la position courante du pointeur d'ecriture dans le fichier u. Apres cette operation,le pointeur d'ecriture pointe l'octet suivant le code ascii $0A ecrit. Cette fonction est en fait la fonction inverse de la fonction FGET.STRING. Si une erreur se produit,un message d'erreur est emis et ABORT est execute. note ---- Cette fonction utilise la zone memoire pointee par la user_variable PSTRING qui doit etre au minimun de 260 octets pour un stockage intermediaire. && FREAD ( u ud adr -> _ ) - Lit ud octets dans le fichier de file handle u et les place a l'adresse adr (voir FCREATE,FOPEN pour le file handle). Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $3F du gemdos. && FRENAME ( adr$1 adr$2 -> _ _ ) -! Renomme le fichier dont le nom est defini par la chaine d'adresse adr$1 par le nom defini par la chaine d'adresse adr$2. ( voir DIRCREATE pour les caracteristiques de cette chaine) Si une erreur se produit,u%n message d'erreur est emis et ABORT est execute. C'est la fonction $56 du gemdos. && FSEEK ( d u1 u2 -> _ ) - Positionne le pointeur de lecture/ecriture d'un fichier donne. Le deplacement du pointeur est de d1 (positif ou negatif) octets Le numero de fichier concerne est u1 (file handle). Le type de deplacement du pointeur est defini par u2 : 0 : par rapport au debut du fichier 1 : par rapport a la position courante du pointeur 2 : par rapport a la fin du fichier Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $42 du gemdos. && FSFIRST ( adr$ u -> w _ ) - Recherche le fichier dont le nom est defini par la chaine a l'adresse adr$ (voir DIRCREATE pour les caracterisques de cette chaine) et de type defini par u ( Voir FCREATE). Il est en plus possible d'inserer des caracteres *,? pour des recherches triees. Si le fichier est trouve,w est mis a$FFFF .Dans ce cas le tampon DTA (voir DVTAGET,DVTASET) contient : octets 00-20 Reserves gemdos octets 21 Type du fichier octets 22-23 Heure de la derniere modification de ce fichier octets 24-25 Date de la derniere modification de ce fichier octets 26-29 Taille de ce fichier en octets octets 30-43 Nom et extension de ce fichier Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $4E du gemdos. && FSNEXT ( _ -> w ) - Poursuit la recherche de fichier dont la definition a ete effectue par FSFIRST (voir ce mot). De la meme maniere,si un fichier correspondant a la chaine est trouve, w est positionne a $FFFF et le tampon DTA contient les informations sur ce fichier.Sinon w=0 Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $4F du gemdos. && FWRITE ( u ud adr -> _ ) - Ecrit ud octets en commencant a l'adresse adr dans le fichier de file handle u (voir FCREATE,FOPEN pour le file handle). Si une erreur se produit,un message d'erreur est emis et ABORT est execute. C'est la fonction $40 du gemdos. -L  - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 01/04/87 - La version de FORTH68K en votre possession est dans le domaine public c'est dire qu'aucun droit de diffusion autre que les remboursements de frais d'envoi ne peut etre percu . La seule contribution demande est de diffuser le plus largement possible ce logiciel afin de faire connaitre ce langage aux possibits illimites . Le but est de constituer un club d'utilisateurs pour nourrir un flot d'changes et d'ides. La meilleure rcompense mes efforts est de recevoir un programme dvelopp dans ce langage. Malgr tout le soin apport la ralisation de ce produit , des bugs peuvent subsister . Dans ce cas , envoyez-moi une disquette contenant le programme sur lequel vous avez des ennuis . Documentez votre programme et et indiquez-moi le point ou vous avez rencontre le bug . Je vous renverrais par retour du courrier votre disquette avec la derni- re version de mon Forth et si possible l'explication et la correction des bugs. Pour les envois en France,joignez une enveloppe de bonne qualit , suffi- samment affranchie , libelle a votre adresse .Pour les envois l'tran- ger ,joignez au minimum 20 Francs Franais ou quivalent payable par tout moyen votre convenance ( Ne pas joindre timbres ou pieces de monnaie non Franais). Quelque soit J l'utilisation faite de ce Forth,je serais heureux d'avoir de vos nouvelles. > MES COORDONNEES < Mr LETOURNEL Daniel 3 Allee GOYA 44300 NANTES !FRANCE Tel:40.50.45.52 > < A \ 15/02/87 CLS CRLF CRLF .( FORTH MC68000) CRLF .( Par D. Letournel ) CRLF CRLF .( Chargement Extension MUTIL.BLK .... ) CRLF CRLF $" MUTIL.BLK" $FOPEN 1 BLOAD FLUSH CRLF .( Chargement dmo ? ) CRLF .( Appuyez sur une touche pour l'viter) 4 WAIT KSTAT NOT [IFT $" DEMO.FTH" $FLOAD [ENDIF \ INSTALL.FORTH permet d'installer Forth avec les dimensions de piles \ souhaitees ( Pile_Data Pile_Return -> _ _ ) \ Apres INSTALL.FORTH,Seuls 3 lignes ecran seront prises en compte \ dans ce fichier.Si un texte plus long est desire,charger un autre \ fichier. $10000. $10000. INSTALL.FORTH CRLF CRLF CRLF .( Le Fichier COMMAND.FTH a t automatiquement charg) CRLF CRLF .( INSTALL.FORTH a rserv 64Koctets pour la pile de donnes) CRLF .( et 64Koctets pour la pile de retour.) CRLF CRLF $" MUTIL.BLK" $FOPEN \ 15/02/87 \ Fichier source demonstration de FORTH68K \ Cree pour essayer les fichiers textes impbriquees \ Par D. Letournel BUILDS DEBUT.DEMO \ Repere pour FORGET : LF $A EMIT ; : PAUSE $20000. 0. DDO DLOOP ; \ = Ecran No 1 = CLS CRLF CRLF .( Voil Le meilleur Forth que vous n'ayez jamais eu) CRLF .( Il est trop puissant pour tre Honnte) CRLF .( Il possde surement encore quelques BUGS) CRLF .( Mais il s'amliore au fil du temps !) CRLF CRLF .( -) CRLF PAUSE PAUSE PAUSE \ = Ecran No 2 = CLS CRLF .( * Fonctionne sur tous les Systmes gamme ST :) CRLF .( ATARI-260ST) CRLF PAUSE .( ATARI-520ST) CRLF PAUSE .( ATARI-520ST+) CRLF PAUSE .( ATARI-1040ST) CRLF PAUSE CRLF .( * Utilise toutes sortes de Pripheriques :) CRLF .( Drive Simple Face) CRLF PAUSE .( Drive Double Face) CRLF PAUSE .( Disque Dur) CRLF PAUSE .( Imprimante) CRLF PAUSE .( Ecran monochrone) CRLF PAUSE .( Ecran Couleur) CRLF PAUSE CRLF .( * Interface Complet avec le Systme d'Exploitation :) CRLF .( BDOS) PAUSE LF .( BIOS) PAUSE LF .( XBIOS) PAUSE LF .( VDI) PAUSE LF .( AES) PAUSE LF .( Ligne_A Graphique) PAUSE CRLF CRLF CRLF PAUSE PAUSE \ = Ecran No 3 =! CLS CRLF .( * Intgre un Moniteur de Commande) CRLF .( En voici un exemple : DIR) DISK DIR *.* FORTH PAUSE PAUSE PAUSE PAUSE \ = Ecran No 4 =! CLS CRLF .( *!) CRLF .( * *) CRLF .( * FORTH MC68000 Sur ATARI-ST *) CRLF .( * *) CRLF .( *!) CRLF CRLF .( Le plus puissant !) 40 CURTAB .( Le plus Rapide !) CRLF .( Le plus Productif !) 40 CURTAB .( Le plus Ouvert !) CRLF .( Le plus Plaisant !) CRLF FORGET DEBUT.DEMO  u\ 26/11/86 ( -H Essai des fichiers *.FTH Ce fichier a ete cree avec l'editeur de MODULA-2 Pour le charger depuis Forth,Il est necessaire de charger l'extension Forth MUTIL.BLK. Faire ensuite : " ESSAI.FTH" $FLOAD -H ) \ > PRESENTATION < VDU CLS CRLF .( Chargement du programme Factoriel utilisant la recursivite de Forth) CRLF CRLF .( La compilation est extremement rapide si FORTH68K) CRLF .( est place dans un ramdisk) CRLF CRLF CRLF .( Debut de la compilation) \ > DEFINITIONS < : FACT ( u1 -> u2 ) SMUDGE \ Inverse le bit de validite de FACT ?DUP IFT DUP 1 - FACT \ Remplit la pile de nombres decroissants !\ jusqu'a l'obtention de 1 par appel !\ Recursif a FACT U* \ U* est le de retour lorsque la pile data !\ est remplie ELSE 1 \ Correction de la pile car U* est !\ effectuee une fois de trop. ENDIF SMUDGE \ Retablit le bit de validite pour ; ; : ESSAI ( _ -> _ ) CRLF CRLF ." Entrez un nombre non valide pour sortir du calcul de factorielle" CRLF ." Aucun controle de debordement n'est effectu" CRLF CRLF BEGIN ." Entrez votre nombre : " PAD 1 EXPECT PAD NUMBER WHILET DUP FACT 30 CURTAB SWAP U. ." ! = " U. CRLF REPEAT DDROP ; \ > EXECUTION <" CRLF CRLF .( Fin de la compilation) DECIMAL ESSAI CRLF CRLF .( Au Revoir et a Bientot j'espre !) CRLF CRLF .( Pour recommencer Frappez ESSAI ) CRLF CRLF  - FORTH MC68000 SUR ATARI-ST - PAR D. Letournel - 04/04/87 - LISTE DES USER_VARIABLES - Toutes les User_Variable de Forth ne sont pas definies en tant que mot du noyau. La variable la plus importante est USERTAB qui permet de calculer l'adresse de toutes les autres en utilisant le table ci-dessus. Il suffit de calculer son adresse effective par rapport au debut la table. Exemple : HEXA \ L'execution de RPO deposera l'adresse effective en memoire de la \ Uservariable RPO (Return Pointer Origin) : RPO USERTAB 6. UD+ ; \ L'execution de SPO deposera l'adresse effective en memoire de la \ Uservariable SPO (Stack Pointer Origin) : SPO USERTAB A. UD+ ; \ .... etc . Offset des uservariables de Forth par rapport a USERTAB -7 0 USERTAB 06 RPO 0A SPO 0E STRPO 012 DP 016 DPSAVE 01A FTHEND 01E CASEPTR 022 COMPTRAC 026 INLNSAVE 028 TIB 012B ENDTIB 012C PAD 022F ENDPAD 0230  INSTBUFF 0330 BLKTAB 0350 TICKTAB 0370 ALLOCTAB 03B0 VECTTAB 03D4 WHERETAB 03F4 EXCEPTAB 0404 INVARTAB 0404 ON.ERROR 0408 VOC_LINK 040C LATEST 0410 BUFFO 0414 BLKTICK 0416 BLK 0418 CONTEXT 0418 USVARTAB 041C CURRENT 0420 FENCE 0424 STREAM 0428 OFFS 042C DOSERR 0430 PSTRING 0434 HLD 0438 BLKDIRAD 0440 BLKDIRNB 0444 STATE 0446 BASE 0448 _IN 044A _OUT 044C DPL 044E CPL 0450 WIDTH 0452 CSP 0454 FHDLE 0458 TICKET 045A BUFUPDAT 045C BUFFREE 045E BUFBLK 0460 SCR 0462 LASTBUF 0464 TAB 0466 XCUR 0468 YCUR 046A OVFLOWS 0496 INSTINIT 04AA USERINIT 0528 HELPCH 0547 FORTHCH `j<N Xj0j0( ,/ PP&+$" MUTIL.BLK" $FOPEN 1 BLOAD EfqwY >>>> BONJOUR <<<< Vous entrez dans un Autre Univers de la Programmation <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> MONITEUR FORTH MC68000 v1.9 04/04/87 Par Letournel Daniel Tous Droits D'Utilisation Rservs Pour Infos & Problmes Tl:40.50.45.52 <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> Langage de Quatrime Gnration Puissant,Rapide,Interactif  De Charles H. MOORE <><><><><><><><><><><><><><><><><><> Appuyez sur puis pour Charger l'Extension de Forth?< NA\N Hy ?<`HHy ?<`            Installation FORTH MC68000 Ajourne Disponibilit Mmoire Insuffisante ...  message.fthcommand.fth"y\p"ar ^"f*/a y"_B@R@QB #NuHy`,Hy`$-<a(a&Hy0`Hy` Hy`Nq?< NA\`6/?< NA\Nu FORTHNj0ABORTa ,y `Jyg&A00D $ (  NuD?ABORT"-<\`J^g$&_BCSCkHy?< NA\HS?< NA\`B&_VDNLQUIT.yByDBy#)$B(?<NATAHy?< NA\JyDgHy?< NA\/90?9h?9f3h3f#0B-<(=<LN%P3f3h#0A(CB@gRQBa`BԆCONVERT49FBgBB ^02xRk> .g20k2  k_  k$o ҃HAAe HA kSW`BD"H`<=-6=JDg3LNuSH3LNuNUMBER VR49FCArWJAk(R Ao CI1CErWJAkRBCgn .fv`A0SAB-?a2J^fLX0$JyLl"J@f< Ag AgJBl`*DBn&<NAX#,k@A8BHS- a-NHJfNu( y$C(p)gf#(NuHy `0\ y$C(p gfR#(NuS#(Nu4;SXNu [ByDNu ]3DNuFORGET yfJ=< atJ^kaTJ^g V o2g ``B0 # "y"U#NuHy-`,HyS`"v VOCABULARYaR y P y"yX0N  00 9# #Nu#Nu\ DEFINITIONS#NuSMUDGE y PNu IMMEDIATE y PNuNFA'=< a`J^ka@J^gNu"NFA> VB(X@іNuCFA'aaNu  Invalide> Interdit en Mode Excution> Interdit en Mode Compilation> Redfini>    Y8 lqv>           n'existe pas>%@#$++-- ?< NA\N C/#4Bt JlDt-aNuXERRORHy*R?< NA\aHy*m`$ERROR0D@NCNuD@=C2#A"2BB 9g/@Ns/|NsB?ERROR0gD@NCNuKSTAT?9H?<NMX=NuKEY?9H?<NMX=NuCURLEFTG*yv`.CURRIGHTG*vv`CURUPG*pv`CURDOWNG*sv`CURHOMEG*v`CURTAB6K(<C?< `HD??9J?<NM\QNu2CRLFG)v`CLSG*|v`pCURSETG*v.H.X@ 7@`D*EMIT??9J?<NM\Nu COUNT VB@,=NuTYPE6SC&^B@g??9J?<NM\QNu*<#C/#4BNu#A,"y4mB/n:09FB2<2 94,/D=NuU.Bf` UD.C/#4Ba|,Bf` .0H-a,Bf`D.a,Bf`.R?0H-` D.R?an </B2 Ab,@kg SAp Q,Bf`XHj,Bf`FHy* `TU.R?C/#4BBfa`UD.R?C/#4Ba`x TRAVERSE Vf B0 ,Nu,Nu"C,0 y#Nu, y0#NuD, y #NuALLOT0gS@ yBQ#Nu"CREATE-<$0N= w   ABCDEHYYfjYke   ?< NA\N )>RESOLVE 9 ^ n0NuHy1`*UNTILT           Hy=?< NA\N VfH yC0)g4 @b.r `rNu Vf$ yC )g br `rNuBANuBXNu Vf yCNuBXNu Vf, yJ`gU0 ^T #NuU0J^ #NuBNu Vf& yJgU0 X #NuU0J NuBNu22Nv#Nu0Nv#Nud<NvE2""#NuE #Nu2T"2Nv#Nu2T"E""#Nu 00 #Nu Vf, yC0)kg@k @br `rNuBANuBXNu Vf yC0)oP@kJU@22NuBNu0DUP=Nu DDUP-Nu ?DUPJVg=Nu?DDUPJg-NuDROPTNu DDROPXNu XDROPB0Nua,JAg@P2#Nu2M2Nu0SWAP H@,NuDSWAP ",-NuOVER=.NuDOVER-.Nu PICKB0g=6Nu2<=.` DPICKB0g-6Nu2<-.` RPICKB0g=7Nu2<=/` DRPICKB0g-7Nu2<-/` ROT 2-=Nu DROT "$,--NuROLLB0 @c2UACA43 QR?Nu R>=Nu D>R/Nu DR>-Nu +0VNvNuaJAg@PV`2V`$ U+0Vd<NvNuaJAg@PV`2V`,-0VNvNuaJAg@QV`2V`$ U-0Vd<NvNuaJAg@QV`v2V`,D+ іNvNuaJAg@P`,2`2& UD+ іd<NvNua\JAg@P` 2`*,D- NvNua4JAg@Q`2`& UD- d<NvNuaJAg@Q`2`,*02=9NuD@ V,Nua&2-9Nu! ^0Nua23NuD! ^ Nua2#Nu+! ^0PNvNua ng 2 |E`AazJAg@Py`x2yT`pD-! ^0PNvNua ng 2 |E`pAa4JAg@Qy`22yT`*DD+! ^ ѐNvNuaP ng 2 |E`*AaJAg@P`2X`DD-! ^ NvNua ng 2 |E`AaJAg@Q`2X`DU+! ^0Pd<NvNua ng 2 |E`Aa\JAg@Py`l2yT`dJU-! ^0Pd<NvNuar ng 2 |E`HAaJAg@Qy` 2yT`JUD+! ^ ѐd<NvNua$ ng 2 |E`AaJAg@P`2X`LUD-! ^ d<NvNua ng 2 |E`AaJAg@Q`2X`|L=NWWNu :`<>NVVNu :`N^^Nu :`L>=N\\Nu :`4D=WWNu :`RD<>VVNu :`:D<]]Nu :`"D<=__Nu :` D>^^Nu :`D>=\\Nu :`U<=NSSNu :`U>NRRNu :`tUD<=SSNu :`UD>RRNu :`x =CSWAPNuC@ ^B&NuC! ^RNuNOTFVNu DNOTFNu ABSJVlDVNuDABSJlDNuAND0VNu DAND NuOR0VNu DOR Nu XOR0VNu DXOR NuC->S0HD0H-NuROT.R02yNAXJgNCNuFREAD//??<?NA JlNCNu"FWRITE//??<@NA JlNCNu$FDELETE/R?<ANA\JgNCNuFSEEK??/?<BNA JlNCNu"FATTRIB??/R?<CNA JlNC=Nu(FSFIRST?/R?<NNAPJg gNCBfNu=Hy[`6Hy[`.Hy\A`&Hy\Y`Hy\s`Hy\`Hy\`Hy\?< NA\N ^Bfg4 .fC,Eg `c `BCZp VJ@kNuNAX#,NuAp09Zr4<6C8E@8Jg Jg8 CfCp8 g fBn42QJAk=Nu 98g&@0g @bHGNu0gxktAPr`WJAl @bZNuaAPr49^J`ggaVQNuB0"A04fy@fVBP69\3\69Zg.3Z69^g,3^v y-Bf=aBNu69^3^NuB0@2@@@@^-ӖNu0@^@ 3^@Hy^>?< NA\Nua ^pOC,QBNu?9F?9J3J3 FN"3J3FNuA, < rt QBXQNuH$FCREATERBg/?<NNAPJgaBg/?<f =-ab` ?f.]?< NA\``ȆBEDITa.aHy]?< NA\Nu=a3`Hy]?< NA\/?< NA\ByfByhP^FHy]?< NA\/3^Da-Hy^;?< NA\=9f=9haDHy^5?< NA\?<NAT&Hy^8?< NA\ bg~  mv??<NAX=9f=9ha&^J9^Fg8xNyfl`=??<NAXQ8I#QRyf`^ yOfgPRyf`FHC?NAX#,kPBTB8B<3\By^ByZ 9g/?<INA\B#,fNua`a` EMPTY-BUFFERSAPrJ`gaQNuBLKBLK P             Y8 eqEfqw Y8 fp | Bloc # Y8kY8 p | Edition Bloc # Y8k efqYB "@" c2. NuHyc`"G2!gCB02Abg. 2NuXNu G0 gpAC02gR@bANuHyd`T$G0"gFEA0"g4ECNuHydN?< NA\Ra6Hyd_`Hyd!`Hyd`Hyc`Hyd?< NA\N /?< NA\NuZr$VARJVg4 Vb.N y0BBQ# y PNuHydm`H$""y0p"N ^"fDNu$GET ^"GTpWF@ G0` $@ ^R"GBB@QB`v$! ^B@"G2!gC2@b. RQBNu.$$!"^ ^RB@bH2QNu$$TYPE VRB@,=N!t$>RNu ""GBp"N ^"fhX`]"-<`NX W"GB@2Qa _BVN6"NULL"GBYBY`"TYPE G0 g8H.-T=N!t""DROP G0 gHހUNu"DUP G"G0 gA02H2Q`0&"SWAPaE&G06HR@6Q S@4QNu."PICK2g$SA G"G0 gAQ02H2Q`Nu2"CATa&0g24Ai2CQ. `.UNuHyd`J:"SIZE U-Nu"DE G0 gxHJf.R-NuHye1`d          > Vf" yC ) br `rNuBANuBXNucXP@- Nu XP!*^Nu XP+NuaJAgAP2Nu2NuXP-NuaJAgAQ2Nu2NuC>(X)RNu>(X):Nu D>(X)*Nu C(X)>B&Nu(X)>=Nu D(X)>-Nu C>(X+)RNu>(X+):Nu D>(X+)*NuC(-X)>%B&Nu(-X)>=%Nu D(-X)>-%NuC>(-X)RNu>(-X);Nu D>(-X)+NuC(X+)>B&Nu(X+)>=Nu D(X+)>-NuX<->Y͍Nu X<->V ^  Nu Vf yC2 |E 0#NuBNu?< NA\N gDIM4gBC0g y0200RAe6HBU@e.2000RAd JBfH4BC`HCCe8 b0HCQ0H@0"҈eeb-SBXUd#NuHyh<`^Hyhd`TARRAY ^024Bb*U@e46Cb68HDD8HD҄Q-NuHyh`   ?< NA\N gTRAP y"f,B" y0 @bU0N@N@00N#NuHyi`FGEM.VDI y"f y1yiL iR#NuHyi`n"<psNBDGEM.AES y"f"y3zAi"2#NuHyj`&0<NBBREG0>=Nu DREG0>-Nu   iNOPNqNu   "        *  ." 2>      ,   4 *h  BV,H(b$  4    $ >B $,          B  "    *,,> **  `0>     & 2 ,, V,    *6  >         " .     j.  <   < L 6D&""  * , 2 0  $  ,T2*  0*L" \T~&l J" " \ - \ FORTH MC68000 SUR ATARI-ST \ - \ Par D. Letournel \ - \ 01/03/87 \ - \ Creation et chargement de la table des messages d'erreur \ -8 \ Chaque message doit etre precede de son numero qui sert a charger \ le tableau MESSAGE. \ Le dernier message dans ce fichier est charge le premier. \ Le chargement s'arrete a la rencontre d'un numero negatif. -1 \ Indicateur de fin pour MSGLOAD \ Messages d'erreur BIOS 0 a 17 0 " Ok" 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " 10 " " 11 " " 12 " " 13 " " 14 " " 15 " " 16 " " 17 " " \ Message d'erreur Forth 20 a 30 20 " " \ Messages d'erreur BDOS 32 a 67 32 " " 33 " " 34 " " 35 " " 36 " " 37 " " 39 " " 40 " " 46 " " 49 " " 64 " " 65 " " 66 " " 67 " " \ Messages d'erreur Forth superieure a 70 \ Outil de definition d'une table de chaines de 80 caracteres : :MSG CREATE 1 83 DIM \ 1 dimensions,chaque cellule ayant 83 octets HERE 1. D- DSWAP DDO 80 DI C! \ Initialisation a 80 du 1er octet de chaque cellule 83. D+LOOP DOES ARRAY ; \ Creation d'une table de 80 Messages de 80 octets 80 :MSG MESSAGE \ Chargement des messages dans la table : MSGLOAD ( _ -> _ ) BEGIN MESSAGE $! DUP UNTILM DROP ; MSGLOAD \ Mise en place du vecteur d'erreur de messages : .ERROR ( n -> _ ) \ n Numro du message CRLF MESSAGE $TYPE 7 EMIT ABORT ; CFA' .ERROR ON.ERROR D! \ Tous les messages d'erreur seront inclus dans ce Fichier dans les \ versions ulterieures de Forth,ce qui laissera a l'utilisateur la \ possibilite d'afficher des messages en clair ou d'afficher seulement \ le numero de l'erreur.Le noyau Forth sera encore plus concis. )BLK ! "# % U$%&'(*-,./0)+B\ Directory Principal de Chargement Extension. 15/11/86 P \ CHARGE AUTOMATIQUEMENT PAR APPUI SUR AU LANCEMENT  \ PEUT ETRE MODIFIE POUR DIMINUER OU ETENDRE LE NOYAU FORTH  \ Voir Bloc 2 pour Acces aux mots crees par Utilisation des Vocabulaires  P DECIMAL I 10 BLOAD \ DIRECTORY UTILITAIRES DIVERS $ 20 BLOAD \ DIRECTORY UTILITAIRES DISQUES # P 50 BLOAD \ DIRECTORY UTILITAIRES EDITEUR DE BLOCS  100 BLOAD \ DIRECTORY EMULATEUR VT52 ( P P P FORTH DEFINITIONS ? P P P P P P P P O\ Notions sur les Vocabulaires 2 ;S N P Pour ne pas surcharger le Vocabulaire Principal FORTH,les extensions ont ete crees sous differents vocabulaires selon leurs Fonctions.  Pour utiliser un mot qui est defini dans un autre vocabulaire que le vocabulaire de contexte,Il faut preceder ce mot du nom du vocabulaire choisi.  P Ex1 : DISK F Le vocabulaire DISK est valide:Faire WORDS pour le faire apparaitre  a L'ecran .... < Tous les mots definis sous DISK sont accessibles.  DIR A: $FLOAD .... 8 P Pour rajouter des definitions faire DISK DEFINITIONS  . B Pour revenir au Noyau FORTH faire FORTH DEFINITIONS  P Ex2 : EDITOR D Les memes remarques que ci-dessus s'appliquent pour ce vocabulaire  P P P P Om\ Test PILE C P DVAR PILE_ORG C 1000 ALLOT F HERE PILE_ORG D! @ HERE XP! H 10 ALLOT H P : C>PILE C>(-X) ; > : CPILE> C(X+)> ; > P : >PILE >(-X) ; > : PILE> (X+)> ; > P : D>PILE D>(-X) ; > : DPILE> D(X+)> ; > P : NETTOIE_PILE PILE_ORG D@ XP! ; 0 : PROFONDEUR_PILE PILE_ORG D@ XP@ UD- ; ) P P P P P O\ Test DIM,ARRAY > P HEXA L P DVAR PT1 H DVAR PT2 H P P : VAR_3D_8BITS ( u1 u2 u3 u4 -> _ _ ) + CREATE 3 1 DIM PT1 D! DOES ARRAY ; + P 1 5 1000 VAR_3D_8BITS Y 8 P HERE PT2 D! E P : V CRLF 1 0 DO 5 0 DO 7 0 DO K J I Y 8 UD.R LOOP CRLF LOOP LOOP ;  P P P P P P P P O\ Test [IFT [ENDIF < P CRLF L .( Entrez-votre choix 1..4 ? ) 2 KEY $30 - G P DUP 1 = [IFT .( Touche 1) [ENDIF 0 DUP 2 = [IFT .( Touche 2) [ENDIF 0 DUP 3 = [IFT .( Touche 3) [ENDIF 0 DUP 4 = [IFT .( Touche 4) [ENDIF 0 DROP L P P P P P P P P P P P P P O\ Test GEM F P $1B EMIT $66 EMIT ? VAR AP_ID VAR VDI.HDLE : APPL_INIT AP_ID ! ? GRAF_HANDLE VDI.HDLE ! : VDI.HDLE @ V_OPNVWK = VDI.HDLE @ V_CLRWK > P VDI.HDLE @ 0 V_SHOW_C ; P P P P P P P P P P P P P P O\ MUTIL |RANDOM| 15/02/87 P \ Fournit un nombre aleatoire sur 32 24bits % : RANDOM ( _ -> d ) = $11 #14 TRAP DROP DREG0> 5 ; O P P P P P P ( ( P P P P P P P P P P P O\ DISK |.DATE|.TIME| *30/12/86 P \ Affichage de la date a la position courante du curseur  : .DATE ( u -> _ ) \ u : date sous forme compactee  JJ/MM/AA F ASCII / G XX.YY.ZZ TYPE A ; O P \ Affichage de l'heure a la position courante du curseur  : .TIME ( u -> _ ) \ u : heure sous forme compactee  HH:MM:SS F ASCII : G XX.YY.ZZ TYPE A ; O P P P P P P P P P O\ DISK |DIR_SUB| 23/11/86 P \ Routine d'affichage des fichiers de type u $0 $1 $2 $4 $4 $8 $10 $20 \ Correspondant au nom fourni a l'adresse adr . Ex *.*  P : DIR_SUB ( adr u -> _ _ ) 3 FSFIRST $\ Cherche Premier Fichier  WHILET E CRLF DVTAGET \ Empile adresse de Transfert DDUP 30. UD+ $GET \ Range le nom fichier dans la "FORM_FICHIER "TYPE \ Pile de chaine  DDUP 26. UD+ D@ \ Empile le nombre d'octets  9 UD.R ." Octets " \ et l'affiche  DDUP 24. UD+ @ .DATE \ Affiche la date  3 SPACES 22. UD+ @ .TIME \ Affiche l'heure  FSNEXT #\ Cherche Fichier suivant  ENDWHILE C ; O <[  P P P P P O\ Directory EDITOR 523/11/86 P FORTH DEFINITIONS VOCABULARY EDITOR EDITOR DEFINITIONS  P 51 BLOAD H 52 BLOAD H 53 BLOAD H 55 BLOAD H 56 BLOAD H P P P P P P P P P P P P P P P O\ EDITOR |BCOPY| +07/12/86 P ;S N P : BCOPY ( u1 u2 -> _ _ ) \ Copie du block Numero u1 dans u2  CRLF DDUP = @ ?ABORT" "  DDUP SWAP ." Copie du Bloc " U. ." dans le Bloc " U. ." :O/N? " KEY DUP ASCII OUI = >R ASCII oui = R> OR $ IFT I ." En Cours ...." 6 BLOCK D>R BUPDATE BLOCK DR> / B/BUFF CMOVE > ELSE F DDROP ." Ajournee" 5 ENDIF G ; O P P P P P P P O,\ Directory MUTIL 623/11/86 P P P 11 BLOAD H 12 BLOAD H 13 BLOAD H 14 BLOAD H 16 BLOAD H 17 BLOAD H 18 BLOAD H P P P P P P P P P P P P P O\ MUTIL |WAIT|BEEP|SPACES|.CHARS| 26/11/86 P P : WAIT 1 DO 4 0 DO 32000 0 DO LOOP LOOP LOOP ; " : BEEP 7 EMIT ; A : SPACES 1 DO BL EMIT LOOP ; 4 P : .CHARS ( adr u -> _ _ ) \ affiche u code ascii a partir de l'adresse adr  1 - 0 DO D DDUP I 0 D+ C@ < DUP BL < B IFT G DROP 46 A ELSE D DUP 127 > ? IFT E DROP 46 ? ENDIF C ENDIF E EMIT F LOOP H DDROP I ; O P O\ MUTIL |DUMP| 26/11/86 P \ AFFICHE A L'ECRAN LE CODE EN HEXA OCTET/OCTET A PARTIR DE L'ADRESSE INDIQUEE \ LA PARTIE DROITE DE L'AFFICHAGE EST LE CODE ASCII SI VALIDE  \ EX: NFA' DUMP 100 DUMP AFFICHERA SUR LE PERIPH. _OUT LE CODE DE DUMP  VAR TAB_16BYTES 14 ALLOT \ TABLE 16 OCTETS  : DUMP ( adresse nom#bre_d'octets -> _ _ ) ' BASE @ >R HEXA CRLF 0 ." @>" 3 DPICK 6 UD.R # BEGIN I SWAP DUP D WHILET F 1 - SWAP DSWAP DDUP C@ 4 DUP 5 PICK 0 TAB_16BYTES D+ C! , S->D <# # # BL HOLD #> TYPE / 1. D+ DSWAP ? 1 + DUP 16 MOD < IFF G ." | " TAB_16BYTES 16 .CHARS ." |" # DROP 0 B CRLF ." @>" 3 DPICK 6 UD.R . ENDIF E REPEAT H DDROP DDROP R> BASE ! 9 ; O O\ MUTIL |ASCII| %21/11/86 P P P \ Compile le premier code ascii du mot suivant de l'input stream  \ comme un literal qui sera retourne lors de l'execution du mot contenant ASCII \ Mot reserve a la compilation 2 P : ASCII ( _ -> _ ) = BL WORD E 0 < ?ABORT" "  DDUP C@ 0 = ?ABORT" "  1. D+ C@ [COMPILE] LITERAL 2 ; O P IMMEDIATE G P P P P P P P P O\ Directory DISK 623/11/86 \ Les mots sont definis dans le Vocabulaire DISK et n'apparaissent pas \ sous FORTH . Pour les utiliser executer d'abord DISK  P FORTH DEFINITIONS VOCABULARY DISK DISK DEFINITIONS  P 21 BLOAD H 22 BLOAD H 23 BLOAD H 24 BLOAD H 25 BLOAD H 26 BLOAD H 27 BLOAD K ( 30 BLOAD H 31 BLOAD H P P P P P P P P P O\ DISK |BUFCPY| "21/02/87 P P \ Copie d octets du fichier n1 dans le fichier n2 en utilisant le buffer adr : BUFCPY ( n1 n2 adr d -> n1 n2 adr _ ) ) 6 PICK 2 DPICK 6 DPICK FREAD 0 5 PICK 2 DPICK 6 DPICK FWRITE / DDROP G ; O P P P P P P P P P P P P P P P O\ DISK |COPY| $22/02/87 P \ Copie de fichiers = \ Ex: COPY ESSAI.FTH B:\TEST.FTH 0 \ Effectue une copie du fichier ESSAI.FTH du drive courant dans le drive B:  \ Le fichier TEST.FTH est cree dans le drive B: ! P : COPY ( _ -> _ ) ? BL WORD DROP 1. D- $@ "LEN 0 = . BL WORD DROP 1. D- $@ "LEN 0 = OR + ?ABORT" " # "DUP 3 "PICK "COMP 0 = 6 ?ABORT" 0 FCREATE "> 0 FOPEN SWAP / 2048. M_ALLOC ? BEGIN G 4 PICK FEOF DDUP 0. D= 4 WHILEF D 2048. DMIN BUFCPY #  REPEAT F DDROP M_FREE DDROP FCLOSE FCLOSE , ; O P P O\ EDITOR |BPRINT|BTYPE| $28/11/86 P P : BTYPE ( u -> _ ) \ EMET LE BLOCK U VERS LE PERIPH. _OUT DUP >R BLOCK R> = BASE @ >R C DECIMAL E CRLF ." " CRLF CRLF  B/BUFF TYPE @ CRLF CRLF ." " CRLF 4 R> BASE ! C ; O P ;S N P : BPRINT ( u -> _ ) \ EMET LE BLOC U VERS SORTIE CENTRONICS _OUT @ >R PRT BTYPE R> _OUT ! / ; O P P P P P P O\ MUTIL |.S| "26/11/86 P \ Affiche le contenu de la pile de donnees sans la modifier  \ Permet de visualiser l'action des Mots comme PICK,ROT,ROLL .  \ Les numeros a gauche correspondent au repere de l'element (argument de PICK..) P : .S ( _ -> _ ) @ SPO D@ SP@ UD- 1 DSHIFT.R DROP 2 U- ) CRLF ?DUP C IFT I ." Affichage du contenu de la Pile de Donnees" CRLF  ." -*" CRLF  ." Sommet " = 1 DO F 8 CURTAB I 6 U.R 7 ." ->" I PICK 6 U.R 4 CRLF D LOOP F ELSE H ." La Pile de Donnees est Vide !!!" BEEP # ENDIF G ; O P P O}\ EDITOR |BINDEX|BDIR| %03/01/87 P \ Affichage de la premiere ligne des blocs u1 a u2 qui contient  \ conventionnellement le titre,les mots definis,la date...  \ Peut ete imprime par : PRT u1 u2 BINDEX VDU # : BINDEX ( u1 u2 -> _ ) 8 CRLF ." " & 1 + SWAP 1 - @ BEGIN G CRLF BNEXT DDUP U> OVER 0 U> AND * WHILET D ." BLK#" DUP 4 U.R DUP BLOCK 70 TYPE & REPEAT F DDROP ." " CRLF 8 ; O P \ Affiche les index de tous les blocs existants ! : BDIR ( _ -> _ ) ? 1 1022 BINDEX ? ; O P P P P O\ EDITOR |BWIPE| +07/12/86 P ;S N \ Effacement d'un bloc : \ Un bloc est compose de 24 lignes de 80 caracteres + +  \ Un code NULL 0 indique la fin de bloc (pour BLOAD)  P : BWIPE ( u -> _ ) \ Effacement du bloc u  CRLF H DUP ." Effacement du bloc " U. ." :O/N? " " KEY DUP ASCII OUI = >R ASCII oui = R> OR $ IFT I BLOCK BUPDATE ." En Cours ...." ( 23 0 DO C DDUP 80 BL FILL \ 80 blancs  80. D+ 13 2 DPICK C! 1. D+ 10 2 DPICK C! \ +  1. D+ B LOOP F D>R 0 DR> C! !\ 0 pour fin de bloc ELSE H DROP ." Ajourne" 7 ENDIF G ; O P O\ DISK |FORM_CHAINE|FORM_FICHIER| 30/12/86 P \ Ajoute des blancs en fin de chaine sur pile pour obtenir une chaine \ de longueur n caracteres 6 : "FORM_CHAINE ( n -> _ ) ( str1 "> str2 ) % "LEN - DUP \ Calcul Nb de caractere a ajouter 0 < ?ABORT" "  1 ?DO I ]" " "CAT \ Ajoute un caractere Blanc LOOP H ; O \ Construit une Chaine de 12 caracteres pour Nom de fichier en alignant \ le nom de l'extension <8 caract.><3 caract.>  : "FORM_FICHIER ( _ -> _ ) ( str1 "> str2 ) $ "DUP ]" ." 1 "POS \ Recherche position du point  ?DUP IFT F "DUP DUP 1 - "LEFT \ Extrait le Corps du Nom de Fichier 8 "FORM_CHAINE \ sur 8 caracteres  "SWAP "LEN \ Longueur du nom Original SWAP - 1 + \ Longueur de l'extension "RIGHT "CAT \ Nom complet  ENDIF C 12 "FORM_CHAINE \ sur 12 caracteres  ; O O\ DISK |JJ/MM/AA|HH:MM:SS| 30/12/86 BASE @ HEXA E \ Decompactage Jour/Mois/Annee 2 : JJ/MM/AA ( u1 -> u2 u3 u4 ) \ Annee en sommet de pile  >R J I 1F AND \ Les Bits 0 a 4 de u1 representent le Jour  I 5 SHIFT.R F AND \ Les Bits 5 a 8 de u1 representent le Mois  R> 9 SHIFT.R 50 U+ \ Les Bits 9 a 15 de u1 representent l'Annee  ; O \ Decompactage Heure:Minute:Seconde - : HH:MM:SS ( u1 -> u2 u3 u4 ) \ Secondes en sommet de pile  >R J I B SHIFT.R \ Les bits 11 a 15 de u1 representent l'Heure  I 5 SHIFT.R 3F AND \ Les bits 5 a 10 de u1 representent les Minutes R> 1F AND 1 SHIFT.R \ Les bits 0 a 4 de u1 representent les Secondes ; O \ Creation de la chaine d'affichage pour TYPE # : XX.YY.ZZ ( u1 u2 u3 u4 -> adr u5 _ _ ) \ u4 est le code separateur  <# >R &\ u1 u2 u3 Nombres a afficher  0 # # DDROP I HOLD 0 # # DDROP R> HOLD ( 0 # # I #> L ; O BASE ! J O\ DISK |DIR| !30/12/86 P \ Affichage des fichiers contenu dans un Drive " \ Ex DIR *.* DIR *.BLK DIR DOSSIER.* $ \ La sortie peut se faire sur imprimante par PRT DIR  P : DIR ( _ -> _ ) ? BL WORD DROP B DDUP C@ G IFF DDROP ]" *.*" "> ENDIF 4 CRLF CRLF E ." Nom Fichier Taille Date Heure"  CRLF " ( ." - - - -"  16 DIR_SUB D CRLF J ; O P P P P P P P O\ DISK |A:|B:|C:|D:| 23/11/86 P : A: 0 DVSET ; \ POUR DRIVE A 1 : B: 1 DVSET ; \ POUR DRIVE B 1 : C: 2 DVSET ; \ POUR DRIVE C 1 : D: 3 DVSET ; \ POUR DRIVE D 1 P P P P P P P P P P P P P P P P P P O\ DISK |MORE| #21/02/87 \ Affichage du contenu d'un fichier a l'ecran , ex : MORE COMMAND.FTH \ affiche la ligne suivante, stoppe l'affichage  \ affiche l'ecran suivant. . P : MORE ( _ -> _ ) ? BL WORD DROP @ 0 FOPEN E CRLF 23 E BEGIN G 1 DO D DUP FEOF 0. D= IFT LEAVE ENDIF * DUP FGET.STRING 9 COUNT TYPE CRLF 9 LOOP F DUP FEOF 0. D= < DUP IFT ." " ELSE ." " ENDIF  KEY G $1B EMIT ASCII M EMIT !  DUP $0D = IFT 1 ELSE 20 ENDIF ROT ROT $1B = OR  UNTILT F DROP FCLOSE A ; O P O\ Directory VT52 @ P FORTH DEFINITIONS VOCABULARY VT52 VT52 DEFINITIONS  P 101 BLOAD G P P P P P P P P P P P P P P P P P P P O\ VT52 A22/11/86 P \ Voir Bible page 286 ; P P 27 CONS ESC E P : LINSERT ( _ -> _ ) \ Insere une ligne a la position courante curseur ESC EMIT ASCII L EMIT ; \ Avec schrolling vers le bas  : LDELETE ( _ -> _ ) \ Annule la ligne a la position courante curseur ESC EMIT ASCII M EMIT ; \ Avec schrolling vers le haut  : CUR! ( _ -> _ ) \ Memorise la position courante curseur pour CUR@ ESC EMIT ASCII j EMIT ; 5 : CUR@ ( _ -> _ ) \ Remets le curseur a la position memorisee  ESC EMIT ASCII k EMIT ; 5 : LERASE ( _ -> _ ) \ Efface la ligne a la position courante curseur ESC EMIT ASCII l EMIT ; 5 : REVERSEON ( _ -> _ ) \ Prochaine ecriture en video inverse ESC EMIT ASCII p EMIT ; 5 : REVERSEOFF ( _ -> _ ) \ Prochaine ecriture en video normal  ESC EMIT ASCII q EMIT ; 5 P P P O\ EDITOR Mnemoniques 5 \ Permet de ne frapper les 3 premieres lettres des mots de L'editeur \ A Recharger pendant la mise au point dans le vocabulaire de contexte utilise \ en faisant MON_VOCAB DEFINITIONS EDITOR 56 BLOAD MON_VOCAB  \ Les mots seront importes dans le vocabulaire MON_VOCAB  P : $FC ." REATE" $FCREATE ; 6 : $FO ." OPEN" $FOPEN ; 6 : BLI ." ST" BLIST ; 6 : BED ." IT" BEDIT ; 6 : BLO ." AD" BLOAD ; 6 : BWI ." PE" BWIPE ; 6 : BIN ." DEX" BINDEX ; 6 : BDI ." R" BDIR ; 6 : BAC ." KUP" BACKUP ; 6 P \ Tres utile pour la mise au point d'un screen " \ Charger SCR1 SCR2 SCR3 avec les valeur desirees  VAR SCR1 VAR SCR2 VAR SCR3 2 : SIT SCR @ DUP SCR1 ! DUP SCR2 ! SCR3 ! ; & : SED 0 CURTAB ." SCR1 @ BEDIT" SCR1 @ BEDIT ; " : SLO 0 CURTAB ." SCR2 @ BLOAD" SCR2 @ BLOAD ; " : SLI 0 CURTAB ." SCR3 @ BLIST" SCR3 @ BLIST ; " P O\ EDITOR Mnemoniques 5 P P P P P P P P P P P P P P P P P P P P P P P O\ Test GEM F P VDI.HDLE @ V_CLSVWK = P APPL_EXIT . E P M < P P P P P P P P P P P P P P P P P O\ TEST GEM F P " [1][VOULEZ-VOUS|UNE DEMONSTRATION|DE LA PUISSANCE|DE FORTH MC68000 ?]"  " [DEMO|SUITE]" "CAT "> $> 6 2 FORM_ALERT D P " B:\*.FTH" "> $> $" .FTH" $> 3 FSEL_INPUT F P P P P P P P P P P P P P P P P O\ MUTIL |[IF|[ENDIF| 01/03/87 P \ Structure de Commande conditionnelle valide en mode execution  \ Ex: .( Fin si Appui sur ) KEY $0D = [IFT ABORT [ENDIF  \ Permet de commander l'execution des fichiers batch  : [IFT ( w -> _ ) ? IFF I BEGIN E BL WORD A 0 <= ?ABORT" "  1. D- $@ @ ]" [ENDIF" "COMP 8 UNTILF 1 ( ENDIF G ; O LATEST C@ %1011 AND LATEST C! \ Rends [IFT valide a l'execution seulement P \ Marque de fin pour [IFT 7 : [ENDIF ( _ -> _ ) = ; O LATEST C@ %1011 AND LATEST C! \ Rends [ENDIF valide a l'execution seulement P P P O\ MUTIL |[BEGIN|[UNTILT| "01/03/87 P \ Structure de commande Iterative valide a l'execution  \ Ex: 1 [BEGIN DUP BPRINT BNEXT ?DUP 0 = [UNTILT \ Imprime sucessivement tous les blocs du fichiers *.BLK actif  \ Permet aussi de commander l'execution des fichiers batch  \ Ces structures ne peuvent etre imbriquees % P VAR M_BLK DVAR M_OFFS -1. M_OFFS D! + : [BEGIN ( _ -> _ ) = OFFS D@ M_OFFS D! BLK @ M_BLK ! - ; O LATEST C@ %1011 AND LATEST C! \ Mot Reserve a l'execution  P : [UNTILT ( w -> _ ) < M_OFFS D@ -1. D= < M_BLK @ BLK @ = NOT OR 6 ?ABORT" " ) IFT -1. M_OFFS D! ELSE M_OFFS D@ OFFS D! ENDIF  ; O LATEST C@ %1011 AND LATEST C! \ Mot Reserve a l'execution  P P P O\ Directory GEM A P 201 BLOAD G 202 BLOAD G 203 BLOAD G 204 BLOAD G 205 BLOAD G 206 BLOAD G 207 BLOAD G 208 BLOAD G 209 BLOAD G P P 220 BLOAD G 221 BLOAD G P P P <H  P P P P P O\ GEM K P : TAB16B H CREATE 1 2 DIM DDROP DOES ARRAY - ; O P : TAB32B H CREATE 1 4 DIM DDROP DOES ARRAY - ; O P P P P P P P P P P P P P P P O\ GEM K P 11 TAB16B CONTROL > 127 TAB16B INT_IN ? 127 TAB16B PTS_IN ? 127 TAB16B INT_OUT > 127 TAB16B PTS_OUT > P \ Definitions du bloc de parametres VDI ) :VAR VDIPB F 0 CONTROL D, 0 INT_IN D, 0 PTS_IN D, " 0 INT_OUT D, 0 PTS_OUT D, 3 P P 15 TAB16B GLOBAL ? 63 TAB32B ADDR_IN > 63 TAB32B ADDR_OUT = P \ Definitions du bloc de parametres AES ) :VAR AESPB F 0 CONTROL D, 0 GLOBAL D, 0 INT_IN D, " 0 INT_OUT D, 0 ADDR_IN D, 0 ADDR_OUT D, " P P Ou\ GEM K P : APPL_INIT ( _ -> n ) \ n est le Numero de l'application  0 0 1 0 10 D 4 0 DO I CONTROL ! LOOP 7 AESPB GEM.AES 0 INT_OUT @ 1 ; O P : GRAF_HANDLE ( _ -> n ) \ n est le Numero d'acces VDI  0 0 5 0 77 D 4 0 DO I CONTROL ! LOOP 7 AESPB GEM.AES 0 INT_OUT @ 1 ; O P : V_OPNVWK ( n -> _ ) \ n est le numero d'acces VDI  100 0 CONTROL ! 0 1 CONTROL ! 11 3 CONTROL !  6 CONTROL ! C 9 0 DO 1 I INT_IN ! LOOP 2 10 INT_IN ! ' VDIPB GEM.VDI A ; O P P P P O\ GEM K P \ Efface la station de travail 2 : V_CLRWK ( n -> _ ) \ n est le No d'acces VDI fourni par GRAF_HANDLE 3 0 CONTROL ! 0 1 CONTROL ! 0 3 CONTROL ! ! 6 CONTROL ! C VDIPB GEM.VDI A ; O P \ Ferme la station de travail 3 : V_CLSVWK ( n -> _ ) \ n est le No d'acces VDI fourni par GRAF_HANDLE 101 0 CONTROL ! 0 1 CONTROL ! 0 3 CONTROL !  6 CONTROL ! C VDIPB GEM.VDI A ; O P \ Sortie de l'application 7 : APPL_EXIT ( _ -> w ) \ w=0 si erreur # 0 0 1 0 19 D 4 0 DO I CONTROL ! LOOP 7 AESPB GEM.AES A 0 INT_OUT @ C ; O P O\ GEM K P P : FORM_ALERT ( adr n1 -> n2 ) \ adr:message d'alerte n:bouton de sortie defaut 0 1 1 1 52 D 4 0 DO I CONTROL ! LOOP 7 0 INT_IN ! 0 ADDR_IN D! 7 AESPB GEM.AES A 0 INT_OUT @ C ; O P P P P P P P P P P P P P P O\ GEM K P \ Apparition du curseur souris 2 : V_SHOW_C ( n1 n2 -> _ _ ) \ n1:vdi.handle n2:reset si 0  122 0 CONTROL ! 0 1 CONTROL ! 1 3 CONTROL !  0 INT_IN ! 6 CONTROL ! 0 VDIPB GEM.VDI A ; O P \ Disparition du curseur souris 1 : V_HIDE_C ( n -> _ ) \ n:vdi.handle # 123 0 CONTROL ! 0 1 CONTROL ! 0 3 CONTROL !  6 CONTROL ! C VDIPB GEM.VDI A ; O P P P P P P P P P O\ GEM K P \ Selection fichier (clefs P180) 0 : FSEL_INPUT ( adr1 adr2 -> n w ) \ adr1:fs_iinpath adr2:fs_iinsel  0 2 2 0 90 \ w:0 si erreur n:0 si annuler n:1 si confirm 4 0 DO I CONTROL ! LOOP 7 1 ADDR_IN D! 0 ADDR_IN D! 5 AESPB GEM.AES A 1 INT_OUT @ 0 INT_OUT @ 7 ; O P P (n ( P P P P P P P P P P P O\ GEM K P \ Calcul espace fenetre (clefs p190) Tous Arg. 16bits  : WIND_CALC ( code comp x1 y1 lg1 ht1 -> x2 y2 lg2 ht2 flag )  0 0 5 6 108 C 4 0 DO I CONTROL ! LOOP 7 5 0 DO 5 I - INT_IN ! LOOP 4 AESPB GEM.AES A 4 1 DO I INT_OUT @ LOOP 7 0 INT_OUT @ C ; O P \ Fermeture d'une fenetre (clefs p184) Tous Arg. 16bits  : WIND_CLOSE ( wi.hdle -> flag ) 0 0 0 1 1 102 C 4 0 DO I CONTROL ! LOOP 7 0 INT_IN ! D AESPB GEM.AES A 0 INT_OUT @ C ; O P P P P O\ GEM K P \ Creation d'une fenetre (clefs p183) tous Arg. 16bits  : WIND_CREATE ( comp x y lg ht -> wi_hdle ) % 0 0 1 5 100 C 4 0 DO I CONTROL ! LOOP 7 4 0 DO 4 I - INT_IN ! LOOP 4 AESPB GEM.AES A 0 INT_OUT @ C ; O P \ Ouverture d'une fenetre (clefs p184) tous Arg. 16bits  : WIND_OPEN ( wi_hdle x y lg ht -> flag ) ' 0 0 1 5 101 C 4 0 DO I CONTROL ! LOOP 7 4 0 DO 4 I - INT_IN ! LOOP 4 AESPB GEM.AES A 0 INT_OUT @ C ; ;  P P P P P O\ GEM K P \ Effacement d'une fenetre (clefs p185) Tous Arg sur 16bits  : WIND_DELETE ( wi_hdle -> flag ) / 0 0 1 1 103 C 4 0 DO I CONTROL ! LOOP 7 0 INT_IN ! D AESPB GEM.AES A 0 INT_OUT @ C ; O P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P O o\ GEM K P : V_ENTER_CUR ( vdi_hdle -> _ ) 1 5 0 CONTROL ! 0 1 CONTROL ! 0 3 CONTROL ! 3 5 CONTROL ! 6 CONTROL ! 0 VDIPB GEM.VDI A ; O P P P P P P P P P P P P P P P P P O - FORTH MC68000 SUR ATARI-ST - Par D. Letournel - 20/03/87 - Ce fichier liste les bugs connus a ce jour dans la version de FORTH68K en votre possession. Toutes les anomalies trouvees par les utilisateurs y sont repertoriees jusqu'au moment ou elles sont resolues. C'est pourquoi,je vous demande de me signaler les bugs que vous rencontrez de facon a ameliorer ce produit qui est du domaine public et qui je l'espere deviendra un bon logiciel de developpement pour ATARI-ST. Diffusez-le le plus largement possible . Le but est de constituer un club de correspondance Forth a travers le monde . Il faut etre ambitieux ! Il est deja diffuse a l'etranger dans les pays de langue francophone . Les versions ulterieures de ce Forth resteront compatibles avec la version actuelle,si bien que les programmes developpes actuellement fonctionneront toujours. D'autre part,si la documentation vous semble insuffisante ou si il existe des points que vous souhaiteriez voir developper plus longuement,veuillez me signaler.Le but de cette documentation n'est pas d'apprendre a programmer le Forth,ce que des ouvrages disponibles en librairie peuvent faire bien mieux que moi,mais de constituer une notice d'utilisation pour des programmeurs Forth. Toutes vos suggestions seront les bienvenus ! Anomalies rencontrees - 1> TRAP provoque une erreur en mode TRACE Le systeme se plante irremediablement car il detecte une erreur au niveau des piles data et return (inversion) Seule solution RESET 2> Dans certains cas de fonctionnement,lorsque le dictionnaire est trop important et se rapproche trop de la pile data,Forth se boucle sur le message d'erreur pile pleine si la pile est vide. Appuyez sur simultanement pour retourner au bureau gem 3> Ne pas employer une chaine de longueur superieure a 250 pour EDIT sinon il y a debordement de TIB. .  ..  ADRESSE  !ETIQUETTE  CVOCABULAIRE `5SELECTEUR  waHAUSHALT  TGS   .  "..  "ADRESS BAS $fINFOB  +}TITEL  2}UNTERLA 9}BGfABASIC...jaDcddddeeeeDf(f(f(f(vFD#EF%!!F$!!  !HF E F R JFz)@!W FALSCHE AUFLSUNG | |GfA-ADRESS abeitet nur im|High-Res-Modus!!!ABBRUCH!FF FD)!| Haben Sie etwas Zeit ? |!! NEIN | JA !5F S5FnE!FTitel! FEa FYFE%!!F$!!  !HFE!Funterla! FE!F&!!  !H!F !FE!F F Td5Fn6EFn%!!Fw&!!  !HF F,5F !FEFEF*HH@` F*HH@` F*HH@` F*`` F E Anrede F E Vorname F@ E Name F E Strae F  E PLZ+Ort F@ E Telefon F` E Bemerkung F*HH FUEG8FQ F UFDesk, ber GFA-ADRESS - 1,2,3,4,5,6,"" -@Datei, Laden , Speichern , Anhngen ,- , Lschen ,"" nBearbeiten, NEW ,-, Adressen eingeben , AdvFD#EF%!!F$!!  !HF E F R JFz)@!W FALSCHE AUFLSUNG | |GfA-ADRESS abeitet nur im|High-Res-Modus!!!ABBRUCH!FF FD)!| Haben Sie etwas Zeit ? |!! NEIN | JA !5F S5FnE!FTitel! FEa FYFE%!!F$!!  !HFE!Funterla! FE!F&!!  !H!F !FE!F F Td5Fn6EFn%!!Fw&!!  !HF F,5F !FEFEF*HH@` F*HH@` F*HH@` F*`` F E Anrede F E Vorname F@ E Name F E Strae F  E PLZ+Ort F@ E Telefon F` E Bemerkung F*HH FUEG8FQ F UFDesk, ber GFA-ADRESS - 1,2,3,4,5,6,"" -@Datei, Laden , Speichern , Anhngen ,- , Lschen ,"" nBearbeiten, NEW ,-, Adressen eingeben , Adressen ndern , Adressen sortieren ,"" nAusgabe, Namenkatalog , Adressen ausgeben , Druckformat ,-, Desktopmodus , Feldnamen ,"" Hilfe, Adressen drucken , Einzeln Ausgeben , Briefumschlge , GOOFYSOFT , Drucker, Adressen , Bilder , DIP's , ein Tip ... ,"" Quit, Programm beenden ,"",""  F ^F^!!FvLFvL/F0v!H!H!H!HLF0!F(!FH!FP!F@!FF.ERFF X.F,6F FXF+6FV YF  d  0 /0 >F,F FV Y    J0 /0 >F YF,"F F0 F0V Z  J  v0 /0 >F,-F FV Z|  v  0 /0 >F,F FV Zܦ    '0 /0 >F,,F FV [<  '  =0 /0 >F, F FV [  =  S0 /0 >F [F,F F FV \(  S  i0 /0 >F \$F, F F FV \  i  0 /0 >F \F,$F F$ F$V ]      0 /0 >F ]F,F F F.F6+/F/ ]B` l F,F F ]|` p F ]xF,"F F0 F ]` t F,-F F- ]Ħ` x F,F F1 ]` | F,,F F  ^ ` F, F F2 ^F` F ^BF,F F F3 ^` F ^|F, F F F  ^` F ^F,$F F F4 ^` F ^F,F F F.F+FFF _,  Anhngen F,-F F-( _^  Einzeln Ausgeben F,8F F8& _  Briefumschlge F,.F F. _  Adressen F,F F$ _  Druckformat Fn,*F F*$ `  Namenkatalog F,$F F$" `@  NEW F,,F F,( `r  Adressen drucken F,+F F+ `  DIP's Fl,F F( `  Adressen ndern F,F F* a  Adressen sortieren F, F F  a(  DruckerF,F F" aT  Feldnamen F-,F F a|  Bilder F,F F$ a  ein Tip ... F.,F F* a  Adressen ausgeben F-,F F" b  Speichern F,"F F b4  Lschen F,F F$ bb  Desktopmodus F, F F * b  Adressen eingeben F*, F F" b  GOOFYSOFT Fs,F F( b  ber GFA-ADRESSF",F F c  Laden F ,F F( cN  Programm beenden F,FF F.F+F }F0v!H!H!H!HLF.F+F }F0v!H!H!H!HLF.F+,F)@!e NEW |ACHTUNG:'NEW' lscht alle|im Speicher befindlichen|Adressen und Parameter !!!!! ABBRUCH| OK !SFR eSF @!FH!FP!F(!F0!FEF EF#EF|YEFEF| E Anrede F E Vorname F@ E Name F E Strae F  E PLZ+Ort F@ E Telefon F` E Bemerkung F,5F FE.F+ F&d!H!  !,!$Fh#F%!!Fe$d!H!  !#F"$h!P!  !"F"$(!!!pFE,7F('e!4!ADRESSEN SORTIERENF$(!!!PFe0'f!p!Adressen sortieren nach :Fr$(!!!PFeEFgEG`FYp! "W F4F gF!F$(!!!PFeFY! "*Bitte gewnschte Feldnummer eingeben (1-7)"F$(!!!PF:0Fg00F%!!F$h!P!  !"FR$(!!!pFiEGFi|EGF ir@0 @0 JFinEG`FH@ !@ F iPF! F iF! hF!,Y8! "Adressen wurden nachFFYP!0 "0 F*Y8!P "sortiert ! (Taste)FhEa F !Fd!H!$F.F+.FhF)!bUm Briefumschlge zu be-|druckevn kann man die Druck-|option aus dem ndern-Men|benutzen.(Format!)!! OK !F.F++FhFt)!P Durch drcken der Taste 's'| lt sich das Ausdrucken | aller Adressen stoppen!!! OK !F.F+*Fp)!A Beim Ausdruck : Adressen mit| Feldnamen ausdrucken oder| ohne ? !! MIT | OHNE |LISTE!OF kOFAYEFPEF FE lO@FAYEF FE l@OFAYEFPEF FE.FE+Fh&F&*! !a!b!&F%!!Fu !F$*! !a!OFh$,!!`!MFh$(!!!PFg*'H!4!Die Programmierer :Fn$(!!!@Fg0'H!\!Grafik und Ausgabemedien :F$(!!!@Fg$'H!! Ralph GllnerF30'H!!Balthasar-Neumann-Str. 52FF&'H!!8500 Nrnberg 30F0'H!"!Logik und Programmidee :F$'H!4!Jrgen LandlerF&'H!<!Weimarer Str. 30F&'H!D!8507 OberasbachFFEa F*! !&F.F+FhF)!o Adressen |Adresseintrge drfen bis zu|30 Stellen betragen, Feldein-|trge bis zu 10 Stellen .!! OK !F .F+FhF)!y DIP Schalter |Um die Umlaute richtig auszu-|drucken DIP-Schalter bitte auf|Deutschen Zeichensatz stellen !!! OK !FF.F+FhFf)@!B Wollen Sie | GFA-ADRESS | wirklich verlassen ?!!NEIN|JA!F pJFFF F.F+Fh!F&d!H!  !,!$F%!!Fa$d!H!  !#F"$h!P!  !"F"$(!!!pF-,7F&'e!4!FELDNAMEN NDERNFEFrEG`F$(!!!PFR*Y! "Feld "" ": "F$(!!!PF` ! Flr6  F" E  FrF E:F4FE r(Fd!H!$F.F+ Fh!F&d!H!  !,!$FFE%!!Fs$d!H!  !#F"$h!P!  !"F"$(!!!pFB,7F('e!4!ADRESSEN EINGEBENF $(!!!Fs"'a!,! Adresse Nr. F$(!!!PFs' !4!FEFu2EG`F$(!!!PF Y! " ": "F`p!@ F4F tF! !F$(!!!PFh>)!Daten richtig eingegeben ?!!JA|NEIN!F !F" uJF6)@! Weitere Eingaben ?!!JA|NEIN!F F vJFEnF F v2JF5F FE4FsLFi@!@F(!@F0!@FH!@FP!@Fd!H!$F vF,5F F.F+ FhFt)!A DESKTOPMODUS | | Bitte whlen Sie : !!ABBRUCH|NORMAL|MIT BILD!F wJF%!!FD&!!  !HF,5F F w@Funterla! F,5F F.F+F&!!  !H!F xZF !!!@@F F xJFinfob! F&!!  !H!FEF FEa F !!!@@F,5F.F+FEFh!!!! ! ! ! ! FE Wollen Sie die Datei |FE| wirklich lschen ?F E Die Datei |FK E| wurde gelscht !FFEf\*.ADR!! F zZ  \F E6 F& E = @ F,)@! !!ABBRUCH|LSCHEN!F zxJFA F& E  = @  F )! !!OK!F| F y F.F +F EFKhF&d!H!  !,!$F%!!F$d!H!  !#F!$h!P!  !"F$(!!!pF,7Fo&'e!4!ADRESSEN NDERNFFF$(!!!Fd"'a!,! Adresse Nr. F$(!!!PFd' !4! FE``F$(!!!@FSPY! "4V=VORWRTS, R=RCKWRTS, A=NDERN, L=LSCHEN, E=ENDEF<Y!  "!D=DRUCKEN, S=SPRINGEN, J=SUCHENF$(!!!PFe}EG`F4Y!@@ "" " " : "F$(!!!PF"Y !@@ "p F"Y !@@ " @ F $(!!!PF4F },F!FESF ~F jJFFR$(!!!PF4Y8! "In welchem Feld suchen "F$(!!!PFm:RF~*RR``Fl$(!!!PFm,Y!  "Suchen nach : "F`p!"F "E" FzEGF@R E@R F  zZ"@R F FF F EF F F 4sSFF$(!!!PF8Y8! "Zu welcher Adresse springen "F:QFQQF EQF F lLJF!E GF EG`F @ E@ F |F bF5F F& #vV JF4 F FE" #rR JF5 F F pdDFlEG`F  \PF,F F,F @F F aAFF$(!!!PFa4YH! " Feldnummer (1-7) "F:F ``F $(!!!PFa,Y!  "Neuer Inhalt : "F($(!!!PFa`p! @ F F aAJFn8)! Noch eine nderung ?!!NEIN|JA!F JFEEF FE F{EeFd!H!$F,5F.F+Fh!^FEF&d!H!  !,!$Fl)!: Wollen Sie alle Adressen aus- | geben oder nur einzelne ?!!ABBRUCH|ALLE|EINZELN!F JFF)! Ausgabe auf !!MONITOR|DRUCKER! F EF  ( JF%!!Fa$d!H!  !#F"$h!P!  !"F"$(!!!pF ,7F('e!4!ADRESSEN - AUSGABEFF$(!!!Fd"'a!,! Adresse Nr. F$(!!!PFd' !4! FvEG`F $(!!!PFGY! " "F$(!!!PFG : "p FY! " @ F4F F!$(!!!F'f!!E = ENDEFEFFESF F  JF4 F FEDeE Fd!H!$F F  JFF!ESF%!!F !ESF$V!H!@!Fl$X!L!?!Fl$(!!!PFl&'`!p! Bitte warten !Fe!ESFEG`F !ESF Z!S!sF; "F PF,F  F,F <F  JF 4 F FE!ESF%!!F $V!H!@!F! r!s!SFB)! Drucken Abbrechen ? !!ABBRUCH| WEITER !XF nXFe!EF FE FE> !S!sF F F r@JFD)! Ausgabe auf !!DRUCKER|MONITOR! F f F %!!Fu$d!H!  !#F"$h!P!  !"F"$(!!!pF ,7F('e!4!ADRESSEN - AUSGABEF^EFEF$(!!!PFG Y! " ":"FR$(!!!PFG`p!*F$(!!!PF;*Y! "@@ ":"F`p!)F *E* F )E) F \E6* F ]E6) FEGF "@ E@ F""@@ E@@ F"$@ E;@ @\ F$@@ E;@@ @] F* *@ )@@@ FEFFEG`F$(!!!PFY! " " : "F$(!!!PF p FY! "@ F4F@$(!!!PFs'a!![TASTE]Fe^EF F!Ea F F  F! b^ F `)@!=Sorry, aber diese Adresse be-|findet sich nicht im Speicher !!!ABBRUCH!F F FE n F:EF%!!F]$d!H!  !#Fs$h!P!  !"Fs$(!!!pFs,7F2'9!4!ADRESSEN EINZELN AUSDRUCKENF F$(!!!PFu<YH! "$Ausdruck nach jeder Adresse anhaltenFt<YH! "#und auf Tastendruck warten (j/n) ? "Ft`!+F"n+J+j+N+nF d+j+JF:EF vF:EFF FbEFF$(!!!PF:(Y!@ " " : "Fc$(!!!PF:`p!,F$(!!!PF:(Y!P "@@ " : "Fc`p!-F ,E, F -E- F `E6, F aE6- FEGF"@ E@ F"@@ E@@ F$@ E;@ @` F$@@ E;@@ @a F* ,@ -@@@ FEG`F EF; "F PFF,F F,FbEF hF :F Ea F FE F F jbJF`)@!=Sorry, aber diese Adresse be-|findet sich nicht im Speicher !!!ABBRUCH!F F F Fd!H!$F.F+F  F EF FE YF &; "FF F8EG6 @ FE? @ @@ F "E7 F P"JFEBv F FE t"JFEB| F FE "JFEB6 F FE "JFEB8 F FE "JFEB: F FE "JFEBx F FE ("JFEBz F FE;"F F! ;BP F.F+FEG6 FE? @@ F "E7 F "JFEBv F FE "JFEB| F FE "JFEB8 F FE "JFEB: F FE >"JFEB6 F FE b"JFEBx F FE "JFEBz F FE;"F hF!;  "F ;BP "F .F+F)!v Ein Tip fr Anfnger : |Anstatt die strker umrandeten|Knpfe mit der Maus zu klicken|kann man auch Return drcken.!!OK!F.F+Fh!#FE8 Drucker : |GfA-ADRESS abeitet mit EpsonB?? |RX-80 und STARB? , NL-10(P) ein-|wandfrei zusammen (Umlaute!).F )!!!OK!#F|.F+F)!v Fr alle Graphikfreaks: |Bilder im DOODLE-Format knnen| in GfA-Basic-Programmen ohne|Modifikation verwendet werden!!!OK!#F.F+Fh!/FEFFf\*.ADR!!F Z\/FiE;@ F7O!M!.ADRFuM!FEG`F  JF  E-F FuM! F dF!&EGFEG`F @ JF@ E-F FuM!@ F F! F! 8MFB)! Ihre Daten wurden gesichert !!! OK !F$/F.F+F h/!!JFEFFf\*.ADR!!F Z\/F JE6 F E;@J F=E.ADR F v=JF7I!M!.ADRFA:M!F EG`F:M! F n F! EGF EG`F:M! @ F  F!  F! 8MFEF@!@F(!@F0!@FH!@FP!@F,5F F=`)@!= Angesprochene Datei ist | auf Diskette nicht vor- | handen !!!ABBRUCH!F FFn.F+-Fh!U!%!#FEFFf\*.ADR!!#F %E6# F #E;#@% FUE#.ADR F UF7I!M@!#.ADRFe:M@!VF EG`F:M@! F  F!&. EG#V F$ EG`F:M@! @ F  F!  F! 8M@FE#V FEF@!@F(!@F0!@FH!@FP!@F,5F 4FUb)@!? Angesprochenene Datei ist | auf Diskette nicht vor- | handen !!!ABBRUCH!F F#Fn.F-+"Fh)@!>| Bitte Datendiskette einlegen !| (Schreibschutz entfernen !)!! OK |ABBRUCH!7F v7Fe 8E9 F;E# `F:E;pF:E:(F ::8JF,F rF:4)@! Diskette voll !!!ABBRUCH!E@@F EFEFF%!!F$d!H!  !#F$h!P!  !"F$(!!!pF,7F&'W!4!VORHANDEN {E NAMENFDEBFEECFFRNEG@F !F$(!!!PF ZF4Y! " " "D " : "F F v  JF4>F FE  HJF>E>FF FE*Y! "> "E " : "F>E@@F F$(!!!PF "JF  @D F 2F  @E F F !F4F F # F$(!!!PFE'a!!(TASTE)FEa F#EF%!!F$h!P!  !"FNEF F#E#F4 F  FEa Fd!H!$F#EF.F+%F&d!H!  !,!$F%!!F$d!H!  !#F $h!P!  !"F $(!!!pF,7F('W!4!Abfrage fr NamenFEFAEF$(!!!PFeEGF(Y! "A" = " F 4AF4F F!^E@G F(Y! "A" = " F 4AF4F  F!E@G`F(Y!@@ "A" = " F 4AF4F xF!FEF$(!!!@F>Y!  ""Whlen Sie zwei Zahlen von 1 bis 7F$Y!@@ "1. Zahl:"F:BF$Y!`` "2. Zahl:"F:CF6BBCCFbd!H!$F.FE+5F !F%!!F$d!/!  !>F$(!!!F[EF"EdGH0F !/!!>>F'!3!FF'@!3![F4[F F$(!!!F'x!;!LOADF l F$(!!!F F'(!;!SAVEF$(!!!F'R!;!MERGEFF'{!;!DELETEF'!;!NEWFF'(!;!EINGABEFN T F$(!!!F F'C!;!EDITF'Y!;!SORTF'i!;!KATALOGFN' !;!AUSGABEFN.F5+7F%!!F$!@F$ !! !>F$!! !<F$!>! !>F$!F.F7+8F&d!H!  !#!$F%!!F$d!H!  !#F$h!P!  !"Fe$(!!!pF,7F6' !4! Info : Adressen einzeln ausgebenF$(!!!PFn2Y! "Mglichkeiten der Eingabe:Fe(!Fa$YX!  " Vorname : j"F,YX!0 "Name : "Fv$(!!!@FgJY!H "3ERKLRUNG: Es werden alle Adressen ausgegeben derenFLY!P "4 Vornamen mit 'j' beginnen. Die Namen sindFu2Y!X " ohne Bedeutung.Fd$(!!!PFn(YX! "Vorname : JrgenF$YX! " Name : mF'$(!!!@FrHY! "1ERKLRUNG: Es werden alle Personen ausgegeben dieFFY! "/ Jrgen heien und deren Nachname mitF.Y! " 'm' beginntFnYp!  "[TASTE]FEa Fd!H!$F.F8^cXcwpfsv xz :N\$poolJeVnkHjcj0]XZxx|``f8<$||~`<`f8~#nnf`~`ff#f<>f<~<8f<<||<8~<<ff>><|<f8<ff8~#f~~f>~~8~~>~~~8~~~ff~~>~~~8~~ff8~#ff`ff|ffffffff`fff~~fff#ffpf>fff>`ffff~fpf>ffffff#f~<f~~f~~`f~~f~f~~~f<<~|~<#x>|x>><|>>`|><>ff>|>|>f<<>6><?~O|PUPPUPPUPPUPPUPPUPPUPPUPPUPMXMUMYMUMYMUMYMUMYMU9 YU9` U9 YU9` U8 Y 0` U7 Y7 ` U7 Y7 ` U7 Y7 ` U7 Y?3 ` U+3 Y5P3  U+3 Y?3  U~ Y? ~?  U5P ~ Y+   U5P  Y+ ?  U5P ?~~ Y+?~~  U5P\W??~~ Y+:~?~~  U5PUuUp?~~ Y+?~~  U 5Pxu@׏X_~?~ +~  UY5P@ aTT`~ +~?  UY5PaUUT~? +?~  UY5PaUUT?~?~ +~~  UY5P a\?~~ * ?~~  UY5 p`a\?~~ :z??~~  UY_`_X?~ j~  UYUWW5U`~ ~?  UY?~ 7  UY7 7  UY7 7  UY7 7  UY7 7  UY7 7  UY8 8 UY< U9 UY8Ϫ < UY?8ꪪ ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; ; UY*; MUYMMUYMMUYM@EUYFEs|?q>>?8fps?9?w9wǽ;8{?<s;w<yUY?8ps8>9sp99~89q8qs888q8ps88>?9|89q8q88qUY9Àp88p8p89~89q9qp88q9Àq8<9;w9w9;9{;8ø;8qUY;?8p>9s98qA UY@8 @ UYMMUYM)DUY?6<p p~l?8*<p sT8<UY8"~p sÎD8s8s8"s~|wsD8s<9<UY??s;?f?gss;8<9ü~?8sssqssssswssq99?>9UY8rsqsssq??8s98pssqpÜs8lpUY p  s UY ?!MUY B 6BUY*?p p.<"8p p+UY8q"8+?p8|p??p+UY<p0?qqøw;=q+8q8?8s99s+UY8p98q|s9?9s+88y8ss9s9s+UY8<8qqøww9q)8?|p??9p)UY45UY~5MUYMMUYMMUYMMUYMMUYMMUYMMUYM ,UY<#`?"8<"q8<"UY8~" p88p"|>|~" ps8<#UY88s~=;8fps?"98s98?8ps8>"UY9898ps8"98s99Àp88p"UY88w9;9Àq8<"8|8>9;?"UYMMUYMMUYMMUYMMUYMMUY22UY22PUY ? UUT wwwAPUY X@XXy`@A ??Ϟ_PUY cUŀX\uxW5XpXw}[M=xup 豢Əlo+x+oU]v!PUY cwe7tt_E7ycWV66A ⦋*<,l.h거?踿WUwPUY pcCe6UttcOU4XU?YpacwvuXX æ.<ll,h㩰顡o谿UPUY cce64\TcM4X`Paaut\X"! ;l챢˻,h鹹mWUPUY c]EXWcM4XXQaxW\WPb Ƌzή,h񡨨zzUUVPUY yG"È>B@PUY@2PUY22PUY2`2f`PUY2`2 6`PUY2 6`2PUY22PUY220 PUY200 21>> xx PUY (0333  0 `f 33< PUY 0 `f 3333 30?<ٟ|<|g`3333 PUY330330fffٙ0fffffff``1>3xx c?0q?30>fff0f~fffg`0PUYc00030ffff0f`ffff`030330ffff30fffffff``PUY030?fff3ffcf` 2PUY//PUY. >.?a<<PUY.ff`qffff`yxfPUY @@ f`m`f 6??<``ff`g`fPUY nx``ff`g`ff 8\  fff`c`ffPUY 0{p |8ax<< @? 0`1` PUY 90`q    } @`q7PUY ?8Aaa @@ `}p8PUY pqp 8 p 8pPUY ~`  `PUY @ &UPUY @ ~'UPUYM3UPUYMMUYMMUYMMUYMMUYMMUYM >UY}22UYq0`"30 ?0@q" Ì9830 fUY36D@a3` f` 00Ǐ x3x6a3pa33`0 ٰfq168lq3D633UYf033afa`0 0ac0 a3 `0c001 0<3gg ?0a` 3 afa<<UY063ff 0H0a1` 3 a1fa`fafc30`9f3a09 0qg03 g0fs3UYaca07v`xa?݆x;1 ;0xxx<``UY`UYMMUYMMUY0``00``00f`00```UY 0  `0  L8fp0p;1px8oÀv78fbnpp{ǞUY1`68lffac81fq`0f91f61c83ac0faf0 a`013fc1fUY<3gg anj00c3s?0`cg c?30063f` a00f33300`cf c0300UYfc30`Fc81af0c3 83s9a3013f33 ffaca0>Cx0 a`0v1 ݆a03x<6a`UY0 - `1,1UY>->MUYMMUYMMUXMMUAU TPUOTPUU'(R U0_  0 U0_  0  /_  /  /_ǀ  /$@  /_$@  $@ |?U|?``_B$@ 10 UL1@E:*A@ nٻ/Kv_uUU5UUX P_ [Kim/_ *` W)E A @5 \`X_ TJ)E/2_ :+ `: _Kim( P \ `5V`5PWUU_ nMٻ( vP + k: 1F0( 1P X55 WUU]PuUpUXUX_ |8p++ k::: p5u5 U5ՁU׏X5T5T_ +k*kkj++x88 `5UU5T5U5VTT55_"DD  *:k:**>D<| ` UP5UU@_VXUUT5W5W_D DD@  +jD"DDD  pP5UU`UUUPUU`VXUUTUXUX_8yD>8  +j "XP5UUP pW5X\~T~T_ f + k*jj  \ P5PX`XuuX\WW_ xx :+*ꁨkìkì 303333P5 `T5\5UXX5\5\_ 3033+*j:: fc0fff0uUWP5@uUuX5U`UxUx_ fc0f00:+:k@@nj0`UyP55U_@@ ??qxhu2L# *. ?b5_ UUS3j ?uUU-kFTT? ?:V- V< UUWuUUZ@?S=Ο j $x~ۿUUS@U uUUYk}j fPH&0up? UUW@U uUU| j jk UUS@U uUUuEwo j ߃G8 UUS@U uUU4. j  UUW@U uUUsjn>? j ]]UUS@UVUuUUY]iO j+YjN?}/^~UUW@UVUUuUU*m jJYjMhUUS@UVUuUUCw1  9OUUW@UV UuUUwƵ- j j:8oUUS@UV UuUUs,Mg j j __UUWV UuUU=  j~~z{߸UUSUUUV UuUU jUUWUUUV UuUU_ j?u~UUSUUUV UuUUߟƿ jξ[W UUWUUUV UuUU{?  jUUSUUUV UuUU- jOOWUUWUUUV UuUU߿? jm UUSUUUV UuUU~7 jKUUWUUUV UuUU%  j}_UUSUUUV UuUUW j \5UUWUUUV UuUU?w jʬػUUSUUUV UuUU / j UUWUUUV UuUU6 j7UUSUUUV UuUU j7UUWUUUV UuUU6 jUUSUUUV UuUU6 j1UUWUUUV UuUU6 j7UUSUUUV UuUU6 j7UUWUUUV UuUU6 j7UUSUUUV uUU6 j7UUWUUUV UuUU6 j7UUSUUUV UuUU6 j7UUWUUUW uUU6.UUSUuUU( UUWUuUU6UUSUuUU7UUWUuUU20UUSuUU*) UUWuUU UUSuUU67UUWuUU6)UUSuUU61UUWuUU3 UUSuUU67UUSuUU7UUXUUU6/UUWUUU7U77U%U73U'7UUWUW UU]U}UU_* D7UUUUEUU_" |?7UUU79U -9UW9 UUUUU ª#"UUUUWU %2UWU2 pZ]UUUWUU j*UUUUWUU?v|a*j"* *"uUUUU](Ѯ[%ګj*("((U]UUU]U]W}}DkS>:*(  "UUU]UUw< p* "( ("UUUWUWUU?a k,x~ **"* UuUUuU]UU w@;/6)w j  UuUWU \0v @( *" UWUUuUWUUUuU AQ@"@" 'UUU]UUTTE@T ꪠ( U]UU]U VuUEDDA"(0" # UCTP@T ꨨ ( (UuUU UQAQTP"  " >*( UWWU*]TE@E@DEU * (  UUWWU ]UPQUEU"@b" :" (*" UWUuU uEDuU]( ꂀ UWUUUWUUUUUUU D@EUu"" #" (U]U]U]UWU WUPATEPU}j   ( "(U]U]]UUuU ]U WU@UTT"(  " &" **U]UUUWU]WU(]UUU@UQxuz   " UuUUUUuU_WUWU [UQ]EUU_u"`" .*8U UuVU _UE@PUU  ꪮ**UWUWUWU UUAUDQUUU"" *.UUuwU ]U UUUUDUW, *UUUUU_UuuU WU _UUS@UuZDUU" $ " # UUUUU}Uuu_UUUWU]UAAT_UUUp L  @@ *(UUUUUuU]UuU U@UuUWUuDUUU" h  @ @ b2" "UUUUUu]UuU UU]UWU}WUUUWA HjH +UUuPAAAAAA5UUuWUUuUuU ]WTUUTUUW%U" AAAAAA " zꨪ*UuPAAAAAA5UUuWUA@5uU WU]U AAAAAA  @(UUUuUUu_UU` @UUUUU]UUUU]UU"!0*뮺뮺뮺뮺뮺몠?"b"'ꪫUUUuUuUuUUuUu]UUuUUUUu] `!*뮺뮺뮺뮺뮺몠*UUUUUuuuUUUuUu]]UUUUU_WW_U " ` AAAAAA 몺 "*/""ꮢ*UWu`AAAAAA5U_]UU____U] AAAAAA AʪȎUuUWuUUPAUUW_WUQUUU"0 j뮺뮺뮺뮺뮺뮪 AA"#."# U_uUV uUAUP UUUUUUEUUU@ȟU@AAAAA 5U@]uUWWUUuU]UU_UUUTE"@@AAAAA   ""2"*""."":UUUUAU@AAAAA 5UUUU]uUWWUUUU]UUWUU_UTU UUUUAUUuU]uU_UUU]U WU""" "@뮺뮺뮺뮺뮪A""&" #*UUUDPUUUUTAUUUWU UUUUQPUAAAAAA  UUUTU@UՀAAAAAA5U UUUU uU" ""AAAAAA 몀""" *UDEPEUDUU UUuU uUU뮺뮺뮺뮺뮺뮺H UDTTEU%uUVUUUUuU uUUUUEUT" " "#뮺 @@b"":" j *UTEUUQU UUUuUV@UuUU]U U( QADEDTUPQU U WUW]uuuU TU """ """ " # """#" !PEUEUQPUWU]U W]uuUUUUUEU  DTEDDQU W_U UWUuUTUMU  " "  ""&"PAUPUTU W_U ]UWU U "hPAQQETPTQPU-]UUUUUUUUUU  """ " $" ""$"""" (UUPD@UUUQU1UUUTQU "@tH*"UEPUUUTTUPU,]UUUuUUuUUU]UUEUT"" "" " &"""$ """"z"UUAPUPETEQU/uUUuUUUUU" TUUTUUDU7UT"""" " " &"""$ ""#UQUUEUDPUQUW"U]UUUP, UQUEU@UUTTEU,W]UUUUT{UUTUUUUP"b+"""" """" "" ",#" "UUUUUEUUUEUTUUEU,]UUUE]EATUUUUT耀-((UUEAAUUTEQTU,UWUTUU@TUQTUUUE#.7 "" " "  ",D,"""0**U]uEQUTEUUUUEETEU2TPTEUETЈȘ, UTEQUUPUUTU,wUUUTU@UPTP""""" """ " "-7"( * *UUUDUUTUTUT@U/WUUUAUUQETQ.UUUAQEUQEPAU/_UPUEUUQ"" """ "0&"?***UUUPTAQUEUUUwU-WQe1cEUUA@-긻ꪢ UUUE_QUAWUuU2T^]EeQUQPAE" ""#""":";"3o" UU]UUw]WuU34uuWTT@ 2~Ȫ UTEPU]WT]Uu_U2W}UE@"""~&{:*#v"'"4꺾*(*UUUWWWuuU6uw]UuT6ꪠUUPAUUWUWuuU6]uUUUUUUU""""""f2b3"6.ꪪ (UUPTDUUUUw_}U<TTȈ1ꪨ(**UWUUUU]U1uuUWUUU\TTAEUU"""""."1" TUUU]U5WWUWUUUqQ5ꢨQUuU5UUuUWUUUUrAUP""22"4#". @EQUU]U4WuWUUU]UUUTWDEAU4꾨*(* QUUU5uUUUVdDTT"2"3/.*"#b"EQUUU3_WU ^tAU4苪Ⱥ("*AQU4_UU_UUWUWTU "8#">PU@UDQUEU;U@QU: QUETPU:USDT""""""8/ **QUTUUUU6U \UU7 *"QDDUPEEU6_U__4ts~QA """ "" "뮯ꢲ:;(QEUTUTUQTUU1WwWwuUuwq5qt77⊿;?>>UEUU8_UWwW7wuup7tvAQ """ ""2:⪻0;:3((AUQUUQTU/uUWwwWWqU_?77E,ꪮj*) (PUUTUTUUUUUTEUUU)WUTDEU}UZ@UEEP " """" "(&**UETUUUEQUUUETPQUEU)UUEUAUUuEUPEUQPPxx|``f8<$||~`<`f8~#nnf`~`ff#f<>f<~<8f<<||<8~<<ff>><|<f8<ff8~#f~~f>~~8~~>~~~8~~~ff~~>~~~8~~ff8~#ff`ff|ffffffff`fff~~fff#ffpf>fff>`ffff~fpf>ffffff#f~<f~~f~~`f~~f~f~~~f<<~|~<#x>|x>><|>>`|><>ff>|>|>f<<>6><?~O|PUPPUPPUPPUPPUPPUPPUPPUPPUPPUP H0UPPUPPUPPUPPUPPUPPUPEUUUUD}UEEUUUWUEDUUU\DUDzDUUUq}UD~DUUUDUDDUUUU>U=BUUUDGDU=_U=UUWU=UUUU<UUTDOUUUUDUꪪUUUUQU@UUUUAjUUUUdDU@UUUUAꪪUUUUqUAUAUUUUDEUAUAUUUUQUAUAUUUUGUAUUUUAUUUUU "U8UUUUAUUUUDGUAUUUUAUUUUUAUAUUUVDOUAUAUUUWUAUAUUUTD_UAUUUAjUUUUUAUUUUAjUUU\DUA_UUU?IUUUY?UI?IUUUTDUIIUUUQUIJUUUdDUIJUUUqUJJUUUDEUJEUU>U=U|DEU<U<ꪪUW?U<}UUUU<U\DDD_U<UUUU<UqUU?UUUUU=WUUUUꪪDUDDUUUUGUDDWUUDD\DGUGUDDQUUDE_UUE 0UPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUPPUP.  D..  DETIKETT BAS F4QETIKETT BLD L}ETIKETT DT1 T26ETIKETT DT2 W3ETIKETT DT3 [4#GfABASIC<NOdP0P4P8P>PJPJPJPJPPPPJ#G J# Adress-Aufkleber drucken # J# - # J# (c) GEBRO, Reutlingen 1986 # J# (c) ROHO , Esslingen 1986 # J# Fr ATARI ST und Epson FX 80 oder kompatibleJ#G J# Adress-Aufkleber drucken # J# - # J# (c) GEBRO, Reutlingen 1986 # J# (c) ROHO , Esslingen 1986 # J# Fr ATARI ST und Epson FX 80 oder kompatible # J#G  #vL FvLFEF#EF#EF#EF#EF#EF#EF#EF#EFSEFSEFSEFSEFSEFSEFS EFS etikett.bld! F$(!!!F@'*!f!*DIESES PROGRAMM IST SHARE-WARE UND DARFF@'*!n!*BELIEBIG WEITERGEGEBEN WERDEN. ES WURDE INF@'*!v!*GFA-BASIC ERSTELLT. AUCH DER ZUM ABLAUFF@'*!~!*NOTWENDIGE RUN - ONLY - INTERPRETER DARFF@'*!!*KOPIERT WERDEN. BITTE SENDEN SIE DM 10,00F@'*!!*UND IHRE VERBESSERUNGS-VORSCHLAEGE ANF@'*! !*GERD BROGLIE|DUERRSTR.27|D-7410 REUTLINGENF@'*!!*JE MEHR ATARI ST- ANWENDER MITMACHEN DESTOF@'*!!*MEHR PROGRAMME DIESER ART WIRD ES GEBEN.F@'*!!*DIESES PROGRAMM SOLL NICHT DIE ETIKETTEN-F@'*!!*DRUCKROUTINE EINES GUTEN DATEI-PROGRAMMSF@'*!!*ERSETZTEN SONDERN IST FUER JENE FAELLE GE-F@'*!#!*DACHT, WO MAN SCHNELL MAL EBEN AUFKLEBERF@'*!'!*MIT EINZELNEN ANSCHRIFTEN BENOETIGT.F@'*!+!*WENN SIE AN O. A. ADRESSE ZUSAETZLICH EINEF@'*!/!*DISKETTE UND FREIUMSCHLAG SCHICKEN, ERHAL-F@'*!3!*TEN SIE DIE AKTUELLSTE VERSION. FF .SF EF*pp FYF\Y!@ "!ADRESS-AUFKLEBER DRUCKEN "B= " GEBRO & ROHO 1986FTY! "=Es werden zuerst einige Daten von der Diskette eingelesen ...F }F7i!M! etikett.dt1FF:M!F 8MF7i!M! etikett.dt2FF:M!F 8MF7i!M! etikett.dt3Fm:M!F 8MFYF*pp F EGpFdQ F Z ***F F }F   EF EF*DESK, Adress-Aufkleber-Erstellung: INFO &-" 51,2,3,4,5,6,"" -Setup, Absender verndern, Druckercode-Wandlung, Etiketten-Lnge,-,-Linker Rand,-Zweibahnige Etiketten,-, Setup auf Disk sichern,"" "Adresse, Anschrift eingeben,"" eVersandart, Warensendung, Drucksache, Brief, Einschreiben, Eilbrief, Pckchen, Paket, Wertpaket, Postkarte,- , Sonstige,"" ^Anzahl, 1 Etikett, 3 Etiketten, 5 Etiketten, 10 Etiketten,- , n Etiketten,"" 4Drucken, Probe-Ausdrucke, Aufkleber ausdrucken,"" @Quit, (c) = GEBRO 1986,-, Programm beenden,"" ***   F ^F, !F,FFvLFFLF! F  +FF8 !l " Adress-Aufkleber-Erstellung: INFOF,F-F FF* !  Absender verndernFe,FYF,F,F,FF FF, "   Druckercode-WandlungF,,FYF,F,F,FF FF& "T  Etiketten-LngeF, FYF ,F,F,FF FF. "  Setup auf Disk sichernFR,FYF,F,F,FF F* "  Anschrift eingebenFi,FYF,F,F,FF FF$ #:  WarensendungFcE WARENSENDUNGF ,FFF FF" #|  DrucksacheFE DRUCKSACHEF,FFF FF #  BriefF EBRIEFF,FFF FF$ #  EinschreibenFeE EINSCHREIBENF ,FEF FF $6  EilbriefFnEEILBRIEFF ,FEF FF $t  PckchenFEPCKCHENF ,FFF FF $  PaketF EPAKETF,FFF FF $  WertpaketF EWERTPAKET Wert = DM ____F,FWF FF %6  PostkarteFE POSTKARTEF,FFF FF %  SonstigeF }F,F$(!!!PFY!  "F,:$Bitte geben Sie die Versandart ein: !F }F,FFF FF" &&  1 EtikettFEF(,FF FF$ &f  3 EtikettenFE@@F(,FF FF$ &  5 EtikettenFE F(,FF FF$ &  10 EtikettenFE F(,FF FF$ '.  n EtikettenF,FYF ,Ft,Ft,FtF FF& 'b  Probe-AusdruckeF,FF FF, '  Aufkleber ausdruckenF , FF FF( '  (c) = GEBRO 1986F ,FFF FF( (  Programm beendenFi)@!Adress-Aufkleber drucken|B= L GEBRO und ROHO 1986|-|Wirklich zurck ins GEM ???!!Ja|Nein!F (F F (FF F F.FF F+FFYF $F }@F %!! F$!! !GF !@F%!! F$H!H!@ !Fd !F$H!H!@ !Fd$T!T! !Fd$\!\! !Fd$(!!!Fd6/ !4!y!Adress-Aufkleber druckenF$(!!!@FoX/ !\!y!9Dieses Programm bentigt einen ATARI ST und einen DruckerFFZ/ !p!y!;des Typs EPSO|N FX 80 (oder kompatible). Um sicherzustellen,FX/ !!y!9da Sie auf allen Druckern Umlaute darstellen knnen, istF,Z/ ! !y!;eine Code-Wandlung eingebaut, die bei Bedarf ein- bzw. aus-FX/ !!y!:geschaltet werden kann. Ihren Absender, Etikettenlnge undF\/ ! !y!>und den Status der Codewandlung knnen Sie auf Disk speichern.FT/ !*!y!6Diese Werte werden bei jedem Programmstart eingelesen.FZ/ !>!y!Bitte teilen Sie mir auch Ihre Erfahrungen und Anregungen mit.F$ ! !z!Fr$(!!!PFrZ/!!*!B=  GEBRO Hier anklicken B=  ROHOFF "!!FD 1!BISHERIGER ABSENDER:F$(!!!PFSY!` "Fs$(!!!FS&'`!!NEUER ABSENDER:FD$(!!!PFSY! "FN`|!F }F4)!Absender richtig?!!Ja|Nein!F 4ZFe2HFEF.F +FYF$$!!!FB$ ! !@ !8FB%!!F$ ! !@ !8FB$(!!!PFa`Y!@ "IDieses Programm bietet die Mglichkeit der eigenen Code-WandlungF`Y! "Ifr die deutschen Umlaute () an. Diese wird jedoch nur bentigt,F`Y!  "Iwenn Sie keinen Drucker mit IBM-Zeichensatz haben oder Sie vor diesemF`Y!@ "IProgramm kein eigenes Codewandlungs-Programm (z.B. im AUTO-Ordner)F`Y!` "Igeladen haben. Die dick umrandete Box zeigt die bisherige Einstellung an.F 7F!8)!Druckercode-Wandlung!!Ja|Nein!F 8F8)!Druckercode-Wandlung!!Ja|Nein!F F 8BFrEF 8TFEF FE.FE E+ FYF$$!!!F$ ! !@ !8FB%!!F$ ! !@ !8FB$H! !W!F$K!!U!F%!!F$H! !W!FB%!!F$K!!U!Fz%!!F$T!z!S!Fz$!H!1!\Fz$(!!!F('4! !Anzahl der ZeilenF $(!!!PFl>' !H!(Mit linker Maustaste auf Pfeil anklickenFX'p!!BWenn die richtige Etikettenlnge eingestellt ist, FERTIG anklickenF$!H!!\Fs$!H!'!\Fs$'!H!1!\Fs$T!z!S!Fs$(!!!Fs2'`!! FERTIG F$(!!!PFh'!Y!B F'*!Y!B@ F'!X!A F E FFFEFE "!!F 'H!!Sie haben die Versandart  gewhlt.F,F6)!Versandart richtig?!!Ja|Nein!FYF,F FFr,FF,F FF-E F,FF,FF F.F +FYF$$!!!FB$ ! !@ !8FB%!!F$ ! !@ !8FB%!!F$H! !W!FB$H! !W!Fr$K!!U!Fr%!!F$K!!U!F%!!F$T!z!S!F$!H!1!\F$(!!!Fr*' ! !Anzahl der EtikettenF$(!!!PFk>' !H!(Mit linker Maustaste auf Pfeil anklickenFP'*!!:Wenn die richtige Anzahl eingestellt ist, FERTIG anklickenF$!H!!\Fs$!H!'!\Fs$'!H!1!\Fs$T!z!S!Fs$(!!!Fs2'`!! FERTIG F$(!!!PFh'!Y!B F'*!Y!B@ F'!X! 2FEF E FFFEFE "!!F KJZFK"F { FN KHH\\F-5F FN L'11HH\\yy F-4F FD LZTTSSzzF EA FTE=@6 F'!X!FKF.F +FYFE@@FEFSEFSEFSEFSEFSEFSEFS EFSE VERSANDARTFFEAnredeFE Name ae=FE Zusatz oe=FE Strasse ue=F E9999FeEOrt AE= OE= UE=FE Zusatz sz=FU, FZ,FZ,FZEFSEFSEFSEFSEFSEFSEFSE FS,FFEF.F + F EAdress-Aufkleber drucken|F* EB=  GEBRO und ROHO 1986|F8 E-|F NFe$ EBitte erst Anzahl auswhlen!F9E    F$)@!!!Jawoll!Fe UFE F OF" EDRUCKER IST NICHT BEREIT!|Fb EBitte prfen Sie, ob|F" EIhr Drucker eingeschaltet|Fc" Eund auf ONLINE gesetzt ist.FE    F$)!!!Bereit!Fe F PFE F PDFx)!UWas soll das?|Der Drucker ist immer|noch nicht bereit!|Beim nchsten Mal gibts rger!!!Bereit!F F P|FE F PxF,F F F F;BX "C"B "FLinker Rand: 15 ;BX "l"Bp "FULEGF QBF@EF@,FFJ;Bp "BX "-"BD ""BXX "-"B@ "B F QFJ;Bp "BX "-"BD ""BXX "-"B@ "B F F;F QF EF ,FF;BX "!"B  "F QF;BX "!"B  "F F;F R6F EF ,FF;BX "!"B "F RXF;BX "!"B "F F R~F EF ,FF;FF RF ;Fb F SF RF EF ,FF;FF RF ;Fb F RF EF ,FF;FF RF ;Fb F SRF EF ,FF>;BX "!"B  "" "BXX "!"B "F  SF>;BX "!"B  "" "BXX "!"B "F F SF EF ,FF;BX "!"B "F SF;BX "!"B "F F U4F T"F EF ,FF;FF T,F ;Fb F;F TF EF ,FF>;BX "!"B  "" "BXX "!"B "F  TF>;BX "!"B  "" "BXX "!"B "F F UF EF ,FF;BX "!"B "F U0F;BX "!"B "F F F;B@ "F PF0;BX "l"B "B` "B` "Fu,F F.F +F$(!!!PF&'H!!Adress-AufkleberF$(!!!FS'z!!| F VzFF'z!!/ACHTUNG - ES IST NOCH KEIN ABSENDER EINGEGEBEN!FF VF 'z! ! ABSENDER:F'z!!F F.F +FF%!!F!$H!4!!=F$t!4!@ !=F"WE>G9HpF*!! Fj!! F WHF! $F$>!p!`!%F$>!H!`!HF$>!4!>!HF$`!4!`!HF$>!9!`!9F$>!9!>!=F$`!9!`!=F $@F$!4!t!4F$!=!t!=F$(!!a !Fe8'4!8!B=  GEBRO und ROHO 1986F.F +F$(!!!FS'f!! F'f!! F'f! ! F'f!! F'f!! F'f!! F'f!! F'f!! F'f!$! F'f!!F'f!!F'f! !F [F'f!!F'f!! F'f!!F [~F'f!!F'f!!F'f!! F'f!$!F F$(!!!@Ft'%!k! F \F>'%!k!'ANZAHL DER AUFKLEBER NOCH NICHT GEWHLTF_ \NF2'f!k!Anzahl der Aufkleber: A FH F.F E+FFEF^ EG6 FEF \?@ @ B FEBv F ^FBEF ]?@ @ B FEBx F ^FBEF ]^?@ @ B FEBz F ^FBEF ]?@ @ B FEB6 F ^FBEF ]?@ @ B FEB8 F ^FBEF ^B?@ @ B FEB: F ^FBEF ^?@ @ B FEB| F ^FBEF ^F#E?@ @ F FE FE FE FE FE FE FE FE \z F@EF@.FE L+FF [FYF^!!FmYF"Eb b b FEb b F_ EGFFQ FEb b FF _ F`EGpF  EF(~ !# !Fa _F {HF#z)!VCPU MC68000 damaged!|Please contact MOTOROLA,|Complaint Dept.|CA, Phone# 213-337-80015!!Confirm!F {HF%!!Fg$!! !GFa {HF3072 10752 256 53728 10232 2040 8190 8190 16383 16335 8142 8126 4092 2040 1008 192 { FFe.F + FF$ E Sie haben es geschafft ! |F$ E* FEHLER * FEHLER * FEHLER *|F$ E-|F E Fehler-Nr.: A F-E    F$)!!!Weiter!F8vL FF.FF ]!&@VYHUE(?@Ma8b> L _15F\\ #U TQ# @#U TD$H @#U TQ# @#U TD$H @U TQ @U TDD______DD_^^_^^^D____DDH @xU TQy @xU TDD^^^^D^^^^DD^^^^D^|^D^D^^D^DDH 着@xU TQy @U TDD_^____G_^^__^D____DDH @U TQ @U TDD_^__GGG_^^__^D____DDH @xxxU TQyyy @xxxU_ UTDD^^^^|^D^^^^DD^D^|^D^D^^D^|DDH @xU UTQy @U UTDD^^_^^___DD^^_^D^^____^^DDH @UUUUW UTQ @#UUUU_ UTD$H @#UUUUP UTQ# @#UUUUP UTD$H @#UUUUP UTQ  @ UUUUP UTD _____^D^D__D H @ UUUUP UTQ  @ UUUUP UTD ___E_^D^D__D H @ UUUUP UTQy  @x~ UUUUP UTD _^^_E____^~D H @ UUUUPUTQ @#UUUUPUTD$H@#UUUUPUTQ#@#UUUUPUTD$H@#UUUUPUTQ#@#UUUUPUTD^^~^D^DH@ ??????UUUUPUTQ ??????@ 3 33 3 UUUUPUTDsLssLDtLDH@ ? ?? > UUUUPUTQ ????@ ? ?>  UUUUPUTDwLwvLDGLDH@ 3 36 3 UUUUPUTQ 333? C@ 3 33? UUUUPUTDwLww^D^LDH@#UUUUPUTQ#@#UUUUPUTD$H@#UUUUPU_UUUTQ#ꪪ@#UUUUPUUUUTD$H@#UUUUPUUUUTQ#@UUUUPUUUUWUUUTDDDH@UUUUPUUUU_UUUTQꪪ@UUUUPUUUUUUUTDDDH@UUUUPUUUU`UUUTQW@UUUUPUUUU`UUUTDDUDH@UUUUPUUUU`UUUTQUUUUUWUUUW@UUUUPUUUU`UUUTDDUUUUUWDH@UUUUPUUUU`UUUTQUUU_UW@UUUUPUUUU`UUUTDDUWDH@UUUUPUUUU`UUUTQUW@UUUUPUUUUUUUTDDUWDH @UUUUPUXUUUUTQUW @UUUUPUXUUUUTDD]UWWDH @UUUUPUXUUUUTQcUX @UUUUPUXUUUUTDD]U`WWDH @UUUUPUXUUUUTQUU`UW @UUUUPUXUUUUTDDUU`UWDH @UUUUPUXUUUUTQUU`UW @ēĔpUUUUPUXUUUUTDDUU`TDPTTUWDH @4$444UUUUPUXUUUUTQUU`UW @UUUUPUXUUUUTDDUU`UWDH @UUUUPUXUUUUTQUU`UW @UUUUPUUUTDDcU D`XDH @UUUUPUUUTQcU`X @ UUUUPUUUTDDUU`$$$ UWDH @ UUUUPUUUTQUU` UW @ UUUUPUUUTDDUU`UWDH@UUUUPUUUTQUU`UW@UUUUPUUUTDDUU`0 UWDH@#SUUUUPUUUTQUU`t$$ $ UW@# UUUUPUUUTDDUU` !@ UWDH@cUUUUPUUUTQ]U`WW@UUUUPUUUTDDcU`XDH@UUUUPUUUTQ]U`WW@ $$ UUUUPUUUTDDUU`$ UWDH @"UXUUUUTQUU`c!C UW @ UXUUUUTDDUU`UWDH @UXUUUUTQUU`UW @UXUUUUTDDUU`UWDH @UXUUUUTQUU` UW @0 UXUUUUTDDUU`T#UWDH @$$$$ UXUUUUTQcU`# X @  $ UXUUUUTDDcU`cc`XDH @UXUUUUTQUU`UW @UXUUUUTDDUU`UWDH @UXUUUUTQUU`UW @UXUUUUTDDUWDH @UXUUUUTQUW @UXUUUUTDDUWDH @UXUUUUTQUUW @UXUUUUTDD]U_WWDH @U jUXUUUUTQU W @ UXUUUUTDDUUUUWWDH @ UXUUUUTQUWW @U _UUUTDDW_DH @U UUUTQ @U UUUTDDDH @U WUUUTQ @@U _UUUTDD@ DH @@U UUUTQ@  @@U `UUUTDD@ DH @@U `UUUTQ@  @@U `UUUTDD@ DH ꪪ@@U `UUUTQ@  @@U `UUUUTDD@ DH @@U `UUUUTQ@  @@U `UUUUTDD@ DH ꪪ@@U UUUUTQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@ U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@U TQ@  @@U TDD@ DH @@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH+@@+Q@   @@  DD@ DH  @@  Q@   @@  DD@ DH  @@  Q@   @@  DD@ DH  @@  Q@  ~ @@ ~ DD@ DH ~ @@ ~ Q@  x @@ x DD@ DH x @@ x Q@   @@  DD@ DH  @@  Q@   @@  DD@ DH#|@@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH+@@+Q@ +@@+DD@ DH @@ Q@  @@ DD@ DH @@ Q@  @@ DD@ DH @@ Q@  @@ DD@ DH @@ Q@  @@//// DD@ DH!( (( ((!((((H @!( (( ((((( Q#(/ /// @#!(( !((D$H!H(h(h(!(H((H`@#'//''/ Q# @# D$H @# Q# @# D$H @# Q# @# D$H #QKlaus Mustermann * Musterstr. 1 * D-9999 Musterstadt 12 0 .  a5..  aLEKTION1DAT c6\P640X200BAS g8HUPDATE01BAS mKxV640X400BAS pLRB71 72 72 abend evening abenteuer adventure acht eight binder linker buch book bus bus bcher books datei file drei three eins one eisenbahn railroad elf eleven essen eat fahren drive fahrrad bycicle frhstck breakfeast fu foot fuball football fnf five fe feet garten garden gehen go gucken look gummi gum halteselle busstop hart hard haus house insel island installateur assembler jetzt just kaugummi bubblegum kopf head lampe lamp land land lesen read lokomotive locomotive mantel trenchcoat mittagessen lunch morgen morning motorrad motorbike nehmen take neun nine park park pferd horse pullover pullover regen rain regenschirm umbrella reise journey rollschuhe rollerscates schreiben write sechs six see see sehen see sieben seven speichern save spiel game sprache language system system tanzen dance teller plate tisch desk trinken drink tr door tnzer dancer vier four weich soft wind wind wissen know zahn tooth zwei two zhne teeth bersetzer interpreter GfABASIC~E6F\FFFFG4G4G4GhHHHH . F<)!Install colour monitor !!!Schade!.F`F F&*  !HH !HH F*HH !HH F*HH ! HH F LBInfo, Vokabel Info ^J ,-,1,2,3,4,5,6,"" nDatei, Directory ^D ,-, Datei laden ^L, Datei speichern ^S,-, Datei lschen ^K,-, Ende ^E,"" "Funktion, Vokabeln eingeben ^A , Vokabeln ausgeben ^B,-, Vokabeln ndern ^C, Vokabeln mischen ^G, Vokabeln sortieren ^V, Vokabeln abfragen ^F,-, Vokabeln drucken ^M,"" ZOption, Auswertung ^N ,- . F<)!Install colour monitor !!!Schade!.F`F F&*  !HH !HH F*HH !HH F*HH ! HH F2 LBInfo, Vokabel Info ^J ,-,1,2,3,4,5,6,"" nDatei, Directory ^D ,-, Datei laden ^L, Datei speichern ^S,-, Datei lschen ^K,-, Ende ^E,"" "Funktion, Vokabeln eingeben ^A , Vokabeln ausgeben ^B,-, Vokabeln ndern ^C, Vokabeln mischen ^G, Vokabeln sortieren ^V, Vokabeln abfragen ^F,-, Vokabeln drucken ^M,"" ZOption, Auswertung ^N ,-, Denkpause ^O, Backupcopy ^H,"",""  L EG FeQ F  F L F L$!!  !F%@!!F$! !  !HF$(!!!@F^)!4 I N T E R S O F T | | (c)| 0093/1986!! Start|Abbruch!F dFT>)!Abbrechen ?| |Ganz sicher ?!!Nein|Ja!F `Fd`F F F LvLF,vL&F LFFF L+FFE F  PFn,'F F' '  Fn,"F F" " Fg,F F  $Fl,F F  D(Fg,F F  d0F,F F  PFg,F F  `Fg,F F  Fg,F F  0Fg,F F  @Fg,F F  $XFn,F F  DhFn,F F  dFn,F F  Fn,F F  HFg,$F F$ $F.F +&FE` F  Zeit: 8F'1!>!F"/!!!EndeF pEGHFY!H "F` ! F"Y`!H "F` ! F" FESF "!!F"ETag: ~ <>  Zeit: 8FFP XZ--BP FF ETag: ~ <> Zeit: 8F'1!>!FY!H "  FY`!H "  F D pZ--F  T  FEF E F FE  E F%!!F0n!\!n !dF0n!p!n !xF$(!!!F- EA F'!`!F'!P!F$(!!!@F- E tF!EFE F `)!5Vorschlag !| |Speichern Sie jetzt|auf Ihre Diskette !!!Weiter|Lschen!FF FgT)@!1Speicher lschen ???| |Sind Sie wirklich sicher ?!!Nein|Ja!F FnEGF  EF  EF xF EFEFEF F F [F .F +F eF"\!Directory auf FX-80Fud)!0Directory auf den Monitor|oder auf den Drucker ?!!Monitor|Drucker|Abbruch!F FoT)!(A: Laufwerk 1 | |B: Laufwerk 2!! A | B |Abbruch!&F J&Fa4\!%> Keine Eingaben in den Fileselctor Keine Eingaben in den Fileselector #   F<)!Keine Vokabeln im Speicher !!!Ok!(F FEFEF EFEF%!!Fe$p!x! !Fo$j!p!@ !Fo%!!F$l!t! !FovLF "Y! " Vokabel: "F` ! FY! "4 F >EGF   FF(Y! " " --> " FEFDEF EFF F 4  F"(Y! " " --> " FEFEF EFF F hF!    F4Y! " " --> " FEFEF EF FE E >  F4Y! " " --> " FEFEF EF F   FFT)!0Diese Vokabel ist|im Speicher nicht|vorhanden...!!Abbruch!FEF FEa F FE |FY! "  F F.F L+FFT)!0Diese Vokabel ist|im Speicher nicht|vorhanden...!!Abbruch!FEFF.FF +F > #   F,F PF !F%!!F$!!  !HF F Y!  " F&Y!  " -> " F*Ea F^)!>Das waren alle Vokabeln|aus dem Speicher !| |(leider nur eine)!!Ok!F LF EGF4F  FF "!!F @ZF F%!!Fr$!!  !HFoEF FEY!  " "FY!  " -> " F F!F "!!F ZF FJ)!*Das waren alle Vokabeln|aus dem Speicher !!!Ok!Fn F F EF !F.F +F<)!Keine Vokabeln im Speicher !!!Ok!F.F  +F eF\!Vokabel ndernF EF,FF.   F   F F&Y! " Vokabel: " F F F"(Y! " Vokabel: " F F%!!F$p!,! !JFo$j!(!@ !FFo%!!F$l!*! !DFo"Y@! " Neu : "F` ! F   F  E F F   F  E F F F  E F F F F [F.F +FEF#EF!EFEFEF eF \!Vokabeln abfragenF .   Fd:)!Keine Vokabeln im Speicher!!!Ok!F Fv)!NWie mchten Sie abgefragt werden ?| |Deutsch - Englisch ?|Englisch - Deutsch ?!! D - E|E - D!F tFcEF FER)!+Wieviele Vokabeln|sollen abgefragt|werden ?!! Alle|Einige!F Fl%!!Fe$*!x!k!Fo$'!p!i!Fo%!!F$(!t!i!Fo8Y!H "Nicht mehr als "": "F`@! F E5 F%!!F$!!  !HFo  FEF F 8FEF FE EEGF ~FF E F E F F E F E F FE%!!Fe$p!x! !Fo$j!p!@ !Fo$p!,! !JFo$j!(!@ !FFo%!!F$l!t! !Fo$l!*! !DFoY! "  FY@! "  F$Y! " Frage : "F"Y@! " Antwort : "F` !F FEFa4)!Das ist RICHTIG !!!Weiter!F  FEFa4)!Das war FALSCH !!!Weiter!F  F PF!  F $ h  FT)!4Abfrage ist beendet !| |Ergebnis unter 'Auswertung'!!!Ok!FF F [F.F +F.   F<)!Keine Vokabeln im Speicher !!!Ok!(Fb ÊF^)!7Es werden alle Vokabeln aus|dem Speicher ausgedruckt...!! Ok|Abbruch!F ÆFd;BX "B  "FF;  " INTERSOFT (c)F;FR;VOKABELLISTE VOM: "~", "8" "" VokabelnF|;BX "B  F;BX "B F;F\'EGF ; "' "4 "' F 2'Fu;BX "B  "F;B@ "F F F.F +FvLF#E%#H # Fu"E%#H # F"!E%#H # F% eF\! AuswertungF %!!F$H!H!! Fo$H! !!HFo$H!\!!Fo$H! !! Fo$*!H! ! Fo$H!4! !Fo%!!F$L!P!!Fo$L!$!!DFo$L!`!!Fo$L!!!Fo$*!P!@ !Fo$L!6!@ !Fo%!!F$!!/!Fo$!!-!Fo%!!F$!!-!Fo0/\!!!Zeit: ~ 8Fr8/\!@!!Vokabeln richtig: A F8/\!|!!Vokabeln falsch : A F@/\!!!Vokabeln gesamt : A FFF$(!!!pFb /H!z!!A$ F / !z!!A$ F$(!!!@FbFE "!!FD Z--FɀF |FEFEFEF!EF [F.F +FF:)!Keine Auswertung mglich !!!Ok!F  F.F  +F eF4\! PausenfllerF%!!F$!!  !HFoF "!!Fr Fs!F F .ZFsFF [F.F +"F eF4\! BackupcopyF%!!Fh$!!p!k!%Fo$"!!j!$Fo%!!F$#!!j!#Fo%!!F$\!!R!8Fo$Z!!Q!4Fo%!!F$[!!P!2Fo.Y !@ "Ihre Sicherheitsnummer:FY0!  "F`!F%@!!Fe$!!  !HFi 244HJ00KlF\)!5Backupcopy auf Laufwerk A!| |Nur fr Eigengebrauch...!! Ok|Abbruch!)F )FvL#FoA:\Vokabel.basF F |F%@!!F$!!  !HFi F [F4.F + F Δ HF $EDas war wieder sehr schlecht!F$E F FE H FS"E Auch noch nicht das Wahre!F$EF FE 8  **FS"E Das war ja schon fast GUT!F$E@@F FE ό* >>FS$E Gut gemacht, nur weiter so!FF$EF FE >F$EDas ist echte SPITZENKLASSE!FF$EF FE.FE +#FFf)!BHandlingfehler !| |Laufwerk A in Betrieb ?|Diskette im Laufwerk ?!!Abbruch!F F.F  F+$Fh!F nFnEGFFEV F иZ FЎF E Fn  E Fn ЊF,EGF E F E  F  EF   EF FF:)!Mischvorgang ist beendet !!!Ok!/FB ѨF6)!Mischen nicht mglich !!!Ok!/F F.F$+'F Fn'EGFiE' FE;@ F L7 BFE7 FEB =@6  F FE ' EF' E' F ' E'F (E'GHFh" Z( ( F 0E( F( E( F( E0F Җ(F 'F\'EGF ' E' F ' E' F 'Fӄ'EGF ' EF p'F6)!Fertig mit sortieren !!!Ok!/F F8)!Sortieren nicht mglich !!!Ok!/FF F.FF@ $  |,Ø~ 0LH\ѲzGfABASICdABCA%!!Fe$!!  !HF%!!F$H!H! !F%!!F$\!\!@ !F%!!F$!!*!F !@F'!!OkFVY !  ">1. Bei Ausgabe aller Vokabeln zum Weiterblttern nicht mehr CRFBYP!@ "+oder eine andere Taste, sondern Mausclick !FVY ! ">2. Das Programm luft nur mit GfA-Basic der ersten Stunde, an-FTYP! "FF`F F&* ! HH !HH F*HH !HH F*HH !HH FBINFO, Vokabel Info ^J ,-,1,2,3,4,5,6,"" DATEI, Directory ^D ,-, Datei laden ^L, Datei speichern ^S,-, Datei lschen ^K,-, Ende ^E,"" -FUNKTION, Vokabeln eingeben ^A , Vokabeln ausgeben ^B,-, Vokabeln ndern ^C, Vokabeln sortieren ^X, Vokabeln mischen ^G, Vokabeln abfragen ^F,-, Vokabeln drucken ^M,"" OPTION, Auswertung ^N ,-, Denkpause ^O, Backupcopy ^H,-, Hilfe  [X Ft8)!Install Monitor SM124!!!  !>FF`F F&* ! HH !HH F*HH !HH F*HH !HH FBINFO, Vokabel Info ^J ,-,1,2,3,4,5,6,"" DATEI, Directory ^D ,-, Datei laden ^L, Datei speichern ^S,-, Datei lschen ^K,-, Ende ^E,"" -FUNKTION, Vokabeln eingeben ^A , Vokabeln ausgeben ^B,-, Vokabeln ndern ^C, Vokabeln sortieren ^X, Vokabeln mischen ^G, Vokabeln abfragen ^F,-, Vokabeln drucken ^M,"" OPTION, Auswertung ^N ,-, Denkpause ^O, Backupcopy ^H,-, Hilfe ^Z,"","" ^b EGFMQ F ^P F F%!!Fe$!!  !HF^)!4 I N T E R S O F T | | (c)| 0093/1986!! Start|Abbruch!F `FTj)!EAbbrechen ?| |So gut sind Sie noch nicht!|ben Sie lieber ein wenig !!! Okay|Nein!F `Fdb)!9Na, wenn Sie Meister sind...| |Dann brechen Sie eben ab !!! Nein|Abbruch!FN `Fn`F F F FvLF,vL&FFF`,F+FFE F `hHFl,)F F) `Fl,(F F( ` Fl,"F F" `Fn,F F `Fl,F F `(Fn,F F a0F,F F a,PFn,F F aH`Fn,F F adFn,F F a0Fn,F F a@Fn,F F aXFl,F F ahFl,F F aFl,F F b Fl,F F b(PFl,$F F$F.F+&F&E` F b`4` Fl,)F F) b|( Fn,(F F( b( Ff,F F b Ff,F F b0 Ff,F F bx Ff,F F c, Ff,F F' c$( Ff,F F c@p Ff,F F c\@ Ff,F F cx8  Ff,F F c Ff,$F F$ c Ff,F F cH4 Ff,F F cD8 Ff,F F d@x Ff,F F d   Ff,"F F.F+F:)!Sie wollen aussteigen ?!!Ja|Nein!F d~Fm`F F.F+Ff)!F  I N T E R S O F T  | | (c)| 0093/1986!!Ok!FFT)!5Marco Meyer|Gerhard-Rohlfs-Str.54c|2820 Bremen 70|BRD!!Ok!F.F+F eF \!Vokabeln eingebenF %!!F9$H!@! !FD$H!@! !rFC$*!*!f!HF$r!\! !hF$r!p! !|F$!!/!Fx$B!4!@ ! FD$B!:!@ !lFC$'!'!d!EF$l!Z! !fF$l!n! !zF$!!-!F%!!F$D!8! ! FD$D!<! !jFC$(!(!d!DF$n![! !eF$n!o! !yF$!!-!F%!!F0n![!n !eF0n!o!n !yF$(!!!F EA F'!`!F'!P!F$(!!!PF Y!` " DEUTSCH :F Y`!` " VOKABEL :F$(!!!@FETag: ~ <> Zeit: 8F'1!9!F$(!!!PF"/!!!EndeFm0EGHFY!H "F` ! F"Y`!H "F` ! F"FESF "!!FP jZ--BP FjzFETag: ~ <> Zeit: 8F$(!!!@Fb'1!9!F$(!!!PFbY!H "  FY`!H "  FD m0Z--F l  FEFF E FF FE E F%!!F0n![!n !eF0n!o!n !yF$(!!!F EA F'!`!F'!P!F$(!!!PF j&F!EFFE F`)!5Vorschlag !| |Speichern Sie jetzt|auf Ihre Diskette !!!Weiter|Lschen!FF nFgT)@!1Speicher lschen ???| |Sind Sie wirklich sicher ?!!Nein|Ja!F nFnnREGF  EF  EF n4F EFEFEF F F [F.F+F eF"\!Directory auf FX-80Fud)!0Directory auf den Monitor|oder auf den Drucker ?!!Monitor|Drucker|Abbruch!F pfFoT)!(A: Laufwerk 1 | |B: Laufwerk 2!! A | B |Abbruch!&F o&Fa4\!%> Keine Eingaben in den Fileselctor Keine Eingaben in den Fileselector !Y!Fe%!!F$D!@!Y!Fe6/\!z!!Directory wird gedruckt!F rtFWa:*.*Glst:F;BX "B  F4; DIRECTORY: -Laufwerk A- TAG: "~" ZEIT: "8F;F ;BX "B  "Fr;B@ "Fs;BX "B "Fr F s(FWb:*.*Glst:F;BX "B  F4; DIRECTORY: -Laufwerk B- TAG: "~" ZEIT: "8F;F ;BX "B  "Fr;B@ "F;BX "B "Fr F F F |FF [F .F+%FFT)!4Fehler !|Diskette im Laufwerk ?|Laufwerk in Betrieb?!!Ok!+F F.F +Ffa:\*.*!!F tF|FvLF7I!M!F8F7I!M!F:M!F:M!F:M! Ftp EGF:M! FF:M! Fn tB F!|F 8MF tB F4)! | |ist geladen !!!Ok!3FF FBEFF FE.F+FBEF!l)!@Handlingfehler!!!| |Diskette im Laufwerk ?|Datei ist vorhanden ?!!Nochmal|Abbruch!F uFnF uFFF F.F+F. v  F<)!Keine Daten im Speicher !!!Abbruch!F w|Ffa:\*.*!!Fe wxF|FvL F7O!M!FM!FM!FM! Fv EGFM! FFM! FF v F 8MFD)!Vokabelspeicher lschen ?!!Lschen|Weiter!)F wt)FlwF EGF  EF  EF w( FEF EFEFF F F F|F.F+ FF~)!SHandlingfehler!!!|Laufwerk in Betrieb ?|Diskette im Laufwerk?|Diskette nicht voll ?!!Nochmal|Abbruch!F x*FnF x@F 8MFFF F.F+F|FvL Ffa:\*.*!!Fe xFAF F|F%!!F$!!  !HF.F+ FFl)!AHandlingfehler!!!| |Datei ist vorhanden ?|Diskette im Laufwerk ?!!Nochmal|Abbruch!F y\FuF yfFF F.F+F eF \!Vokabeln ausgebenFl^)!.Wie mchten Sie die|Vokabeln ausgeben|lassen ?!!Alle|Einzel|Abbruch!FwL!!F [FG.F+F.F+F> z#   F<)!Keine Vokabeln im Speicher !!!Ok!(F ~xFEFEF EFEF%!!Fe$p!x! !Fk$j!r!@ !Fk%!!F$l!t! !FkvLF "Y! " Vokabel: "F` ! FY! "4 F|EGF |Z  FF(Y! " " --> " FEFDEF EFF F |  F"(Y! " " --> " FEFEF EFF F {F! }F  F4Y! " " --> " FEFEF EF FE }  F4Y! " " --> " FEFEF EF F ~> FFT)!0Diese Vokabel ist|im Speicher nicht|vorhanden...!!Abbruch!FEF ~PFEa F FE|FY! "  F F.F+FFT)!0Diese Vokabel ist|im Speicher nicht|vorhanden...!!Abbruch!FEFF.FF+F> @#   F,F F%!!F$!!  !HF >F Y!  " F&Y!  " -> " F^)!>Das waren alle Vokabeln|aus dem Speicher !| |(leider nur eine)!!Ok!F F ^EGF4F  FF "!!Fa8 Z-FsnF ZFEF FEY!  " "FY!  " -> " F T  FY!  " FEF F RF!F "!!F Z*FLbFJ)!*Das waren alle Vokabeln|aus dem Speicher !!!Ok!Fn F FEF.F+F<)!Keine Vokabeln im Speicher !!!Ok!F.F +F eF\!Vokabel ndernFEF,FF. ~  F z F F&Y! " Vokabel: " F F <F"(Y! " Vokabel: " F F%!!F$p!-! !KF$j!*!@ !HF%!!F$l!+! !GF"Y@! " ndern : "F` ! F 6 F  E F F \ F  E F F vF  E F F F F [F.F+FEF#EFA!EFAEFAEFAEFA eF \!Vokabeln abfragenF.   Fd:)!Keine Vokabeln im Speicher!!!Ok!F 6Fb)!:Abfragemodus... | |Deutsch - Vokabel ?|Vokabel - Deutsch ?!! D - V|V - D!F  FcEF FER)!+Wieviele Vokabeln|sollen abgefragt|werden ?!! Alle|Einige!FJ)!&Richtigstellung bei|falscher Antwort ?!!Ja|Nein!9F Fl%!!Fe$*!x!k!Fe$'!r!i!Fe%!!F$(!t!i!Fe8Y!H "Nicht mehr als "": "F`@! F E5 F%!!F $!!  !HFe FEF F FEF FE2EGF ZFF E F E F rF E F E F FE%!!Fe$p!x! !Fa$j!r!@ !Fa$p!-! !KFg$j!*!@ !HFg%!!F$l!t! !Fa$l!+! !GFgY! "  FY@! "  F$Y! " Frage : "F"Y@! " Antwort : "F` !F jFEFa4)!Das ist RICHTIG !!!Weiter!F  (FEFa 9Fg4E)Das ist FALSCH !|Richtig wre gewesen:| |FE$)!!!Weiter!F| $F94)!Das ist FALSCH !!!Weiter!:F F F ,F! F$   FT)!4Abfrage ist beendet !| |Ergebnis unter 'Auswertung'!!!Ok!FF F [F.F+F. :  F<)!Keine Vokabeln im Speicher !!!Ok!(Fb F^)!7Es werden alle Vokabeln aus|dem Speicher ausgedruckt...!! Ok|Abbruch!F Fd;BX "B  "FF;  " INTERSOFT (c)F;FR;VOKABELLISTE VOM: "~", "8" "" VokabelnF|;BX "B  F;BX "B F;F'EGF ; "' "4 "' F x'Fu;BX "B  "F;B@ "F F F.F+FvLF#E%#H # Fu"E%#H # F"!E%#H # F% eF\! AuswertungF%!!F$H!H!! F $H! !!HF $H!\!!F $H! !! F $*!H! ! F $H!4! !F %!!F$L!L!! F $L!"!!FF $L!^!!F $L! !!F $*!L!@ !F $L!5!@ !F %!!F$!!/!F $!!-!F %!!F$!!-!F 0/\!!!Zeit: ~ 8F 8/\!@!!Vokabeln richtig: A Ft8/\!|!!Vokabeln falsch : A Ft@/\!!!Vokabeln gesamt : A FFF$(!@!!F /H!z!!A$ F / !z!!A$ F$(!!!PFnFE "!!FD Z--F!F |FEFEFEF!EF [F.F+FF:)!Keine Auswertung mglich !!!Ok!F  F.F +F eF4\! PausenfllerF%!!Fu$!!  !HFiF "!!Fr HFs!F F dZFsFF [F.F+"F eF4\! BackupcopyF%!!Fh$!!p!k!%Fi$"!x!j!$Fi%!!F$#!!j!$Fi%!!F$\!!R!8Fi$Z!!Q!6Fi%!!F$[!!P!5Fi.Y !@ "Ihre Sicherheitsnummer:FY0!  "F`!F%!!FS$!!  !HFi ANDREA!!F\)!5Backupcopy auf Laufwerk A!| |Nur fr Eigengebrauch...!! Ok|Abbruch!)F )FvL#FoA:\Vokabel.basF F |F%!!F $!!  !HFk F [F4.F+ F  HF $EDas war wieder sehr schlecht!F$E F FE H FS"E Auch noch nicht das Wahre!F$EF FE f  **FS"E Das war ja schon fast GUT!F$E@@F FE * >>FS$E Gut gemacht, nur weiter so!FF$EF FE >F$EDas ist echte SPITZENKLASSE!FF$EF FE.FE+#FFf)!BHandlingfehler !| |Laufwerk A in Betrieb ?|Diskette im Laufwerk ?!!Abbruch!F F.F +$Fh!F FEGFFEV F Z FF E F E F FREGF E F E F  EF  EF F:) {!Mischvorgang ist beendet !!!Ok!8F F6)!Mischen nicht mglich !!!Ok!8F F.F+(F eF\! INTERSOFT FP%!!Fe$H!p! !%Fa%!!F$L!x!@ !$Fa%!!F$\! !@ !"Fa$`!! !"Fa%!!F$d!! !!Fa%!!F$p! ! !pFa !@F,'p!`!PUBLIC DOMAIN SOFTWAREF !FV'! !@Glckwunsch zum Erhalt dieses Programmes. Die Bedienung ist, daFV'!@!@voll GEMorientiert, kinderleicht. Die einzelnen Menus sind durchFV'!`!@Mausoperationen und Tastenkombinationen erreichbar. Sollte trotzFV'!!@der unserer Meinung nach guten Benutzerfhrung doch nicht allesFV'!!@klar sein, und Sie wollen alle Tricks des Programmes kennen oderFV'! !@eine Copy ziehen oder das Listing studieren.... dann wenden SieFV'!0!@sich an unten stehende Adresse.Zuschriften mit frankiertem Rck-FV'!@!@umschlag, formatierter Diskette (1 S) und -wenn Sie wollen- 20DMFV'!P!@fr den Programmierer. Update-Service ist selbstverstndlich...F%!!F$R!k!@ !FS%!!F$H!f! !FS$(!!!@Fm2'H!!MARCO MEYER  INTERSOFT F0'H!!GERHARD-ROHLFS-STRAE 54cF*'H! !2820 BREMEN 70 BRDFE('H!!TEL.: 0421 6589278F%!!F$W! !z!F9 !@F'a!!OkayF !F$(!!!PF F "!!FD ZWWzz FlF [F~)!^Fr die 20DM gibt es dann auch|die Version fr Farbmonitore !| |Ohh, ja! DIE mssen wir haben!!!Ok!;FF.F(+)F F'EGFE' FE;@ F (7 BF>E7 F>EB =@6  F FE  ' EF' E' F ' E'F (E'GHF" Z (  ( F d*deLnsuxJ xwtyp~ z(z~F jzz sLb6.  ya..  ySELECTORBAS zbGfABASIC>>`z   RxSzPv*Zll BIYXXTHENKJNLTHENKBH3PRINTWIRDGELADENFFEOFCAATEI SELEKTIERENRNDLDRDNTZDA1DAET94LLLL1LLLFHBI1HIBI2HIBI3HIBI1DSPTTWRITTENINGFABASICAZNF3F0F1LOPPYMZHAH1H2H3H4H5T1L1H6DXIT2H7H8DNDTL2T4T3H9FT5T9CSST6T7T8T10L3L4T11T12MNMMMDDADDMALWEBANNNNDADDNLH10NDLNDNADNUZLLFLDDTT13H11NDTMTTBEEXISTMNNTCHRXIYZJKLOUADSZNNMFFL1LLNNTLDISLSKTTEXDLHHUFDHHMUMUMSPHWFDDSNDSWVTFMLBDFHBSCHYHGGRNDLAFDSPGDECXADDZADDLADDNDIVTDTEQATPRINTATATATEMLENVALARDIVNFEMSSEMDPRINTCHRNMFMARKEZEICHENDEAHMWLBZNSGANFANGSTATUSMENUEPROGRAMMSUCHENAUSGABEEINGABEMASKE SELEKTIERENQUIT DATEINAMEDATUM DATEINAMENSPEICHERANZEIGENNEUALTLADEN SPEICHERNMDISKSDISKLDISKINHALTDRUCKENFELDNUMMERWARTENHIERANDERNLOSCHENWEITERWIE SATZNUMMERSATZGENAU BERICHTIGENA1FLOPPYNUNWOENDESCHLUSS UMBENENNENDISKHALTL1LL1L2A3A2B1N5E1N1E2N2N4N3NM1NM2DSSLDIRNDLFSANFSCLUSSWWHHNNNNNFFFHHHNTDYDIREKT VERZEICHNISDNLDATALTWEGUNTERHILFEHAUPTNAMENMDTNWANNWWWTTTSELMENDIMENDISKMENHAUPTMENHAUMENNDSTEILTEIL5TEIL6TEIL4TEIL3EIN2EINS3EINS2EINS31EINS4EINS5EINSEINS6EINS7EINS8ANDZURUCKWEITGABE2GABE3GABE4GABE5GABE6GABE7KKLIST2BLATT1BLATT2BLATT3BLATT4EINS9ANEDSNNTEDFSDRUFDTNTEGTTT1TTT2TT3TTT3KKKTT2TT1TTT4DSLDTEGSDFDNNDLTT4DSAGSD2DFTDMTDSTDTLEMLTEIL7NETFEMUAUSGGGHIBIHIBI1HIMIHIBI2HIBI3HIBI4TXTLLL1MEGMEDMEKDAEDEGLLLDATLADATNDATEBZWLWLWW520KLSPEMSPIDNDANGABE9FRSPNDSTENDEDDDATEDAAABBRFRHSDTMDTTDNNEINS10DZLNEMFDTEIMDEINDTLDDTSNUMKDATSOAZNALMNDSTZTETEDL1LL1DFTLADENDNNHIBI1stringzuweisungen $E S E L E C T O R F""EF l o p p y U s e r >>>F$EH a u p t - M e n u e >>>Fs Eund eine Taste drcken...FE Dateiende F E Keine Datei vorhanden F*E#bitte richtige Diskette einlegen...F.E'Bitte die entsprechende Taste drcken :F"E bitte eine Taste drcken FXEP-PFH$EA| Eingabemaske | mit 'e' Eingabe beendenF: E2 2FLVEO OF.!E' 'F-F.|Feingabemaske n W0JFDY`!@ "BX "p" Eingabemaske ist vorhanden "FBX "qF {F6Y`!@ " Ft-F FY! "FnY@! "$Fe YP! "Seite :F Yx! "1FY!0 "FF,Y8!0 "BX "p"( + )"F"BX "qF,Y!0 "BX "p"ndern"FBX "qF,Y\!0 "BX "p"Menue"FFBX "qF|F* F EFFEFFn|FEFZ F"4F4F4 FY!@@ ">"F "Y!@@ "< " F|F6Y!@@ "F`P! F Y`6 JF-F6 F Z; @ eJF 5FEF Y@JFF FEFY `F"4FY! "!FYF-F F->F; F> ZZF"XF>|FFFESF Z*F Z+JF ZbJF->F FEEFZ F34FY! "!FZpFYx! " FYx! "2F-nF Fn ZJF-?F F [mJFEMaske speichernF$)!!!JA|NEIN!F [nJFEF-pFF [FF FEF-F F FZ&F?|F,Y!@ "Welche Zeilen-Nr. : "F`!FY!@ "< " F|F6Y!@ "F`P! F" \6 JF-F6 FY!@ " F  ]B JF6Y! @@ " F Y! @@ " F ]F 6Y! PP " FnY! PP " F F->Fp|FEF] F34FY! " F]FEFY! "FnY!0 "F>Y0! "&>>> Eingabemaske kontrollieren <<Y!( "FY!0 "F,Y`!0 "BX "p"Floppy"FBX "qF.Y!0 "BX "p"Eingabe"FnBX "qF2YP!0 "BX "p" Vorw./Rckw."FBX "qF0Y$!0 "BX "p" Bearbeiten"FBX "qF*YX!0 "BX "p"User"FBX "qF,Yt!0 "BX "p"Anfang"FBX "qF,Y !0 "BX "p"Hilfe"FFBX "qFY!8 "F|FY ! "X F $Y@! " Byt. frei |Ft$Yx! " Datei : "F|FEF$EFFFESF v0F vfJFE Daten sichernF,)!!!LADEN|SPEICHERN!F vJF-F vF- F F F w6eJFE DateneingabeF()!!! MASKE|DATEN!F w(JF-F w2F-FF F| F| w\vJF%EFF-F F wrJF/EFF-F F wbJFEF-F5 F wuJF-3F F3 x8aJFEDatei gespeichertF$)!!!JA|NEIN!F x*JF-aF x4F-F F F xPhJF-F Fv,F|F xJF&Y`!@ "BX "p""FBX "qF {FY`!@ "!F-F Fm|FF x$JF4F-F FEF|F0Y!@ "Bitte Text eingeben : "F`H!F yf6 JF-F6 F E6 F@Y!@ "F"*Y! " FF8Y! "BX "p" Daten ndern "F"BX "qFEF|F z6 JF1E@@F zHF1E F FE|F E6 F@EF { 'F z 1F4F. z?@ @@ ?@@ JF z$JF-F zF$-F? F FzrF {JF-FD F*4FF-FzfF-F|FEF{ F34F {|JFY! "F {FYh! " F  F{.F|FEFEF | F4F4FY!@@ " F |ZF3{F|FEF!EF EF | F4F4!F4 F"Yh!!@@ "@ F  |ZF3|HF|FEF!EF*|Fdaten ndern c |$JF-F FY!0 "F |F,YP!0 "BX "p"( + )"F"BX "qF,Y0!0 "BX "p"Menue"FFBX "qF.Yx!0 "BX "p"Drucker"FiBX "qF.Y(!0 "BX "p"Lschen"FiBX "qF,YT!0 "BX "p"Weiter"FBX "qF,Y|!0 "BX "p"ndern"FBX "qF&EF"Y@!@ " Satz-Nr. :FY!@ "&Ft$Yp!@ " Weiter mit :F JF-}F F}EFEF|FEF!EF  F4F4FY!@@ " F ZF3BF|FF  F4F4!F4 F"Yh!!@@ "@ F  ZF3F}|FY!@ " F FJFY!@ "M/WF bFY!@ "+F F|F 4JF 'JF&Y!  "BX "p""FBX "qF-F 0F JF&Y!  "BX "p""FBX "qF-F ,FEF FE F F}|FFFESF BF +JF zJF-F FEF F34FY! "F@F-F F $mJF JF-}F F&Y!  " FD-7F F bdJF JJF-}F FEF-%F F% lJF JF-}F F-+F F &wJF JF-F F JF-}F F FY!@ " FY!@ " F$EF-mFF F >JF-F F>F|F4Y!@ "BX "p"...Suchtext..."FBX "qFYX!  "> "F`H!BF 6B JF-F6 F E6B F EF  F4 F. Z?@ @@ ?B@@ F  JF@6Y!@ "BX "p"...kein Text..."FBX "qF {F-F FF?|F6  JFYh! @@ " FeYh! @@ "F `H!@ F XFYh! PP " F@Yh! PP "F `H!@ F F |6@ JF-F6 F  JF"Yh! @@ "@ F F"Yh! PP "@ FG F|F.Y!@ " FY!  "F -}F%|FFdaten drucken BY!  "BX "p"..Datensatz wird gedruckt.."FFBX "qF$; "Datensatz-Nr. : ""F;p " Datum : ">F;FEFEF B F4F4F; " "F;p "@ FFF;F;F;F4Y!  " Fd JF-WF F| JF-}F F+|Fdatensatz lschen BY!  "BX "p"..Datensatz wird gelscht.."FFBX "qFE&GFxEGF@ E@ F RF >F&&EFEEGF&@ EF F5FEF {F2Y!  " F-7FFK|Fspeicher lschen "EDaten gespeichertF$)!!!JA|NEIN!F JFXFpFE F-lFF Fl3|Ffloppy user YFY@!@ "Fu&Y$!@ "BX "p""FBX "qFY! "F 6Y !` "BX "p" D "BX "qF&YP!` "Directory ladenF6Y ! "BX "p" R "BX "qF(YP! "Datei umbenennenF"6Y !0 "BX "p" L "BX "qF$YP!0 " Datei lschenF6Y !P "BX "p" F "BX "qF$YP!P " Disk-SpeicherF6Y !p "BX "p" S "BX "qF(YP!p "Datei selektierenF6Y ! "BX "p" A "BX "qFYP! "AnfangF"6Y ! "BX "p" H "BX "qFYP! "HilfeFY!( "F Y@!0 "FFY!8 "FF$$!@!!F$!@!!F$ !R!'!'F ,Y0! "Dateiname : "F (Y0!  "Disk-Speicher : Fj|F EFFFESF F dJFEF-YF F$ rJFEF-YF F8 "lJFE@@F-YF F9 HfJFEF-JF@ F sJF 6 JF EF-F FYF-Ft F_ aJF-aF  F hJF-F F`FJ|FY0!P "Fn {HFY0!p " FFF; SFY0!p "!F 4Y0!p "Disk-Speicher wird ermitteltF< 3E5+ FYt!  "3 F"Y !  " Byt. freiFeY0! " FF SF-HF|Feingabemaske laden @ JFDY`!@ "BX "p" Datei ist schon vorhanden "FFBX "qF {FY`!@ "!F-F FY`!@ "F {HFY`!@ " FY`!@ " FF SFY`!@ "!F<Y`!@ "BX "p" Datei wird geladen "FBX "qF|FF (EdatF *E/mas.FE;@ F%E*(F7i!M!+:%Fi:M!'F:M!F:M!FEF* !'@ FEF & F4F:M! FFF 8MF j(JFY ! " F$-F tF(-FF F|FFdatei laden (E.datF )E(F7i!M!+:)F :M!F:M!FEF,EGF"EGF:M!@ F F F 8MF-IFH|FEF F4FY,!00 "!FRF-jF |Fidatei speichern  "JF&Y`!@ "BX "p""FBX "qF {FY`!@ "!F-F FY`!@ "F {HFY`!@ " FY`!@ " FF zSFY`!@ " F@Y`!@ "BX "p" Datei wird gespeichert "FBX "qF (E.datF )E(F7o!M!+:)F EFM!FM!FEGFEGFM!@ F jF VF 8MFI|FY`!@ "!F-FY|F:Y0!P ""Welches Laufwerk. A / BF|F6Y0!p "Fi`!8F J68 JF-F6 F fJF-F F JF- F F:Y0! ""Extension.dat/bas/prgFg|F6Y0! "F"`@!,F 6, JF-F6 FEFN F4FY,!00 "!FF jJF-8F FM @JF-^F FN JF-[Ft FL[|FtYF,Y! "Directory einlesen :F Y!@ FW8:*.,FY!@ " F F SFYF-3FS8|F(Y0!P "Alter Dateiname :F|F6Y0!p "F"`!-F 6- JF-F6 F(Y0! "Neuer Dateiname :F|F6Y0! "F`!.F 6. JF-F6 F (E.datF. 4E.(F 5E-(F7o!M!8:5FS 8MF@8:5l8:4F-HF/^|F.Y0!P "Welche Datei lschen :F|F6Y0!p "F`!1F 61 JF-F6 F>Y0! "BX "p" Datei wird gelscht "FiBX "qF (E.datF 3E1(F7o!M!8:3FS 8MF A8:3F {HF-HFa|Fhauptmenue tYFaY@!@ ""F&Y$!@ "BX "p""FBX "qFY! "F 6Y !` "BX "p" N "BX "qF4YP!` "Dateiname / Datum / LaufwerkF6Y ! "BX "p" L "BX "qF(YP! "Speicher lschenF 6Y !0 "BX "p" S "BX "qF(YP!0 "Daten selektierenF6Y !P "BX "p" U "BX "qF"YP!P " Floppy UserF6Y !p "BX "p" H "BX "qFYP!p "HilfeF6Y ! "BX "p" X "BX "qF$YP! " Programm-EndeFY!( "F Y@!0 ""FY!8 "FF$$!@!!F$!@!!F$ !R!9!GF *YD! "Dateiname : "F*YD!  "Datum : ">F*YD!@ "Floppy A/B : "+Fl|F EFFFESF F nJF-F F lJF-KF FK sJF  6 JF EF-F FYF-F  F 0uJF-3F  F3 HhJF-FF F` xJFE Programm-EndeF$)!!!JA|NEIN!F JFF F-lFF F FlF|FEDateiname fehltF$)!!!RETURN!F " JF-lF ,F-jFF F|FY! "F`!F t6 JF-F Fd|FY!  "F` !>F 6> JF-F F|F6Y!@ "F`!+F 6+ JF-F6 F-lF|FYF|bY ! "BX "p"< >>>> S E L E C T O R <<<< "FBX "qFY!@ "Fr>Y(!  "'Copyright (C) by Gerd Ringat in 1986F$Y !` " Version 3.0FRY!( "F8Y@!0 " >>>> Programm - Start <<<Y ! "'Aufmerksamkeit ohne Strungen ablaufen.F\Y! "C8. Das Programm ist durch die Menue-Fhrung verstndlich aufgebaut "F undF(Y ! "leicht erlernbar.FdY! "L9. Alle Eingaben werden durch ein akustisches Signal beendet ( bei MonitorenF,Y !  "mit Lautsprechern ).Fe`Y!( "H10. Es knnen nicht mehr als die vorgesehenen Zeichen eingegeben werden.Fr&YX!@ "BX "p""FBX "qFF SFY! "2FEFp F4FY! "F4F^Y! "F11. Eingabemaske und Datei mssen auf > 1 Diskette < abgespeichert "F werden.F^Y!  "F12. Einige Tasten sind gesperrt und funktionieren nur wenn sie fr denF.6Y !@ "Programmablauf bentigt werden.FZY!` "C13. Hilfsbildschirme knnen von jedem Untermenue aufgerufen werden.FXY! "@14. Es wird jederzeit der freie Hauptspeicherplatz und der Name "F der aktuellenF(Y ! "Datei angezeigt.FzTY!  ";15. Fehler werden abgefangen und Hinweise auf die Ursachen "Fm ausgegeben.FXY!0 "@16. Ist das Dateiende erreicht, so wird in allen Ein- u. Ausgabe"F unter-FHY !@ "1programmen ein entsprechender Hinweis ausgegeben.FXY!P "A17. Im Floppy User kann das Directory eingelesen werden, auerdemFXY !` "Aknnen Dateien gelscht und umbenannt werden. Ebenfalls kann hierFPY !p "8der freie Speicherplatz einer Diskette abgefragt werden.FaLY ! "4In diesem Modus die Dateinamen ohne Zusatz eingeben.FeVY! "?18. Es knnen ein- oder zweiseitige Disketten verwendet werden.F`Y! "G19. Im Druckermodus wird jeweils ein Datensatz vollstndig, mit Eingabe"F maske,FJY ! "3ausgedruckt ( Drucker mit Cetronic-Schnittstelle ).FVY!  ">20. Alle Dateien werden mit der Extension 'dat' abgespeichert.F,F SFY! "3FEF F4FY! "FNF`Y! "H21. Es mssen mind. > 6 Felder < fr einen Datensatz erstellt werden.F dY!  "K22. Bei kleineren Datenstzen mit max. 6 Feldern knnen nur > 6 Felder < "F:Y !@ "#als Suchfelder eingerichtet werden.FbY !` "JBei greren Datenstzen knnen bis zu > 10 Felder < als Suchfelder ein-F-(Y ! "gerichtet werden.F^Y ! "GDas Programm erkennt dies und errechnet die richtige Felderzahl, so daF<Y !  "$ein Programmabsturz verhindert wird.Fe`Y!0 "G23. Vor Beginn der Arbeit mit SELECTOR mssen folgende Punkte beachtet "F werden,F.Y !@ "in dieser Reihenfolge :F<Y !` "$1. PT_EPSON.PRG ( Druckerprogramm ),F:Y !p "#2. GFABASRO.PRG ( RUN-ONLY-MODUL ),FBY ! "+3. SELECTOR.BAS ( Dateiverwaltung ), ladenFdY! "M24. Dies ist ntig, um die Daten ( Umlaute, usw. ) korrekt auszudrucken. AlleFNY ! "7Programmteile sollten sich auf einer Diskette befinden.FY!@ "F+EF-F|FEF" F"4FY! "FFPY! "8Eingabemaske erstellen : unter Eingabe ( Maske/Daten )Ft\Y!@ "DEs knnen max. 32 Felder auf zwei Bildschirmen frei erstellt werden.F`Y! "GDie > Felder 1 - 6(10) < knnen als Suchfelder eingerichtet werden, "F da derFJY!  "3Computer nach dem Inhalt eines dieser Felder sucht.F\Y!@ "CJedes Feld ( Eingabemaske ) darf bis zu 26 Zeichen lang sein, wenn "FF das FDY!` ",26.-Zeichen erreicht ist, ertnt ein Signal.FiZY! "ADie Eingabe kann jederzeit mit ' e ' als 1.stem Zeichen in jedem "F Feld beendet FTY! "=werden, bei weniger als 6 Felder wird die Eingabe wiederholt.FZY!  "BWerden die > Felder 17 - 32 < erstellt, so wird mit ( + ) die "F2. Bild-F\Y!0 "Dschirmseite aufgerufen und die Eingabe kann nun fortgesetzt werden, "F dies giltF@Y!@ ")auch, wenn das 16. Feld erstellt wurde ).F^Y!P "GAnschlieend knnen die Eingaben korrigiert und gelistet werden. DanachFdY!` "Lsollte die Eingabemaske unbedingt abgespeichert werden. Whlt man 'Menue' soFZY!p "Cwird die Eingabemaske auf Null gesetzt und mu neu erstellt werden.FZY! "Andern : Es wird nach der Zeilen-Nr. gefragt, dann kann die neue "FM Zeile einge-F\Y! "Dgeben werden. Es mssen jeweils die Felder 1-16 und dann die Felder "F 17-32F(Y! "gendert werden.FmRY! ":Die Eingabemaske wird separat abgespeichert, wahlweise : "FLaufwerk A / B.FCRY!  ":Nach der Felderzahl, wird automatisch die Anzahl der Daten"Fstze berechnet undFRY!( ":der Computer dimensioniert. Je weniger Felder, desto mehr "F Datenstze.F+EF-F|FEF 0F4FY! "FrFFY! ".Dateneingabe : unter Eingabe ( Maske/Daten )FeVY!  "=Jedes Eingabefeld kann bis zu 50 Zeichen lang sein, wenn das "Fo 50.-ZeichenF8Y!@ " erreicht ist, ertnt ein Signal.FeVY!` ">Die Eingabe ist beendet wenn das letzte Feld der Eingabemaske "F erreicht ist.FRY! "9Bei der Dateneingabe mu bercksichtigt werden, da die "Fr> Felder 1 - 6(10) Y!p "&erst die Daten bearbeiten oder ndern.FnXY! "@Bestehende und neue Dateien : unter Floppy ( Laden/Speichern )F"+E@@F-F@|F@EFB @F"4FY! "FF&Y! "Daten ndern :F <Y! "$In diesen Modus kommt man nur von...FKBY!@ "+1. Daten selektieren ( nur 'Bearbeiten' ) :F^Y!` "FHier knnen alle Datenstze nach dem Inhalt der > Felder 1 - 6(10) Programm zur Ermittlung von Einnahmen und Ausgaben im HaushaltF('p!z!- Mausgesteuert -Fe$(!!!PFtB' !9!+Ausgeknobelt und geschrieben von G.BergholzFs EG FQ F  Z ***F  FDesk - 1,2,3,4,5,6,"" -:Men,M-Grafik,G-Grafik,Hardcopy,Start,Speichern,Ende,"" 4ndern,Re-Eintrag,Re-Men,Re-Ordner,Re-Beginn,"" bMonat,Januar,Februar,Mrz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember,***,""   EJanuarF  EFebruarF @ EMrzFF  EAprilF  EMaiF @ EJuniF  ` EJuliF   EAugustF  E SeptemberF  EOktoberF 0 ENovemberF! @ EDezemberF! FvLFFLF F.-* +FF X  SpeichernFF,F F  EndeFF)!"Haben Sie Ihre|Daten gespeichert ?!!JA|NEIN!F FS,F FF F 8 StartF-F,1F,F ^F, F, Fo&EF,F F h M-GrafikFYFF,(F F  Re-MenFBF,F]EF^EF_EF, F, F,F F   Re-EintragFF,F F Z  Re-OrdnerFdF,0FvL4F,F, F, F&EF,F F XFR*  !  !  ! @  !  !  Fr*  !@@@  ! @@@  ! !  !  !  !  FJ*  !  !  ! !  ! @@ F9EFaEF ^FG(!!FS&'z!H!HAUSHALTSKOSTENF-(!!PFLT' !H!>Programm zur Ermittlung von Einnahmen und Ausgaben im HaushaltF('p!z!- Mausgesteuert -Fe$(!!!PFtB' !9!+Ausgeknobelt und geschrieben von G.BergholzFs EG FQ F  Z ***F  FDesk - 1,2,3,4,5,6,"" -:Men,M-Grafik,G-Grafik,Hardcopy,Start,Speichern,Ende,"" 4ndern,Re-Eintrag,Re-Men,Re-Ordner,Re-Beginn,"" bMonat,Januar,Februar,Mrz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember,***,""   EJanuarF  EFebruarF @ EMrzFF  EAprilF  EMaiF @ EJuniF  ` EJuliF   EAugustF  E SeptemberF  EOktoberF 0 ENovemberF! @ EDezemberF! FvLFFLF F.-* +FF X  SpeichernFF,F F  EndeFF)!"Haben Sie Ihre|Daten gespeichert ?!!JA|NEIN!F FS,F FF F 8 StartF-F,1F,F ^F, F, Fo&EF,F F h M-GrafikFYFF,(F F  Re-MenFBF,F]EF^EF_EF, F, F,F F   Re-EintragFF,F F Z  Re-OrdnerFdF,0FvL4F,F, F, F&EF,F F   Re-BeginnFnF,0F- iE5 F-iEiF- EAi F,Fi,.FiiEiF- EAi F, Fi, Fi&EF,F F.  HardcopyFFY0! "Bitte Namen von Block "" eingeben"F": F Y0! !H "FeNY0! "(Bitte anklicken, welche Konten zu Block "" gehren"F$(!!!@FeY! " F$(!!!FeF4F,F@ EF!*Y# ! "; @ F ZF F E(#  F v%EG# FY%! " F  R%FEF F,F F $E# F.F.-* J+-FFh!F F] ^F@_ EF :F_^@_ EF4 F@ EF F F.F.-+ +FEFFh*!!+!!c!e!j!dF7O!M!JDFHP.FM!F 8MF,3F,/FM7O!M!F 0EG FFuM! ! ! F  FuM!h!'!$!RFa *EG$FuM!* !* !* Fa  \*F! EG$F +EG F-uM!@+ F  +F!  F! 4cEG@Fa *jEG FauM!c@j F  jF!  cF! eEG@Fa dEG FauM! e@d F  hdF!  NeF! 8MF.F.-+ +$FhTF$(!!!PFw TEG F,Y8!  !Konto berzogen !!!"Fh { F Y8!  ! "Fr { F  TFF$(!!!PFe.F2-. t+(FhG!UFFEF-UEF-GEF,#F-,%F$$!!!F$ !4!@ !>F-$(!!!PF-,' !;!MONATSBERSICHT  a F'@ !;! STOPFF4GF" PG PG Q/F-FEGF FE .G$FGEFP FE \Q4P FUEF FE vZRFP FR ÖUF,&F &F$(!!!PF'@ !;! STOPF {pF$(!!!PF'@ !;! STOPF F.F.-+ +#F-YF h!Q!%F$$!@!!F-$!/! !/F-$H!!H!/F-$(!!!FEFQEzz F %EGF0! F$$@!!!F-H!! !F0! F$$!!!F-!! !F EAQ F'!#@ !F1Q!z F  4%F$$@!!!F-$H!! !F-.F0-, e+%FhH!I!J!O!K!L!M!N!PF-&HE ##$   F IEH$FOE44IF NE%O FME44F TPEG$F JE//# a@P \( F KE%J F%!!@FM!K!N!/F$(!!a !FEM F '!-!P FN$(!!!F EK F EA a@P F 'M! !FF P EMF P EKF P ENF P ELFMEN F NEMIF  PF.F-.-* w+&F hV!J!O!W!K!L!P!I!G!XFGEFIEFGEFFOXEF!,#F(VE ##G    FIEVG FOE44IF NE%O FME44F ʂPEGG F&JE//#a@G@P \( F KE%J F%!!@FM!K!N!/F$(!!a !F EM F ' !-!G@P FS$(!!!F EK FEAa@G@P F 'M! !F MEN F NEMIF  ZPF$$!!!F$(!!!PFF6' !;!MONATSBERSICHT G   a FFF F!.F'<-9 +FhDFL)@!,Bitte den zu lschenden|Eintrag wiederholen !!OK!DF&EFBEF!,F.FB-> O+)F6h!v!u!n!!o! !!!p!q!r!s!t!!!FnEFvEFuEF!$$!!!F EG$FnEn F  ̮FnEnHF |pEG$FEF!E##p n H FoEHFE#o F EHHFEHHFE44F uEuF%!!pF !!!v!uF$(!!!@FqEHHFtEp FrERRFsEtpFq!s!r!tF'W!#s !p FEAo  %FEAp  DM= F'W!#s !FEFvEuFF  pF$(!!!PF*' !@!GESAMTBERSICHT F %F$$!!!F$%!*!>!4Fn''!1!STOPFFEFE#Q( F ψPHF-EHHF FE ϢZRF 8 (nicht Kosten fr Datentrger) nehmen!FD$p! !p!Fr$ !! !F FNI Dieses Programm hat mich einiges an Zeit und Nerven gekostet ! Falls esFHC jemanden gefallen sollte, Spenden bitte an folgende Adresse:FF).) THE WEREWOLFF.) LANDSBERGE 5F2, 4322 SPROCKHVEL 2F22, Tel.: (02339) 7536F2F0B= Auerdem Kontakte zu anderen ST-Usern gesucht !FF#F#NI Vielen Dank zu der MEGABYTE GmbH,Wuppertal, die das Programm in den PD-F4/ Markt eingefhrt hat!F$ !! !F,$ !! !2F $!! !=F&!F$6!`!`!`F$6!!!FFRHEG`F6@!!!F E6S RF RHZF {F R FFRE`IF6@!!!F -E6S RF RZ-F {F RbFF Q-FYF$*F$* vt260 terminal-emulator 1.4 *F$* (c) 1986 by wws/uca ultd. *F$*FFE logon please FFE,F0:F  T helpFEF* SFh8E0current password is the pseudonym of the author!Fe TFuEsorry, no help avaible!F FE,Fs F THjoshuaF"Ewell, this isn't wargames!Fo,Fw F T australiaF6E.this isn't hacker, and also no simple plagiat!Fo,Ft F0 TquitlogoffleaveoffF`F F U;@ fuck;@ shit;@  arsch;@  schei;@@@ sif;@ fickFEFf UF (E don't say i hadn't warned you...FW,F {HF`F F0E& yourself! I'm not a very patient one!F,F F&SHwerewolf the werewolfFYFE### Willkommen ! ###Fn,F#FREJSie sind soeben in den Mainframe-Rechner der ESA eingebrochen. Da dies einF,FWFTEMhchstma an Intelligenz und Logik erfordert, knnen wir annehmen, da wir inF,FsF<E4einer sehr delikaten Sache mit ihnen rechnen knnen.Fi,FIFTEMVon der ffentlichkeit unbemerkt, haben wir bereits seit einiger Zeit KontaktF,FgFPEHmit einer auerirdischen Rasse. Die bisherigen Verhandlungen liefen sehrFk,FiFREJerfolgreich, doch bei der letzen Sitzung kam es zu mehrern Zwischenfllen,Ft,FoFNEFdie die Beziehungen zwischen Erde und Beta Kretauri doch etwas getrbtFn,FeFTELhaben. Um die Wahrheit zu sagen, es ist bereits eine Kretaurische Invasions-F,FaF"Eflotte auf dem Weg zu Erde.F,FtFREKDer Fhrer der Delegation ist jedoch ein leidenschaftlicher Spieler, und soF,FDFVENhat er angeboten, wenn ihn ein Erdenbewohner beim DEMON-Spiel schlagen sollte,F,FhF8E0will er auf die Vernichtung der Erde verzichten.FD,FwFTEMnglcklicherweise ist ber die Regeln dieses Spiels bei uns praktisch nichtsF,FFTEMbekannt, auer da mit je sechs Figuren auf einem 6*6 Feld gespielt wird. DerF,FbFBE;Spieler der Erde wre also ganz auf sich selber angewiesen.F,FSFREKDie Katastrophe lie auch nicht lange auf sich warten: Der ursprnglich frF,FDFPEHdiese Aufgabe vorgesehene Nobelpreistrger und Mathematikprofessor wurdeFr,FdFTEMgestern abend in einem etwas anrchigen Freudenhaus tot aufgefunden. Er starbF,FgFTEMoffensichtlich an Herzversagen, als er sich mit einem der Mdchen zu arg ver-F,FoFEgngte.F,FgLEESie sind jetzt unsere letzte Hoffnung: bernehmen Sie die Aufgabe undFF,FSF<E4RETTEN SIE DIE ERDE! --- Viel Glck! ---Fk,FSFF ]n6S RFYFETEMGuten Tag. Ich bin Eknif Renrew, der Fhrer der Kretaurischen Delegation. MitF,FGFETELIhnen werde Ich also jetzt spielen. Ich hoffe, Sie wissen, was auf dem SgpielF,FIFXEPsteht. Lassen Sie sich auch noch sagen, da ich bis jetzt ungeschlagener MeisterF,FsEdes DEMON bin!.F,FdFF ^6S RFXFRFYFE$6!!!F$6!!!F$6!!!F$6@!!!F $F"_E G*HHFiH!!""!F _F!"_EHG"HHFi! !!**F _F,(!! !!F 0'h!`!1 2 3 4 5 6F'!!AF'!x!BF'!.!CF'!`!DF'! !EF'!"!FF (@F '8!\! MEIN ZUG:F'M!H!R.E.: 0F (F'M! !SIE : 0F '8! ! IHR ZUG :F%!!FFaEG@F Q!!F,F aFF&0,1,1,1,0,1,2,1,1,3,0,1,4,1,1,5,0,1 &0,5,2,1,4,2,2,5,2,3,4,2,4,5,2,5,4,2 *,, ! F E F E`F@ E F E`FbEGFFQ F bFX0,1,0,1,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,2,0,2,0,2,0,5,5,5,5,5,5,5 $6@! ! ! FET9 FF (@F$6!`!`!`F$6!!!FEF EF2EFdEGFdEGF d F,* d  FEF EF2EF$y!p!!F$z!!!F F F dZ F cF dZ F cF g F,FEEFE%U FEF  f FFE e~U33335@@FrE%U F FE f###@pp #@@ #x`` # Fb f    F: f  F EF F FE FE fZ FEFeB F Fdy  F F i"y FF$6!!!F$6!!!F$6@!!!FXFYF"ENachricht von Eknif Renrew:F,FNF6E.Ich gebe auf. Sie haben gewonnen! Hervoragend!F,FIFF(E Nachricht von Commander Perkins:FH,FNFREJGratulation! Damit haben Sie die Erde gerettet. Sie haben sich einen OrdenF,FGFJECverdient! Da Gratulationskommando ist schon unterwegs. Bis gleich!F,FvFF8)@!Verbindung abgebrochen!!Rerun!FpF F#EFE Fi,FF'k!\!F'l!H!FE%# @ FE@F 'EFEF,F"E%#' @ F$E#' @FEF,F EF' EF lF$6!`!`!`F!$6!`!`!`F!$6@!`!`!`F!YFXF"ENachricht von Eknif Renrew:F,FNFTEMIch werde wohl Meister bleiben. Tut mir leid, aber ich werde es mir von einemF,FIFTEMErdenmenschen nicht gefallen lassen, meinen . mit einer Senfgurke zu ver-F,FEFE wechseln...F,FwFF(E Nachricht von Commander Perkins:Fn,FNFTEMSie Dreckstck haben verloren!!! Die Echsen sind gerade dabei, unseren Sttz-F,FSFLEDpunkt anzugreifen. Htten Sie nicht besser spielen kn=/(*75+,<@\{}F,Fp4)@!bertragungsfehler!!Rerun!FpF F mP2F$y!p!@! F,z!!!!Fe F"'k! ! F (F$6!!!F$6!`!`!`F EF$y!!!FFEFF n~UrGE(F X)!7Nachricht von Perkins:|Die Aliens nhern|sich der Erde!!!Roger!(F F2n#RP"PHQ*Q  F$y!p! ! F|,z!!!!FeE%#P  H FE%#QHH H F'E# @F o''F'EF FE$y!!!Fn' F$E'F',FF 'k! ! nach F {FFF2o#RP"PHQ*Q  F$y!p! !F,z!!!!FeE%#P  H FE%#QHH H F'E# @F q''F'EF FEb r<#$' $'  $' `$' ` #' '  F"'k! ! Geht nicht!F$y!p! !F|$z!!!F| {pF$y!!!F|F r6S RF"'k! ! F rNF EF FEm F)E$F$E'F,FF'  ! !F r' F*E*F,y!p!`!!@Fe FE$y!!!F|'l! !*FEFE%#) @ FE)@F,FEFE%#' @ FE'@F,F) EF' EF sZ*Fc@FYFXF"ENachricht von Eknif Renrew:F,FNF@E9Gratuliere, Sie haben gewonnen. Die Flotte wird abdrehen.F,FGFFENachricht von Perkins:Fw,FNFDE=Gratuliere! Ihr Sieg wird gefeiert! Wir sind schon unterwegs!F,FGH)@!$Datenfehler|(Champagner in Leitung)|!!Juchu!!FgpF+FFuEG6 F$E;=@6  @ F"F*y!p!!7 ppFz!!F uLF$y!!!F.F+F%!!F  vBF%!!F F vtF%@!@!F F2HH!HH!F %!!F.F+F$E#F,FFEF$EF,FFE nach F .FE+F%E%#$ @ F&E$@%F EB% B@@& Fn.FEu6u vw #a0 #b0 #c7770007000600070055200505552220770557075055507703111103 #d - #E FB 02 #W 00 00 0C 01 1F 17 08 A:\*.*@ #W 00 00 0D 08 2A 0B 00 @ #W 00 00 0E 09 2A 0B 00 @ #W 00 00 0F 0A 2A 0B 00 @ #M 00 00 00 FF A DISQUE@ @ #M 00 01 00 FF B DISQUE@ @ #T 00 03 02 FF CORBEILLE@ @ #F FF 04 @ *.*@ #D FF 01 @ *.*@ #G 03 FF *.PRG@ @ #G 03 FF *.APP@ @ #F 03 04 *.TOS@ @ >