Merlin Pro

Cette doc a été extraite de la production Langue D'Ocs Hors Série numéro 3.

Sommaire


Lien Article
Voir Présentation générale.
Voir Le guide du débutant.
Voir Le mode exécution.
Voir L'éditeur.
Voir L'assembleur.
Voir Les macros.
Voir Le linker.
Voir Informations techniques.
Voir Sourceror.
Voir Glossaire.
Voir Utilitaires.
Voir Le microprocesseur 65802.
Voir Carte mémoire.
Voir Complément Merlin 8/16.

Manuel


hr Merlin

Présentation générale.





                        MERLIN PRO

                Le manuel de l'utilisateur


                          Préface


              MERLIN PRO:PRESENTATION GENERALE
              ================================



 Pub !

     Merlin Pro est un Assembleur extrèmement puissant et
complet pour les Apple IIe et IIc. Il comporte 4 modules
principaux, de nombreux programmes auxiliaires  et des
utilitaires dont l'un des assembleurs les plus complets
qu'on puisse trouver sur quelque ordinateur que ce soit.

 Ces 4 modules sont:

     - L'EXECUTEUR : assure la gestion des entrées/sortie,
       des fichiers, de l'interpréteur ProDOS...

     - L'EDITEUR : pour écrire et éditer des programmes avec
       une puissance analogue à celle d'un traitement de
       texte

     - L'ASSEMBLEUR : avec des caractéristiques
       sophistiquées telles que macros,librairies de
       macros,assemblage conditionnel, édition de lien...

     - LE LINKER : pour générer des programmes codes
       relogeables , pour utiliser rapidement des routines
       stcoker dans une librairie.



     Mais Merlin Pro ne se résume pas à ces 4 modules. Voici
quelques unes de ses autres possibilités:

     - Assemblage de programmes écrits pour le 6502 (IIe)
       65C02 (IIc) et 65802 (qui sait?)
     - Merlin est livré avec 2 assembleurs, un pour chaque
       système d'exploitation: ProDOS et DOS 3.3
     - Merlin Pro reconnait plus de 50 Pseudo-mneumoniques
       d'où une extrème souplesse de programmation
     - Merlin Pro possède plus de 40 commandes d'édition
       véritable traitements de texte
     - Merlin Pro est fourni avec un listing source
       désassemblé et commenté du Basic Applesoft
     - Merlin Pro est fourni avec de nombreux programme
       d'exemples, de librairies, et d'autres aides pour   
       vous familiariser rapidement avec l'assembleur
     - Merlin Pro est NON PROTEGE et COPIABLE



            Les pourquoi et comment de l'assembleur
              (sans intérêt pour les novices)


     Certains d'entre vous se demandent "l'assembleur c'est
quoi?" ou "Pourquoi ai-je besoin de l'utiliser ; le Basic me
convient très bien". Nous n'avons pas ici la place d'écrire
un traité sur le sujet, nous allons essayer de répondre
brièvement aux questions ci-dessus.

     Les langages de programmation sont souvent classés en
deux types: évolués et primaires. BASIC, COBOL, FORTRAN et
PASCAL sont des langages évolués.
     Un langage évolué utilise en général des mots anglais
et subit de nombreuses étapes d'interprétation et de
compilation avant d'être stocké en mémoire.
Le temps que prend ce processus est la raison pour laquelle
le Basic et d'autres langages évolués sont beaucoup plus
lents que l'assembleur. En outre, ils occupent une place
bien plus importante en mémoire.

     Initialement votre ordinateur ne comprend que deux
choses, ON et OFF. Tous ses calculs sont comme des additions
et des soustractions mais effectuées à une vitesse
extraordinaire. Le seul système numérique qu'il comprend et
la base 2 où 1,par exemple, est représenté par 00000001 et 2
par 00000010.

     Le microprocesseur 6502 a 5 registres de 8 bits et un
de 16 bits. Un programme en langage machine fait transiter
toutes les données par ces registres. Mais même ce niveau
le plus bas de codage nécessite un programme pour
fonctionner correctement. Ce 'programme' est implanté dans
le 6502 lui-même. Il fonctionne en 3 temps: il prend une
instruction dans la mémoire de l'ordinateur, la décode et
l'exécute.

     Ces instructions existent en mémoire sous forme de
groupes d'1, 2 ou 3 octetss. Un octet contient 8 bits et est
généralement noté en hexadécimal (base 16).Sur certains des
premiers ordinateurs, les données devaient être entrées à
l'aide d'un clavier contenant 8 commutateurs ON/OFF dont la
combinaison produisait un octet. Ceci nécessitait un
programme supplémentaire pour gérer les commutateurs et
stocker le octet en mémoire pour que le 6502 puisse
l'interpréter.

     Au niveau suivant, l'utilisateur pouvait entrer ses
données sous la forme d'un mnemonique à 3 caractères, un
type de code associés aux opérations du microprocesseur. Par
exemple: LDA est un mnémonique qui signifie "Load the
accumulator" (Charger l'accumulateur).

     Mais ceci est insuffisant pour créer un programme long
et complet. En plus de l'utilisation d'un mnémonique à trois
caractères, un assembleur complet permet au programmeur
d'utiliser des labels, qui représentent un espace encore non
défini en mémoire où une certaine partie du programme sera
stockée. En outre, un assembleur possède un numérotage de
lignes, analogue à celui du Basic, qui permet au programmeur
d'insérer des lignes ou d'effectuer d'autres opérations
d'édition.

     Avant d'utiliser un quelconque assembleur, le lecteur
doit être assez familier de l'architecture du 6502, des
modes d'adressage ... Ce manuel n'entend pas enseigner la
programmation en assembleur. De nombreux livres sur la
programmation en 6502 sont disponibles dans le commerce;
quelques uns sont répertoriés ici.

Matériel requis:
Apple IIc ou IIe 128K avec carte 80 colonnes
Videx Ultraterm (facultatif)

Lectures conseillées:

SYSTEM MONITOR - Apple computer, Inc. Peeking at Call-Apple, Vol 1
APPLE II MINI-ASSEMBLER - Apple computer Inc. Peeking at Call-Apple
Synertek Programming Manual, Synertek 6500-20
PROGRAMMING THE 6502 - Rodnay Zaks, Sybex C-202
THE APPLE MONITOR PEELED - Wm. E. Dougherty, Apple computer Inc.
A HEX ON THEE - Val J.GOLDING, Peeking at Call-Apple, Vol II
APPLE II REFERENCE MANUAL - Apple Computer, Inc
EVERYONE'S GUIDE TO ASSEMBLY LANGUAGE - par Jock Root
Une série d'articles explicatifs tirés de SOFTALK magazine.
Une excellente introduction, facile à suivre pour le
programmeur novice.
ASSEMBLY LINE: THE BOOK - par Roger Wagner
Une compilation des 18 premiers numéros d'Assembly Lines. En
outre, le texte a été considérablement mis au point et un
appendice de type encyclopédique a été ajouté. Cet appendice
présente non seulement les détails de chaque commande 6502
mais aussi une brève présentation de ses usages les plus
courants avec des listings concis et explicatifs.
HOW TO ENTER CALL-APPLE ASSEMBLY LANGUAGE LISTINGS
Call-apple, Volume IV, No 1, Janvier 81
MACHINE TOOLS
Call-Apple in depth, No 1.


Retour sommaire

hr Merlin

Le guide du débutant.



                    LE GUIDE DU DEBUTANT
                    ====================



                        Introduction



     Le but de ce chapitre n'est pas d'enseigner
l'assembleur mais de présenter Merlin aux programmeurs
novices en assembleur.
     De nombreuses commandes et fonctions Merlin se
ressemblent. Ce chapitre n'essaie pas de présenter l'usage
de chacune de ces fonctions. L'objectif est ici de clarifier
et de donner des exemples des opérations les plus courantes
qui serviront de base à une étude personnelle plus
approfondie de la part du programmeur.

Il y a quatre MODULES en DOS 3.3 et cinq en ProDOS.

     1 - L'EXECUTEUR
     2 - L'EDITEUR
     3 - L'ASSEMBLEUR
     4 - LE LINKER
     5 - L'INTERPRETEUR DE COMMANDE (ProDOS uniquement)

Chaque module appartient à l'un des deux MODES de controle
suivants:

1) Le mode EXECution, dont l'indicateur est "%"
   Il contient: le module EXECution
                l'interpréteur de commande Prodos

2) Le mode EDITeur, dont l'indicateur est ":"
        Il contient: le module Editeur
                     le module Assembleur
                     le module linker

Le mot "mode" a plusieurs usages. Il indique d'une part le
MODE de controle actif (repérable par l'indicateur), mais on
l'utilise aussi dans le cas suivant:
après la frappe d'une commande d'entrée, on dit que le
système est en mode <entrée>. Par exemple, lorsqu'on tape un
programme après avoir tapé la commande ADD, on dit que le
système est "en mode ADD".



         ---> Entrées : exemple d'utilisation <---


     Les programmeurs habitués à l'assembleur et aux
langages évolués se souviendront qu'il est nécessaire de
formater les entrées  c'est-à-dire que les labels,
mneumoniques, opérandes et commentaires doivent être tapés
dans des champs spécifiques sous peine de ne pas être
reconnus par le programme.
Dans Merlin, l'opérateur de TABULATION assure un formatage
semi-automatique des entrées.
Lorsque vous tapez un programme, souvenez-vous que, pendant
l'assemblage,chaque espace du code source engendre une
tabulation et le passage au champ suivant. Donnons un
exemple avec la brève routine suivante.
Suivez la procédure que voici:

1 - Bootez Merlin

2 - Quand l'indicateur "%" apparaît en bas du menu mode
EXEC, tapez "E". Ceci met le système en mode EDITEUR.

3 - Comme nous tapons un tout nouveau programme, tapez "A"
en réponse a l'indicateur ":" (A=ADD). Un "1" apparaît une
ligne plus bas et le curseur est automatiquement positionné
un espace à droite du numéro de ligne. Le "1" et tous les
numéros de ligne suivants qui apparaissent après la frappe
de RETURN ont à peu près la même utilité qu'en Basic à ceci
près que les numéros de ligne ne peuvent être utilisées
pour des sauts vers une sous-routine ni pour des commandes
du type  GOTO.

4 - Sur la ligne 1, tapez un "*" (astérisque). Un astérisque
en tête de ligne est semblable à un REM en Basic - il
indique à l'assembleur que c'est une remarque et que tout ce
qui suit l'astérisque doit être ignoré. Pour le vérifier,
tapez le titre "DEMO PROGRAM 1" après l'astérisque puis
RETURN.

5 - Le curseur est de nouveau descendu d'une ligne, un "2"
apparaît et le curseur se place à droite du numéro de
ligne.

6 - Maintenant, tapez la barre d'espace une fois et "ORG",
espace encore, puis "$8000" et RETURN.
Cette instruction ordonne à l'assembleur de commencer le
programme à l'adresse $8000.

7 - Sur la ligne 3,ne tapez pas d'espace mais directement
"BELL",espace,"EQU",espace,"$FBDD", RETURN.
Ceci affecte la valeur hexadécimale $FBDD au label BELL. Ce
type de label est donc une constante. Partout où BELL
apparaîtra dans une expression, il sera remplacé par $FBDD.
Alors pourquoi ne pas utiliser directement $FBDD ?
D'une part, "BELL" est plus aisé à retenir que "$FBDD".
D'autre part si la valeur de BELL devait être changée, il
suffirait de modifier l'égalité et non toutes les occurences
de $FBDD dans le programme.

8 - Ligne 4. Tapez
"START",espace,"JSR",espace,"BELL",espace,";"
(point-virgule), "RING THE BELL",RETURN. Le point-virgule
est souvent utilisé à l'intérieur d'une ligne de commande
pour indiquer le début d'un commentaire.

9 - Ligne 5. "DONE",espace,"RTS",RETURN.

10 - Le programme a été complètement tapé mais le système
est toujours en mode ADD. Pour le quitter, tapez juste
RETURN. L'indicateur ":" réapparaît à gauche de l'écran
indiquant que le système est revenu en MODE CONTROLE.

11 - L'écran devrait maintenant avoir cette forme:

     1 *DEMO PROGRAM 1
     2        ORG   $8000
     3 BELL   EQU   $FBDD
     4 START  JSR   BELL           ;RING THE BELL
     5 DONE   RTS

Remarquez que chaque chaîne de caractères a été placé dans
un champ spécifique. Il y a quatre champs, sans compter le
numéro de ligne à gauche.



                 ---> Numéro de champ <---


Le 1 est réservé aux labels. BELL, START, DONE en sont des
exemples.
Le 2 est réservé aux mneumoniques, comme les
pseudo-mneumoniques Merlin ORG et EQU, ou les mneumoniques
6502 JSR et RTS.
Le 3 est pour les opérandes comme $8000, $FBDD, et dans ce
cas précis,BELL.
Le 4 contient les commentaires (précédés de ;).

Il devrait être maintenant clair qu'il n'est pas nécessaire
de taper des espaces supplémentaires dans le fichier source
pour des raisons de formatage.
En résumé, après les numéros de ligne:

     1) ne tapez pas d'espace avant un label. tapez en un
après un label (ou s'il n'y a pas de label, après le numéro
de ligne) avant le mneumonique.

     2) tapez un espace après un mneumonique et avant
l'opérande . Pas d'espace après l'opérande avant le
commentaire. S'il n'y a pas d'opérande, tapez un espace et
un point-virgule avant le commentaire.



    ---> Commandes du système et d'entrée du texte <---
    

     Merlin possède un éditeur intégré puissant et complexe.
Complexe quant à la quantité d'opérations possibles mais
très facile à utiliser après un peu de pratique.
Les paragraphes suivants contiennent de brefs exemples
d'édition.
Toutes les commandes système et d'entrée s'utilisent en MODE
EDITEUR immédiatement après l'indicateur ":".
CTRL-X, CTRL-C ou RETURN comme premier caractère d'une ligne
fait sortir du mode <commande d'entrée> actif et ramène le
système en mode contrôle lorsque vous ajoutez (ADD) ou
insérez (INSERT) des lignes.
Les autres commandes du système et d'entrée se terminent
soit automatiquement, soit en tapant RETURN.

Insérer et détruire des lignes dans le fichier source sont
deux opérations très simples. L'exemple suivant INSERE trois
nouvelles lignes entre les lignes 4 et 5
1-Après l'indicateur ":", tapez "I"  (pour INSERT), le
numéro "5", et RETURN.
Toutes les lignes insérées précèderont numériquement le
numéro de ligne spécifié dans la commande.
2-Tapez un astérisque et RETURN. Remarquez que vous êtes
toujours en mode INSERT
3-Répetez l'étape 2.
4-Tapez un espace, "TYA", RETURN.
Sur l'écran vous avez ceci:
:I5
   5 *
   6 *
   7      TYA
   8

5-Tapez RETURN et le sysème revient en mode contrôle.
(indicateur ":")
6-Listez le code source:
:L
     1 *DEMO PROGRAM 1
     2 *
     3        ORG   $8000
     4 BELL   EQU   $FBDD
     5 *
     6 *
     7        TYA
     8 START  JSR   BELL      ;RING THE BELL
     9 DONE   RTS        

Les trois nouvelles lignes (5,6,7) ont été insérées et les
suivantes renumérotées.

La destruction est aussi facile.

1 - En mode contrôle, tapez "D7" et RETURN. Rien de nouveau
ne se produit à l'écran.

2 - LISTez le code source. Le listing a une ligne de moins.
Vous venez de détruire la ligne "TYA" et les suivantes ont
été renumérotées.

Il est possible de détruire plusieurs lignes d'un coup.

1 - En mode contrôle, tapez "D5,6", RETURN.

2 - LISTez le source.
Les lignes 5 et 6 de l'exemple précédent, qui contenaient
les astérisques, ont été détruites et les suivantes
renumérotées. Le listing est le même qu'au paragraphe sur
<entrées : exemple d'utilisation> étape 12. 
Avec cette renumérotation automatique, il devient impératif
que vous vous rappeliez que lorsque vous détruisez
successivement des lignes, vous devez commencer par la ligne
de numéro le plus élevé.
Les commandes Add, Insert, Edit ont de nombreuses
sous-commandes faisant appel aà la touche CTRL. Voici un
exemple:

1 - Après l'indicateur ":", tapez "E" (la commande EDIT) et
un numéro de ligne ("6" pour cet exemple), puis RETURN. Une
ligne plus bas, la ligne spécifiée apparaît :
      6 DONE   RTS
et le curseur est sur le "D" de "DONE".

2 - Tapez CTRL-D. Le caractère sous le curseur disparait.
Encore CTRL-D, puis une troisième et une quatrième fois.
"DONE" a été effacé et le curseur est positionné à gauche
d'un mneumonique.

3 - Tapez RETURN et LISTez le programme. En ligne 6 du code
source, seuls restent le numéro de ligne et les
mneumoniques.

4 - Répétez l'étape 1.

5 - Cette fois, tapez CTRL-I. Ne déplacez pas le curseur ni
avec la barre d'espace ni avec les flèches, tapez le mot
"DONE" et RETURN.

6 - LISTez le programme. La ligne 6 est de nouveau comme au
début.

     Si vous éditez une seule ligne, la frappe de RETURN
seul vous ramène en mode contrôle. Dans l'étape 1, si vous
aviez spécifié un ensemble de lignes (exemple:"E3,6"),
RETURN aurait avancé d'une ligne tant qu'il en restait à
éditer. Quand les lignes apparaissent, vous avez la
possibilité de les éditer en utilisant les nombreuses
sous-commandes, de taper RETURN qui appellera la ligne
suivante, ou de sortir du mode EDIT en tapant CTRL-C.
NOTE:La frappe de RETURN stocke la ligne entière en mémoire,
comme elle apparaît sur l'écran, quelle que soit la
position du curseur.
     Les autres sous-commandes (CTRL + touche) utilisées en
mode EDIT fonctionnent de façon analogue. Lisez leur
définition au chapitre 3 et essayez les.



                   ---> L'assemblage <---


     L'étape suivant dans l'utilisation de Merlin est
l'assemblage du code source en code objet.
Après le ":" , tapez la commande du module éditeur: ASM puis
RETURN. Vous voyez sur votre écran.

UPDATE SOURCE (Y/N)?     (Remise à jour du code source ?)
Tapez N et vous verrez:

ASSEMBLING
                    1    *DEMO PROGRAM 1
                    2
                    3              ORG  $8000
                    4    BELL      EQU  $FBDD
8000 20 DD FB       5    START     JSR  BELL     ;RING THE
BELL
8003 60             6    DONE      RTS

--END ASSEMBLY, 4 BYTES, ERRORS:0

SYMBOL TABLE - ALPHABETICAL ORDER

     BELL      =$FBDD         ?    DONE            =$8003
?    START     =$8000

SYMBOL TABLE - NUMERICAL ORDER

?    START     =$8000         ?    DONE            =$8003
     BELL      =$FBDD


     Si au lieu d'afficher le listing précédent, le système
émet un bip et affiche un message d'erreur, notez le numéro
de la ligne mise en cause dans le message d'erreur et tapez
RETURN jusqu'à l'apparition du message: "--END ASSEMBLY..."
Puis reportez vous au sous-chapitre <entrées - exemple
d'utilisation> et comparez votre listing à celui de l'étape
12. Cherchez en particulier si certains éléments ne sont pas
dans des champs inappropriés. En utilisant les fonctions
d'édition que vous avez apprises, changez toute ligne de
votre listing qui n'est pas identique à celle de l'exemple
12, puis assembler de nouveau.
     Si tout s'est bien passé, à droite de la colonne des
numéros de ligne et vers le milieu de l'écran se trouve le
code source, que vous connaissez bien.
     A gauche des numéros de ligne, à partir de la ligne 5,
se trouve une série de caractères numériques et
alphabétiques. C'est le code objet: les mneumoniques,les
opérandes transformés en leur équivalent hexadécimal en
langage.
     De la gauche vers la droite, le premier groupe de
caractères est l'adresse de départ de la routine (voyez la
définition de ORG au chapitre intitulé "Pseudo Opcodes
Directives"). Après le ":", il y a le nombre 20. C'est le
code hexadécimal à 1 octet pour le mneumonique JSR.
Les deux octets suivants (chaque pair de chiffres
hexadécimaux forme un octet) sur la ligne 5 ressemblent
étrangement aux derniers caractères de la ligne 4; regardez!
A la ligne 4 du code source nous avons dit à l'assembleur
que le label BELL était égal à l'adresse $FBDD. A la ligne
5, quand l'assembleur a rencontré BELL comme opérande, il
l'a remplacé par l'adresse spécifiée. La séquence des octets
a été retournée, transformant $FBDD en DD FB, c'est une
convention du 6502.
     Le reste des informations à l'écran s'explique
d'elle-même. Aucune erreur rencontrée, 4 octets de code
objet (on compte les octets qui suivent les adresses) ont
été créés.



         ---> Sauver et exécuter un programme <---

La dernière étape de l'utilisation de Merlin est d'exécuter
le programme.
Avant ceci, c'est toujours une bonne idée de sauver le code
source. Utilisez la commande SAVE SOURCE puis OBJECT CODE
SAVE pour sauver le code objet. Il est à noter qu'un OBJECT
CODE SAVE ne peut être effectué qu'après un assemblage
réussi.

1 - Revenez en mode contrôle si nécessaire et tapez "Q"
RETURN. Le système a quitté le mode EDIT et retourné au mode
EXEC. Si le disk Merlin est toujours dans le drive, enlevez
le et placez y un disk initialisé.
Après le "%", tapez "S" (abréviation de la commande en mode
EXEC: <S>AVE SOURCE FILE). Le système attend que vous tapez
un nom pour le fichier. Tapez "DEMO 1".
Tapez RETURN. Après la sauvegarde, l'indicateur réapparaît.

2 - Tapez "C" (<C>ATALOG) et regardez le catalog. Le code
source a été sauvé comme fichier binaire intitulé "DEMO1.S".
Le suffixe ".S" est une convention qui indique que le
fichier est un code source. Ce suffixe est automatiquement
ajouté au nom par la commande SAVE SOURCE.

3 - Frappez RETURN pour revenir en mode EXEC et tapez "O"
(pour <O>BJECT CODE SAVE).Il vaut mieux sauver le fichier
objet sous le même nom que le fichier source donc tapez "Y"
pour accepter "DEMO1" comme nom du fichier objet. Il n'y a
aucun risque d'écraser le fichier source car aucun suffixe
n'est affecté aux noms de fichiers objets.

     Pendant la sauvegarde de chacun des fichiers, Merlin
affiche l'adresse, calcule et affiche la longueur. C'est une
bonne habitude que de noter ces éléments.
En effet, bien que ces données (A$ et L$) soient affichées
sur le menu du mode  EXEC, la catalog montrera qu'elles ne
sont pas sauvées dans le nom du fichier.
Si vous préférez que ces informations figurent sur le
catalog, utilisez la commande DOS RENAME. Assurez-vous
qu'aucune virgule n'est incluse dans le nouveau nom de
fichier.

     Revenez en mode <E>DIT (tapez "E"). Puis tapez "GET
$8000". Cette commande ordonne à Merlin de prendre le
programme que vous venez d'aasembler et de le transférer
dans la mémoire principal de l'Apple.
Tapez ensuite "MON", RETURN et l'indicateur moniteur "*"
apprait. Tapez "8000G",RETURN. Vous entendez un bip. Ce qui
prouve que votre programme marche !
Vous pouvez maintenant revenir en mode EXEC en tapant CTRL-Y
et RETURN.



              ---> Copier le disk Merlin <---


     La diskette Merlin n'est pas protégée et vous pouvez la
copier en utilisant n'importe quel utilitaire de copie. Il
est hautement recommandé de ne travailler QUE sur la COPIE
de Merlin et de garder l'original à l'abri. Tous les
fichiers ainsi que la face contenant SOURCEROR.FP peuvent
être transférés:

1) sur un disk DOS 3.3 en utilisant le programme FID du disk
Apple's system master

2) sur un disk ProDOS avec l'utilitaire FILER du ProDOS
User's Disk.


Retour sommaire

hr Merlin

Le mode exécution.




                     LE MODE EXECUTION
                     =================


     Le mode EXECUTION gère les opérations de maintenace
telles que chargement et sauvegarde des fichiers, catalogue.
Les paragraphes suivants passent en revue toutes les
commandes disponibles dans ce mode.

<C>:CATALOG (DOS 3.3)

     Quand vous tapez "C", le catalog de la diskette
s'affiche. Le mot "COMMAND:" s'affiche à l'écran et vous
pouvez taper une commande Dos. Cette option est fournie
essentiellement pour LOCKer et UNLOCKer des fichiers. A la
différence des commandes LOAD SOURCE, SAVE SOURCE, APPEND
FILE, vous devez taper le suffixe ".S" quand vous tapez le
nom d'un fichier source. N'utilisez pas ce moyen pour
charger ou sauver un fichier. Si vous ne voulez pas taper de
commande Dos, tapez juste RETURN. Utilisez CTRL-X pour
annuler une commande partiellement tapée. Si vous tapez
CTRL-C RETURN après "COMMAND:", vous verrez apparaître
l'indicateur de mode EXEC "%". Vous pouvez alors taper
n'importe quelle commande EXEC comme par exemple "L" pour
LOAD SOURCE. Ceci vous permet de taper une commande EXEC
pendant que le catalog est toujours à l'écran. En outre la
frappe de CTRL-C alors que le catalog est en mode pause
entraine l'arrêt de l'affichage du catalog.

<C>:CATALOG (ProDOS)

     Quand vous tapez "C", le système vous demande le
Pathname du répertoire (directory) que vous voulez
cataloguer. Entrez un pathname ou RETURN pour le catalog du
directory en cours, le catalog s'affiche. L'indicateur "%"
du mode EXEC s'affiche après le catalog. Vous pouvez alors
taper n'importe quelle commande EXEC comme "L" pour LOAD
SOURCE. Ceci vous permet de taper une commande EXEC pendant
que le catalog est toujours à l'écran. En outre, la frappe
d'une touche quelconque pendant l'affichage du catalog, le
défilement s'arrête jusqu'à la frappe d'une autre touche.
Si vous tapez un "1" comme premier caractère d'un pathname
ou bien juste "1" er RETURN, le catalog sera envoyé sur
l'imprimante en Slot 1.


<L>:LOAD SOURCE

     Cette commande est utilisée pour charger un fichier
source binaire. Le système vous demande le nom du fichier.
Vous n'avez pas à taper le suffixe ".S" car Merlin le fait
automatiquement. Si vous avez tapé "L" par erreur, tapez
RETURN deux fois et la commande sera annulée sans affecter
aucun des fichiers en mémoire.
Après un LOAD SOURCE (ou APPEND SOURCE), vous êtes
automatiquement placé en mode EDIT, comme si vous aviez tapé
"E". Le source sera automatiquement chargé à l'adresse
correcte. Si vous effectuez un LOAD SOURCE ou SAVE SOURCE
ultérieur, le nom du dernier fichier utilisé s'affichera,
suivi d'un "?" clignotant. Si vous tapez "Y", le nom du
fichier en cours sera utilisé pour la commande. Si vous
tapez une autre touche, le curseur sera placé sur le premier
caractère du nom du fichier et vous pourrez taper le nom
désiré. Pour annuler la commande, tapez RETURN seul sans nom
de fichier.


<S>:SAVE SOURCE

     Cette commande sert à sauver une fichier source binaire
sur disk. Comme dans la commande LOAD, vous n'avez pas à
inclure le suffixe ".S",et vous pouvez frapper RETURN pour
annuler la commande.

REMARQUE: L'adresse et la longueur du fichier sont visibles
sur le Menu. Vous ne devriez pas les utiliser pour la
sauvegarde; l'assembleur s'en rappelle bien mieux que vous
et les envoie automatiquement au Dos.
Comme dans la commande LOAD SOURCE, le nom du dernier
fichier utilisé sera affiché et vous pouvez taper "Y" pour
sauver avec le même nom de fichier ou toute autre touche
pour changer le nom du fichier.


<A>:APPEND FILE

Cette commande charge un fichier source et le place à la fin
du fichier déjà en mémoire. Elle fonctionne de la même
manière que LOAD SOURCE et n'affecte pas le nom du fichier
par défaut. Elle ne sauve pas le fichier ajouté; vous pouvez
le faire vous-même si vous le souhaitez.


<D>:DRIVE CHANGE (DOS 3.3)

     Cette commande commute le drive actif (1-->2 et 2-->1).
Le drive choisi est affiché sur le menu. Au boot, le drive
choisi est le 1. Il n'y a aucune commande pour spécifier un
numéro de slot mais vous pouvez le faire en tapant "C" pour
CATALOG qui affichera le catalog du disk courant. Puis tapez
la commande "CATALOG,Sn" où n est le numéro de slot. Le
système cataloguera le drive spécifié.


<D>:DISK COMMAND (ProDOS)

     Ceci vous permet de taper des commandes concernant le
disk. Les commandes suivantes sont disponibles avec
l'interpréteur Merlin:

PREFIX    pathname  (permet de choisir un préfixe)
PFX       pathname  (abréviation pour PREFIX)
BLOAD     pathname  (,A$....)  (adresses hexadécimales seulement)
BRUN      pathname  (,A$....)  (adresses hexadécimales seulement) 
-         pathname  (,A$....)  (adresses hexadécimales seulement)
BSAVE     pathname,A$adrs,L$len
DELETE    pathname
LOCK      pathname
UNLOCK    pathname
RENAME    old_pathname,new_pathname
ONLINE    (indique les drives connectés et leurs noms)

     Après une commande disk, vous restez dans le même
mode. Vous pouvez donc en taper une autre ou taper RETURN
pour revenir au menu.
     Quand vous tapez PREFIX ou PFX sans pathname, le
système choisit comme préfixe le nom du volume du préfixe
courant. Exemple: Si le préfixe est /MERLIN/LIB et que vous
tapez PFX RETURN, le préfixe devient /MERLIN.

     BLOAD, BRUN et "-" acceptent les fichiers BIN et SYS.
La différence entre BRUN et "-" réside dans l'état de la
mémoire quand le contrôle est donné au programme. BRUN
laisse Merlin aux commandes; c'est-à-dire que la page
auxiliaire zéro et la RAM sont sélectionnées. La commande
"-" place le programme dans la page zéro principale et la
ROM $D000-$FFFF. Un RTS depuis un tel programme rendra la
main à Merlin. La plupart des utilitaires fournis avec
Merlin (Sourceror,Xref,etc.) peuvent être exécutés par les
deux méthodes. Vous pouvez utiliser "-" (mais pas BRUN) pour
exécuter des programmes comme le ProDOS Filer. Cependant, de
tels programmes ne rendent pas la main à Merlin et le volume
/RAM/ est déconnecté par cette procédure. 


<E>:EDITEUR/ASSEMBLEUR

     Cette commande vous place dans en mode
éditeur/assembleur. Les tabulations par défaut de l'éditeur
se règlent automatiquement sur celles des fichiers sources.
Si vous voulez utiliser l'éditeur pour éditer un texte
ordinaire, vous pouvez tapez TABS et RETURN qui remet à zéro
la tabulation.


<O>:SAVE OBJECT CODE (sauvegarde du code objet)

     Cette commande n'est valide qu'après un assemblage
réussi d'un fichier source. Dans ce cas vous verrez
l'adresse et la longueur du fichier objet sur le menu. Comme
pour l'adresse du fichier source, ces deux éléments sont
donnés à titre documentaire.

NOTE: l'adresse du code objet indiquée est celle affectée à
l'ORG du programme (ou $8000 par défaut) et pas celle de
l'emplacement actuel du code assemblé (qui est généralement
$8000 en mémoire auxiliaire). Quand vous utilisez cette
commande, on vous demande un nom pour le fichier objet. A la
différence du fichier source, aucun suffixe ne sera ajouté
au nom.

     Ainsi vous pouvez sans crainte utiliser le même nom
que celui du fichier source (sans le ".S" bien sur). Quand
ce code objet sera sauvé sur disk,son adresse sera la bonne,
celle indiquée sur le menu. Quand plus tard vous utiliserez
BLOAD ou BRUN, le programme sera chargé à cette adresse (qui
peut-être n'importe laquelle $300,$8000,&c).


<Q>:QUIT (DOS 3.3)

     Cette commande rend la main au Basic. Vous pouvez
revenir dans Merlin en tapant "ASSEM". Cela ne détruira pas
le fichier source en mémoire. Vous pouvez donc utiliser
cette façon de sortir pour taper des commandes disks, tester
des programmes en langage machine, exécuter des programmes
en Basic,etc.


<Q>:QUIT (ProDOS)

     Cette commande vous fait quitter l'interpréteur Merlin.
Vous devez spécifier le PREFIX de l'iterpréteur suivant
ainsi que le pathname où vous désirez aller. Dans la plupart
des cas, il s'agira de /BASIC.SYSTEM.


<R>:READ TEXT FILE

     Ceci vous permet de lire un fichier texte tout en
restant dans Merlin. Ils sont toujours chargés à la fin du
buffer actif. Pour vider le buffer, tapez "NEW" depuis
l'éditeur. S'il n'y a pas de fichier en mémoire, le nom
donné deviendra le nom par défaut. Ceci ne marche que si
vous avez tapé NEW.
Quand le chargement est fini, vous êtes envoyés dans
l'éditeur. Si le fichier contient des lignes de plus de 255
caractères, elles seront divisées en deux (ou plus) lignes
par la commande READ. Le fichier sera chargé jusqu'à ce
qu'il atteigne HIMEM et engendrera une erreur s'il dépasse
cette valeur. Seules les données contenues avant HIMEM
resteront.

     Les commandes READ TEXT FILE et WRITE TEXT FILE
inclueront un "T." au début du nom de fichier que vous tapez
à moins que vous ne précédiez le nom d'un espace ou de tout
autre caractère ASCII compris entre $20 et $40. Ce caractère
sera ignoré et non utilisé par le Dos dans le nom du
fichier.
Ces deux commandes sont utilisées pour charger ou créer des
"PUT" Fichiers, ou pour charger des fichiers issus d'autres
assembleurs ou éditeurs de texte.


<W>:WRITE TEXT FILE (DOS 3.3)

     Cette commande écrit un fichier Merlin sous forme de
fichier texte au lieu d'un fichier binaire. La vitesse des
commandes READ TEXT FILE et WRITE TEXT FILE est à peu près
celle de BLOAD ou BSAVE en Dos. La routine WRITE TEXT FILE
effectue une vérification après l'écriture.


<S>:SET DATE (ProDOS)

     Ceci vous permet de régler la date pour ProDOS mais
elle ne permet pas de régler la date sur une carte horloge.
Si vous avez une horloge, l'affichage de la date est
automatique (du moment que vous avez un Thunderclock ou
l'émulateur d'horloge requis). Le SET DATE est conçu pour
les personnes qui n'ont pas d'horloge. Dans ce cas, vous
pouvez l'utiliser pour régler la date et cette date sera
utilisée pour dater les fichiers. Vous pouvez également
l'utiliser  simplement pour vérifier la date du jour.
Frapper RETURN seul quitte la routine SET DATE.

Sheek & THE ENGLISH MAN, le 12 Mars 1992.


Retour sommaire

hr Merlin

L'éditeur.




                         L'EDITEUR
                         _________

L'editeur comprend 3 modes:
     COMMAND,ADD ou INSERT et EDIT.Le plus important est le
premier qui se remarque par deux points au prompt.

A propos de la documentation de l'editeur:
     La documentation est divisee en trois parties:
          1-Les ordres du mode COMMAND
          2-Les ordres du mode ADD ou INSERT
          3-Les ordres du mode EDIT
     Pour chacune de ces commandes vous trouverez 3 parties:
          1-Le nom et la syntaxe de ces commandes
          2-Des exemples d'utilisations correctes
          3-Une description de la fonction de chaque
commande.
     Quand la syntaxe de chaque commande est indiquee:
          -Les PARENTHESES ( ) indiquent une valeur demandee
          -Les "ANGLE BRACKETS" < > une valeur optionnelle
ou un caractere
          -Les CROCHETS [ ] servent a encadrer des
commentaires sur la commande (passer en mode QWERTY pour
voir les crochets mais impression non garantie!)


Le mode COMMAND
---------------
     Pour les nombreuses commandes de ce mode ,seule la
premiere lettre est obligatoire les autres , optionnelles.
     Vous trouverez ici les lettres obligatoires en
MAJUSCULE et les optionnelles en MINUSCULE.
     Numerotation des lignes:avec certaines commandes vous
devrez specifier le numero de ligne ,la suite de lignes ou
une liste de suites.Une ligne est numerotee par un nombre,
une suite par une paire de nombres separes par une virgule
dans une liste ,les suites sont separees par un trait
oblique (slash) "/".
     exemples:
          10             ligne   [ligne simple]
          10,30          range   [suite de 10 a 30]
          10,30/50,60    range list [suites de 10 a 30 et de
50 a 60 ]
     Si un  numero de ligne dans une suite depasse le
dernier numero de ligne du source ,l'editeur s'alignera sur
ce dernier numero.

     Chaines delimitees (d-strings)

     Plusieurs commandes autorisent des commentaires ,ils
seront delimites par un caractere non-numerique autre que
"/" ou la "," .Les delimiteurs habituels sont les guillemets
(' ou ") ,simples ou doubles.
     exemples:
          'ceci est une chaine delimitee'
          "ceci est ...................."
          &ceci est ....................&

     Joker dans les chaines

          Pour toutes les commandes utilisant les chaines
delimitees,le caractere "`" joue le role d'un joker.De ce
fait la chaine "jon`s" est equivalente a "jonas" ou a
"jones".

     Majuscules et minuscules

          Les Apple //e et //c utilisent les touches shift
et capslock.

LES COMMANDES du mode COMMAND
-----------------------------

HEX-DEC conversions
          128= $0080
          $80= 128
     Si vous tapez un nombre decimal (positif ou negatif) en
mode Command,l'equivalent hexadecimal est retourne (et
reciproquement).Toutes les commandes acceptent les nombres
hexadecimaux.

NEW
     NEW                 [option unique]

     Efface le fichier source present dans la memoire.

PR#
     PR# (0-7)
     PR#1                [liaison vers l'imprimante]
     PR#3                [note:ne pas utiliser avec une car-
                              te 80 colonnes]
     Identiques au Basic,ces commandes servent surtout a
imprimer un listing.Ne pas les utiliser avec une carte 80
colonnes.Note:PR# est automatiquement mis hors service apres
une commande ASM,mais,non apres un LIST ou un PRINT.
     Notez que PR# envoi un List non formatte et sans fin de
page.Si vous desirez un formattage du List et une fin de
page,utilisez la commande PRTR.

USER
     USER
     USER                [a utiliser avec XREF]
     USER "SOURCE"       [a utiliser avec PRINTFILER]

     Cette commande provoque un JSR $3F5 (adresse de la
routine Applesoft Ampersand qui se termine normalement par
un RTS.Le but de cette commande est la mise en oeuvre de
divers utilitaires de MERLIN et l'utilisation des divers
drivers d'imprimantes.Note: Faites attention que votre
driver d'imprimante n'utilise pas les adresses de la page
zero a l'exception des pointeurs I/O et de $60-$6F car ceci
interfererait avec l'utilisation qu'en fait MERLIN.De
nombreux utilitaires se servent de la commande USER.

TABS
     TABS<nombre>        TABS<,...>
     TABS<,nombre>       TABS<"tab caracter">
          TABS           [efface toutes les tabulations]
          TABS 10,20     [place les tabulations en 10 et 20]
          TABS 10,20 "  "[espace est le caractere de tabula-
                              tion]

     Ceci place les delimiteurs de tabulation pour l'editeur
et n'a aucun effet sur le listing assemble.Vous pouvez
utiliser jusqu'a 9 tabulateurs. Le tabulateur par defaut est
l'espace mais vous pouvez en specifier d'autres.Toutefois
l'assembleur considerera l'espace comme le seul tabulateur
valable pour la separation des labels,opcodes et operandes.
Si vous ne specifiez pas de caractere de tabulation,le
dernier utilise reste valide.Si vous entrez TABS puis RETURN
toutes les tabulations sont effacees.

LENgth
     LEN                 [option unique]

     Donne la longueur en bytes du fichier source et le
nombre d'octets libres.

Where
     W (numero de ligne)
     W 50                [ou est la ligne 50 en memoire?]
     W 0                 [ou est la fin du source?]

     Ceci donne en Hexa la location en memoire d'un debut de
ligne ."W0" donne la location de fin du source.

MONitor
     MON                 [option unique]

     Sortie vers le moniteur.Vous devez rappeler MERLIN par
CTRL-C ou -B ou -Y,ceci retablira les pointeurs de page zero
a partir d'une zone reservee dans MERLIN lui-meme.Toutefois,
CTRL-Y donnera un retour correct meme si vous aviez modifie
les pointeurs durant votre passage sous moniteur.
     Le DOS n'est pas connecte si vous utilisez MON.
     Vous pouvez revenir directement a l'editeur avec un 0G.
Ce retour placera les pointeurs de page zero en $0A-$0F a la
place de ceux sauves avant la sortie sous moniteur.Toutefois
vous devez etre certain de ne pas les avoir modifies.Pour un
usage normal,le retour a Merlin se realise par l'un des
trois CTRL.
     Notez que lorsque vous passez sous moniteur avec cette
commande la memoire RAM en $D000-$FFFF est indisponible ,i-e 
 Merlin et sa table de symboles (s'il y en a une).Si vous
voulez inspecter la memoire ROM qui correspondrait
ordinairement a l'Applesoft et au F8 moniteur,vous devrez
sortir de Merlin par la commande QUIT et passer sous
moniteur par l'habituel CALL -151.Notez que sous PRODOS
cette commande va necessiter le chargement du BASIC.SYSTEM
et que Merlin Pro ne sera plus en memoire.

TRuncON
     TRON                [option unique]

     Utilise pour placer un drapeau (flag) qui durant un
List ou un Print arretera l'impression d'une ligne chaque
fois qu'il rencontrera un espace suivi d'un point
virgule.Ceci rend la lecture plus commode sur un ecran 40
colonnes.

TRuncOFf
     TROF                [option unique]

     Retourne aux conditions de decoupage par defaut ce qui
est automatiquement fait avec une entree dans l'editeur
depuis le mode EXEC ou depuis l'assembleur.toutes les lignes
du source redeviennent au List ou au Print.

Quit
     Q                   [option unique]

     Sortie vers le mode EXEC.

ASM
     ASM                 [option unique]

     Passe le controle a l'assembleur,mais tout d'abord vous
devrez repondre a la question:"Voulez-vous modifier le
source ?".Ceci pour vous rappeler de changer la date ou le
numero d'identification du fichier source.
     Si vous repondez "N" l'assemblage commence.
     Si vous repondez "Y" la ligne contenant le premier "/"
sera affichee a l'ecran et vous serez place en mode EDIT.
     Lorsque la modification est faite et que vous avez
valide,l'assemblage commence.
     Si vous utilisez le CTRL-C du mode EDIT tous les ordres
d'entree/sortie (I/O Hooks) que vous avez definis par un PR#
ou autre ,seront annules et vous reviendrez en mode EDIT.
     Ceci arrive aussi si aucune ligne ne contient un "/".
Vous pouvez configurer Merlin pour ne pas repondre a cette
question.Note: Durant la seconde partie de l'assemblage,si
vous le tapez CTRL-D vous otez tous les drapeaux de listage
et le listing va ,soit s'arreter soit repartir du debut.Cela
ne se produira pas s'il y a un LST opcode dans le
source,mais un deuxieme CTRL-D n'en tiendra plus compte.
     Le temps d'assemblage est bien plus court s'il n'y a
pas de listage.

Delete
     Delete (numero de ligne)
     Delete (suite de lignes)
     Delete (liste de suites)

          D 10      [supprime la ligne 10]
          D 10,20   [   "     les  "   10 a 20]
          D 20,30/10,20   [supprime les lignes 10 a 20 et 20
                              a 30 ]

     Attention ! comme les lignes sont FICTIVES et changent
a chaque INSERTION ou  SUPPRESSION ,vous devez toujours indi
quer la serie ayant les numeros les plus eleves en premier
pour que les lignes effacees soient effectivement les bonnes

Replace

     Replace (num.de ligne)   Replace (suite de lignes)

          R 10      [supprime la ligne 10 et passe en Inser
                           tion]
          R 30,40   [supprime les lignes de 30 a 40 et passe
                           en mode Insertion]


List

     List      List (num.de ligne)      List (suite)
   
     List (serie de suites)

          L         [liste le fichier en entier]
          L 20      [liste la ligne 20]
          L 20,30   [liste les lignes 20 a 30]
          L 20,30/40,42  [liste de 20 a 30 et de 40 a42]

     Listing du source avec numerotation des lignes .Les
caracteres de controle presents dans le source sont indiques
en Inverse video a moins que le listing ne soit envoye a
l'imprimante ou vers un peripherique non standard.
     Le listing peut etre arrete par un CTRL-C ou par un
"/". Vous pouvez arreter le listage avec la barre espace et
le reprendre ligne a ligne grace a la barre espace.En la
tenant appuyee ,vous aurez un defilement lent et regulier.
     La barre espace sert aussi de pause durant l'assembla
ge.

. (point)
     .              [option unique]

     Le listing demarre du dernier numero de ligne ayant ete
specifiee.Si vous avez tape "L 10,100" ,ce sont celles qui
seront listees. Si vous tapez "." ,le listage reprendra en
10 et ignorera l'arret en 100.

/ (slash)

     / <num.de ligne>

          /         [le listage demarre a la derniere ligne 
                         listee]
          /50       [le listage demarre en ligne 50]

     Ces commandes permettent le listage a partir d'une
ligne donnee jusqu'a la fin du fichier.Voir LIST pour les
arrets.

Print

     Print     Print(num.de ligne)

     Print (suite)  Print (serie de suites)

          P         [imprime le source]
          P 50      [ """"   la ligne 50]
          P 50,100  [ """"   les lignes 50 a 100]
          P 1,10/20,30   [imprime de 1 a 10 et de 20 a 30]

     Cet ordre est le meme que LIST a l'exception que les
numeros de lignes ne sont pas ajoutes.


PRinTeR

     PRTR (commande)

          PRTR1 " "      [active l'imprimante en slot 1]
          PRTR 1 "<ctr>I80    [idem mais active les 80      
                                    colonnes]
          PRTR1 " " Page Title     [imprimante en slot 1,pas
    de caractere de controle,"Page Title" est le pointeur de
                                         page]
          PRTR3          [envoi un listing formatte a l'    
                               ecran 80 colonnes]
          PRTR8          [envoi un output a travers le      
                               vecteur en $3F5]

     Cette commande permet d'envoyer les ordres de listage a
une imprimante avec pointeur de page et reserve (voir les
configurations par defaut).
     La syntaxe complete de la commande est:

          PRTR Slot # "chaine" "< pointeur de page>"
     Si un numero de slot > 7  est utilise,un JSR $3F5 (
ampersand vector) est execute ,il est suppose alors que
cette routine sera connectee a un driver d'imprimante en
$36-$37.
     Si le pointeur de page est omis,seuls les numeros de
pages apparaitront.

     La chaine d'initialisation ne doit pas etre oubliee si
un pointeur de page doit etre utilise.Si aucune chaine
d'initialisation n'est exigee par l'imprimante,indiquer une
chaine vide par un retour de chariot.
    
Exemples d'initialisations:
          CTRL-Q pour des IDS
          CTRL-I80N pour la pluspart des cartes APPLE
          ESC 1 pour une OKIDATA (notez que vous devez taper
CTRL-O plutot que ESC de facon de ne pas passer en mode
Escape.)
          PRTR0 (pas de chaine necessaire) vous permet de
voir les fins de page,si la carte 80 colonnes est en slot 3,
utiliser alors PRTR3 pour cela.
     Aucun ordre de sortie vers l'imprimante n'est donne
jusqu'à ce qu'un LIST, PRINT ou ASM ne soit tapé.


Find

     Find (d-string)     Find (line number) <d-string>

     Find (suite)<d-string>   Find (liste de suites)        
                                                 <d-string>

          F"A string"    [trouver les lignes avec A string]
          F10 "string"   [voir si en ligne 10 on trouve     
                               "string"]
          F10,20 "HI"    [trouver les lignes entre 10 et 20 
                               contenant "HI"]
          F10,20/50,99 "HI"   [trouver les "HI" entre les   
                              lignes 10 et 20 puis 50 et 99]

     Cette commande liste les lignes contenant les chaines
recherchees.
     Sortie par CTRL-C ou "/"

Change

     Change (d-string d-string)

          C "hello" good-bye  [cherche hello et le remplace 
                                    par good-bye]
          C 50"hello" bye     [changement en ligne 50]
          C 50,100 "hello" bye     [changements dans les    
                                         lignes de 50 a 100]
          C 50,60/65,66 "AND" OR   [idem]

     Cet ordre change la 1ere chaine par la 2eme.Les chaines
doivent avoir les memes delimiteurs ainsi pour changer
"speling" par "spelling" entre les lignes 20 et 100,il
faudra ecrire:
          C 20,100 "speling" spelling
     Si vous ne precisez pas de ligne les changements seront
effectues dans tous le fichier.
     Avant que les changements ne soient effectues ,vous
devrez confirmer si vous voulez effectuer tous les
changements ou seulement quelques-uns ,"ALL" ou "SOME".
     Si vous selectionnez "SOME",tapez "S",l'editeur
s'arrete des que la 1ere chaine est trouvee et vous presente
la ligne modifiee,si vous tapez "Y",le changement est
effectue.Si vous tapez RETURN ,le changement n'est pas
effectue de meme que si vous touchez un caractere de
controle tel que ESC....
     Toutes les autres touches comme "Y" ou "N" accepteront
l'echange.
     CTRL-C ou "/" pour annuler la commande.

COPY

     COPY (num de ligne) TO (num de ligne)

     COPY (suite) TO (num de ligne)

          COPY 10 TO 20  [copie la ligne 10 juste avant la  
                               20]
          COPY 10,20 TO 30    [copie les lignes 10 a 20     
                               juste avant la 30]

     Les lignes sont copiees mais rien n'est detruit.

MOVE

     MOVE (num de ligne) TO (num de ligne)
     MOVE (suite) TO (num de ligne)

          MOVE 10 TO 20  [deplace la ligne 10 avant la 20]

     Identique a COPY mais apres le deplacements des
lignes,les lignes originales sont automatiquement effacees.
Vous terminez avec les memes lignes mais dans un ordre
different.

FW (Find Word)

     FW (d-string/d-string)

     FW (num de ligne)<d-string>

          FW "LABEL"     [trouver toute ligne contenant     
                               "LABEL"]
          FW 20,30/50,99 "PTR"     [trouver toutes les      
                                lignes contenant "PTR"]

     Ceci est une alternative a Find.Cette commande ne
trouvera le mot specifie que s'il est encadre dans le source
par des caracteres non-alphanumeriques.
     De ce fait,FW "CAT" trouvera:
                         CAT
                         CAT-1
                        (CAT,X)
mais ne trouvera pas :   CATALOG
                         SCAT ect...

CW (Change Word)

     CW (d-string d-string) memes possibilites que CHANGE
mais avec les possibilites de FW

          CW "PRT"PTR   [change tous les PRT par des PTR]
          CW 20,40/50,90 "PRT"PTR  [changements effectues   
                              dans les lignes precisees]

EW (Edit Word)

     EW (d-string)
     EW (num de ligne)<d-string>
     EW (suite)<d-string>
     EW (liste de suites)<d-string>

     Les lignes editees sont celles contenant la chaines
delimitee qui est specifiee par EW.

          EW "PTR"
          EW 10,20 "PTR"


Edit

     Edit
     Edit (num de ligne)      Edit (suite)
     Edit (d-string)          Edit (liste de suites)
     E 10,50 "LABEL"        [edite les lignes entre 10 et 50
                                  contenant"LABEL"]

     Toutes les autres possibilites sont permises,les
lignes,suites,listes sont affichees et vous etes places dans
le mode EDITION.Voir aussi la suite du chapitre sur ce mode.


TEXT

     TEXT

     Convertit tous les espaces du fichier source en espaces
inverses.Le but de cette commande est de taper les fichiers
comme avec un traitement de texte de sorte qu'il ne soit pas
necessaire de remettre les tabulations a zero avant
d'imprimer ce genre de fichier.Cette commande n'a d'effet
sur les editions des tabulations.


FIX

     FIX

     Supprime les effetes de TEXT.Il est recommande
d'utiliser la commande FIX avec tous les fichiers source
edites avec d'autres assembleurs et qui seront convertis en
fichiers MERLIN,apres quoi vous devrez les sauvegarder.
     Note:TEXT et FIX sont des routines ecrites en "SWEET
16" et sont assez lentes,plusieurs minutes peuvent etre
necessaires....FIX decoupe toutes les lignes de plus de 255
caracteres.
     Prodos Note:FIX doit etre obligatoirement utilise par
tous les fichiers provenant du DOS 3.3 et convertis en
PRODOS.

VIDeo

     VIDeo (slot)

          VID3      [selection de video en port 3]

     Cette commande active ou desactive une carte 80
colonnes.Le choix par defaut peut etre selectionne sur le
programme de configuration de Merlin.
     Fonctionne comme un PR# en basic ,mais attention, dans
Merlin, PR# selectionne une imprimante!
     Pour selectionner une carte 80 colonnes en port 3,tapez
VID3,la deselection se fait par ESC,CTRL-Q pour l'APPLE //e
+ carte 80 colonne ou par ESC O pour le Videx Ultra Term.


VAL

     VAL
     VAL "expression"

          VAL"PTR"       [renvoie la valeur du label VAL]
          VAL"LABEL"     [donne l'adresse en HEXA (ou la    
                         valeur) de LABEL ou "Label Inconnu"
                                      dans le cas contraire]
          VAL"$1000/2"   [renvoie $0800]
          VAL"%1000"     [renvoie $0008]

     Cette commande retourne la valeur de toutes les formes
de labels ou d'expressions litterales valides avec
l'assembleur.Notez que la valeur retournee est celle du plus
recent assemblage.


GET

     GET (adresse objet)

          GET            [place l'objet en memoire          
                         principale a l'adresse definie par 
                               ORG dans le source]
          GET$4000       [place l'objet en memoire          
                               principale a l'adresse $4000]

     Cette commande deplace le code objet de la memoire
auxiliaire vers la memoire principale a  l'adresse indiquee.
     Cette adresse doit etre superieure a celle du fichier
source ,s'il y en a un,et l'acces au DOS n'est pas autorisee
 vous pouvez faire un NEW pour le placer plus bas en memoire
mais au prealable pensez a sauver le source.Vous ne pourrez
effectuer cela pour une adresse inferieure a $901 mais vous
pouvez passer sous le moniteur pour le deplacer a l'adresse
souhaitee.
     Chacun de ces deplacements a l'aide du moniteur peut
detruire votre source ou d'autres donnees...a manipuler avec
moultes precautions!
     La commande GET ne verifie pas si un code objet valide
a ete assemble.

SWAP

     SWAP           [option unique]

     Cette commande deplace le fichier source en memoire
principale vers la memoire auxiliaire (on a ainsi une copie
de travail...).On peut l'utiliser avant GET pour cacher le
source pendant le test d'un programme.SWAP est tres utile
avec la version DOS 3.3 de Merlin puisque vous pouvez
travailler sur votre assembleur en conservant Merlin dans
les banques de memoire auxiliaire, quand vous avez
correctement assemble votre programme vous utilisez SWAP
pour cacher votre source en memoire auxiliaire vous quittez
Merlin pour l'Applesoft et lancez votre programme
assemble.Vous terminez avec deux programmes complets l'un
avec Merlin,l'autre avec l'Applesoft.
     Notez que GET et SWAP peuvent etre des commandes
dangereuses pour vos sources!
     Si vous les utilisez pour tester un programme a partir
du moniteur vous devez proteger TOUTES les donnees en PAGE
ZERO ou revenir au mode EXEC par "Y" ,"C" ou "B".Revenir a
l'editeur en utilisant 0G ne protege pas les donnees en page
zero .La sauvegardes des donnees en page zero restant la
meilleure des protections....tout particulierement pour les
pointeurs de $0A a $0F;une autre methode consiste a
"switcher" les pages zero et a les rappeler avant de revenir
a Merlin.
     Merlin utilisant les pages zero aux,de graves ennuis
vous attendent si les pages zero ont ete "switchees" et non
rappelees!
     La commande SWAP va recouvrir le code objet si le
source s'etend jusqu'a $8000 ou au-dela.
     Tapez "WO" pour le verifier avant d'utiliser SWAP.
     SWAP recouvrira aussi XREF programmes ou d'autres USER
programmes.Reciproquement le chargement d'autres programmes
USER ou d'utilitaires peut entrainer la perte du fichier
source "SWAPped" ou meme du principal.
     La commande ASM detruit automatiquement tout fichier
"SWAPped" en memoire auxiliaire.

ADD/INSERT MODES

ADD
     Add
          A              [option unique]

     La commande Add vous place dans le mode Additif et
permet d'ajouter des lignes avec numerotation automatique.
     Pour sortir du mode Add,tapez RETURN comme PREMIER
caractere de la ligne.Vous pouvez utiliser aussi CTRL-X ou
CTRL-C qui eliminent en plus la ligne courante.
     Vous pouvez entrer une ligne vide en tapant un espace
suivi d'un Return.L'ESPACE n'apparaitra pas dans le texte ,
cela "bypasse" la sortie.L'editeur enleve automatiquement
les espaces en trop a la fin des lignes.

Insert

     I (num.de ligne)

          I20            [insere des lignes avant la ligne  
                               20]

     Cela vous permet d'entrer un texte juste au dessus de
la ligne specifiee,sinon Insert fonctionne comme Add.


Add / Insert (Commandes d'edition)

     Toutes les commandes decrites dans la partie "Commandes
du Mode Edition" fonctionnent avec les modes Add et Insert a
l'exception de CTRL-R qui durant une edition restaure la
ligne editee sous sa forme originelle.
     Du fait que toutes les lignes inserees n'existaient pas
prealablement,elles ne seront pas restaurees, CTRL-R est
inoperant.

EDIT MODE

     Apres avoir tape "E" et un numero de ligne,une suite de
lignes ou une chaine ,vous etes places en mode Edition.
     La 1ere ligne de la suite que vous avez specifiee
apparait a l'ecran avec le curseur sur le 1er caractere.
     La tabulation de la ligne est celle du listage et le
curseur se deplace d'un taquet a l'autre avec les fleches de
direction.
     Pendant l'edition vous pouvez frapper RETURN quelle que
soit la position du curseur,la ligne sera validee et
s'inscrira telle quelle a l'ecran.
     Les commandes et fonctions du mode EDIT sont tres
proches mais non identiques du GPLE de Neil Konzen du RWPI'S
A.C.E .
     Toutes les commandes a l'exception de CTRL-R sont
admises dans les modes Add et Insert.


Edit Mode Commandes

     CTRL-I (Insertion)

          Debute l'insertion de caracteres ,se termine par  
     n'importe quel caractere de controle (excepte CTRL-L)  
     tels que Return ou les fleches.
          Notez que la touche TAB initialise un CTRL-I et de
     ce fait lance une commande d'insertion pour Merlin.

     CTRL-D (Delete Detruit)

          Detruit le caractere place sous le curseur.

     Delete Key (touche Delete)

          Detruit le caractere avant le curseur.

     CTRL-F (Find)

          Cherche l'emplacement suivant du caractere tape   
     apres le CTRL-F .Pour deplacer le curseur vers         
     l'occurence suivante de la ligne,appuyez sur la touche 
     du caractere une fois encore.

     CTRL-O (Insertion Speciale)

          Fonctionne comme CTRL-I,a l'exception qu'elle peut
     inserer des caracteres de controle ou des caracteres    
   de commande tels que CTRL-Q.

     CTRL-P (do ***'s)

          SI utilisees comme 1er caractere d'une ligne cette
     commande donne 32 *'s .
          SI utilisee comme n'importe quel autre caractere  
    de la ligne,elle donne 30 espaces encadres par *'s.     
          Notez que ces asterisques remplacent n'importe    
    quels caracteres sur la ligne que vous editez quand vous
    faites CTRL-P.

     CTRL-C ou CTRL-X (Cancel)

          Abandonne le mode EDIT et retourne aux commandes  
    du mode Editeur.La ligne en cours d'edition reprendra sa
    forme originale.

     CTRL-B (Goto debut de ligne)

          Place le curseur au debut de la ...ligne.

     CTRL-N (Goto fin de ligne)

          Place le curseur en fin de ligne!

     CTRL-R (Restaure la ligne)

          Retourne la forme originale de la ligne et ne     
     fonctionne pas dans les modes Add et Insert.

     CTRL-Q (accepte la ligne jusqu'a la position du        
          curseur)

          Detruit la partie de ligne apres le curseur et    
     termine l'edition.

     RETURN (touche Return)

          Valide la ligne telle quelle a l'ecran et va      
     positionner le curseur pour la ligne suivante ou passe 
     dans le mode Command.

Gestion des Espaces dans les Chaines et les Commentaires

     Quand vous ecrivez des chaines ou des commentaires dans
les modes Add ,Insert ou Edit vous remarquerez parfois que
l'editeur ajoute des espaces supplementaires.
     Toutefois l'editeur les supprimer lors du Return.

     L'editeur remplace automatiquement les espaces dans les
commentaires et les chaines ASCII par des espaces en video
inverse.Mais lors du listing ,il les reconvertit,donc, n'en
tenez pas compte.Son but etait d'eviter les mauvaises
tabulations dans les commentaires et les chaines ASCII.

     Dans le cas des chaines ASCII,ceci ne se passe que si
le delimiteur est le " " ou les simples ' '.Vous pouvez
toutefois faire la meme chose en editant la ligne  puis en
remplacant le premier delimiteur par un " ,frapper Return,
editer a nouveau et remplacer le " par celui que vous
desirez.

     Dans une ligne telle que LDA #' ',vous pouvez eviter
les tabulations en trop en ecrivant la ligne avec un espace
avant le premier ' (LDA # ' '),puis utiliser les touches de
controle du curseur pour revenir en arriere et detruire
l'espace en trop.

JACK...24/09/91


Retour sommaire

hr Merlin

L'assembleur.




MERLIN PRO - MANUEL DE L'UTILISATEUR                        L'ASSEMBLEUR

L'assembleur :
Cette partie du manuel n'a pas pour but de vous apprendre le langage
assembleur. Elle va juste vous expliquer les règles de syntaxe à utiliser
dans vos sources, et vous décrire les options qui vous sont accessibles dans
l'assembleur.

A propos de cette partie du manuel :

Ce chapitre sur l'assembleur est découpé en trois grandes parties :

     1/ Définitions préliminaires,
     2/ Conventions syntaxiques de l'assembleur,
     3/ Description des pseudo opcodes.

Les deux dernières parties sont chacune divisées comme suit :


     Convention syntaxique de l'assembleur,

          1/ Organisation des nombres
          2/ Organisation du source
          3/ Expressions autorisées par l'assembleur
          4/ L'adressage immédiat
          5/ Mode d'adressage du 6502 et du 65C02

     Description des pseudo OPCODES.

          1/ Les directives
          2/ Gestion des entrées-sorties
          3/ Gestion des chaines de caractères
          4/ Gestion des données et des zones de stockage
          5/ Pseudo-opcodes variés
          6/ Structures conditionnelles
          7/ Pseudo-opcodes pour les macros
          8/ Variables


Les conventions syntaxiques de l'assembleur illustrent la syntaxe d'une ligne
de code, la bonne méthode pour spécifier nombres et données, comment
construire différentes expressions, et la syntaxe correcte utilisée pour
spécifier les différents modes d'adressage autorisés par le 6502 ou le 65C02.
Cette partie devrait etre comprise avant d'utiliser l'assembleur, car sinon
vous auriez des problèmes à déterminer la bonne méthode pour, par exemple,
construire une expression correcte.
La description des pseudo opcodes illustre les fonctions des nombreux pseudo
opcodes de Merlin, la syntaxe correcte pour les utiliser et les exemples pour
chacun d'eux.

Définitions préliminaires :
Les types d'opérande de presque tous les pseudo opcodes de Merlin ainsi que
ceux des microprocesseurs 6502 et 65C02 peuvent etre placés dans une de ces
quatre catégories :

     1/ Expressions
     2/ Chaines délimitées (d-chaines)
     3/ Données
     4/ Nom de fichier ou de répertoire

Expressions :
Les expressions sont définies dans la partie conventions syntaxiques de ce
manuel.

Chaines délimitées :
Les chaines délimitées sont définies dans la partie Editeur du manuel, mais
cette définition est répétée ici pour plus de linéarité :
La plupart des pseudo opcodes, et quelques opcodes du 6502 et 65C02
permettent que leurs opérandes soient des chaines. Celles-ci doivent etre
délimitées par un caractère non numérique autre qu'un slash (/) ou une
virgule (,). Une telle chaine est appelée "d-chaine". Le délimiteur courant
est le simple ou double apostrophe (' ou ").


Exemples :

     "ceci est une d-chaine"
     'ceci est une autre d-chaine'
     àune autreà
     Zen voici une délimitée par un z majusculeZ
     "A"
     'A'

Remarquez que les chaines délimitées utilisées comme objet pour n'importe
quel opcode 6502 ou 65C02 DOIVENT etre délimitées par un simple ou double
apostrophe. Dans le cas contraire, l'assembleur interprètera la d-chaine
comme un LABEL, une expression ou meme une donnée.
Notez bien que certains pseudo opcodes tout comme les opcodes 6502 et 65C02
utilisent le délimiteur pour déterminer le bit de poids fort des caractères
de la chaine (ASCII haut ou bas). Dans de tels cas, le délimiteur devrait
etre restreint à un simple ou double apostrophe.

Données :
Les données sont définies comme une suite d'hexadécimaux composés des
chiffres de 0 à 9 et des lettres de A à F.

Noms de fichiers :  (DOS 3.3 seulement)
Les noms de fichiers sont définis comme le nom d'un fichier DOS 3.3 sans
délimiteur, comme par exemple sans apostrophes autour du nom. Les sources
portent le suffixe ".S". Les fichiers TXT, USE et PUT sont préfixés "T.".
L'éventuel préfixe ou suffixe ne doit pas etre utilisé dans le nom du
fichier.

Noms de répertoires :    (ProDOS seulement)
Les noms de répertoires sont définis comme les noms de répertoires ProDOS et
sont donc restreints à la définition de ceux-ci dans le manuel de
l'utilisateur ProDOS. Les noms de répertoires utilisés par Merlin n'ont pas
de délimiteurs, comme par exemple des apostrophes autour du nom. Les sources,
noms de répertoires PUT et USE sont suffixés par ".S". Ce suffixe ne doit pas
etre une partie du nom de répertoire.


Conventions syntaxiques de l'assembleur :

Organisation du source :
Syntaxe d'une ligne de source
Une typique ligne de source ressemble à cela :

     LABEL     OPCODE    OPERANDE       ;COMMENTAIRE

Voici quelques exemples :

1    START     LDA       #50            ;CECI EST UN COMMENTAIRE
2    * CECI EST UNE LIGNE UNIQUEMENT DE COMMENTAIRES
3                                       ;TABULE PAR L'EDITEUR

Une ligne comportant uniquement des commentaires peut commencer par "*" comme
ci-dessus dans la ligne 2. Cependant, les ligne commençant par ";" sont
acceptées et tabulées dans la zone de commentaires comme dans la ligne 3
ci-dessus. L'assembleur accepte les lignes vides dans le source et il les
traitera comme une instruction SKP 1 (voir la partie sur les pseudo opcodes),
excepté que le numéro de ligne sera imprimé.
Le nombre d'espaces séparant les différentes zones n'est pas important, sauf
pour l'éditeur qui ne requiert qu'un espace.

Convention des labels dans un source :
La taille maximale d'un label est de 13 caractères, mais plus de 8
produiraient un listing moins lisible. Un label doit commencer avec un
caractère au moins aussi grand, en valeur ASCII, que le deux-points (:), et
ne doit pas contenir de caractère plus petit, en valeur ASCII que le nombre
"0". Remarquez que les points (.) ne sont pas autorisés dans les labels car
ils sont utilisés pour spécifier le OU logique dans les expressions.

Une ligne peut contenir juste un label. Cela équivaut à égaler ce label au
contenu courant du compteur d'adresse.


Conventions pour les opcodes et pseudo opcodes dans un source :

L'assembleur regarde uniquement les trois premiers caractères de l'opcode
(avec certaines exceptions comme pour les appels de macros et les SWEET 16
POPD). Par exemple, vous pouvez utiliser PAGE à la place de PAG (mais à cause
des exceptions, la quatrième lettre ne doit pas etre un "0"). Le listing du
source ne sera pas très beau avec un opcode de plus de cinq caractères, sauf
s'il n'y a pas d'opérande.

Convention sur la taille des caractères et opérandes :

La taille maximale que peuvent atteindre opérande + commentaire est de 64
caractères. Vous aurez une erreur "opérande trop grand" (N.D.T. : operand too
long) si vous en utilisez plus. Une ligne de commentaire seule est aussi
limitée à 64 caractères.


Organisation des nombres :
L'assembleur accepte les nombres décimaux, hexadécimaux et binaires. Les
hexadécimaux doivent etre précédés d'un "$" et les binaires d'un "%", donc
les quatre nombres suivants sont équivalents :

     100       $64       %1100100       %01100100

Comme montré dans le dernier nombre binaire, les zéros en tete sont ignorés.

Donnée immédiate et adresse :
Pour faire comprendre à l'assembleur de traiter un nombre comme une donnée
plutot qu'une adresse, ce nombre doit etre préfixé par un "#". Le "#" est là
pour spécifier un "nombre" ou "donnée", par exemple :

     LDA #100       LDA #$64       LDA #%1100100

Ces trois instructions vont toutes charger l'accumulateur avec le nombre 100
(décimal).

Un nombre non précédé d'un "#" sera interprété comme une adresse. Ainsi :

     LDA 1000       LDA $3E8      LDA %1111101000

sont des façons équivalentes de charger A avec l'octet situé en $3E8.


Utilisation des nombres décimaux, hexadécimaux et binaires :

Utilisez le format approprié pour la clarté. Par exemple la table de données
:

               DA        $1
               DA        $A
               DA        $64
               DA        $3E8
               DA        $2710

est correcte mais plus mystérieuse que son équivalent décimal :

               DA        1
               DA        10
               DA        100
               DA        1000
               DA        10000

de la meme façon,

               ORA        #$80

est moins clair que

               ORA        #%10000000

qui met à 1 le bit de poids fort de l'accumulateur.


Expressions autorisées par l'assembleur.

Pour rendre plus claire la syntaxe qu'accepte et/ou requiert Merlin, on doit
définir sa signification par une "expression".

Expressions primitives :
Les expressions sont construites à partir d'"expressions primitives" par
utilisation d'opérations arithmétiques et logiques. Les expressions
primitives sont :

     1 un label
     2 un nombre (qu'il soit décimal, $hexa ou %bin)
     3 n'importe quel caractère ASCII précédé ou entouré par des guillemets
ou apostrophes
     4 le caractère "*" (tenant lieu d'adresse courante)

Tous les formats de nombres acceptent 16 bits de données et les zéros de tete
ne sont jamais requis. Dans le cas n[3, la "valeur" de l'expression primitive
est juste la valeur ASCII du caractère. Le bit de poids fort sera à 1 si des
guillemets (") sont utilisés, et à 0 si une apostrophe (') est utilisée.

Expressions arithmétiques et logiques :
L'assembleur connait les quatre expressions arithmétiques : +, -, / (division
entière), et * (multiplication). Il connait aussi les trois opérations
logiques : ! (ou exclusif), . (ou), et & (et).

Construction d'expressions :
Les expressions sont construites en utilisant les expressions primitives
définies ci-dessus, avec ou sans opération arithmétique et/ou logique. Ceci
veut dire que les expressions peuvent prendre la forme de primitives ou de
primitives avec opérations sur d'autres primitives en utilisant les
opérateurs arithmétiques et logiques.


Exemples d'expressions légales :

     #01                      (expression primitive = 1)
     #$20                     (expression primitive = 32 décimal)
     LABEL                    (primitive constituée d'un label)
     #"A"                     (primitive constituée de la lettre "A")
     *                        (primitive = valeur courante du PC)

Les suivantes sont des exemples d'expressions plus complexes :

     LABEL1-LABEL2            (label1 moins label2)
     2*LABEL+$231             (2 fois label plus 231 en hexa)
     1234+%10111              (1234 plus le binaire 10111)
     "K"-"A"+1                (ASCII "K" moins ASCII "A" plus 1)
     "O"!LABEL                (ASCII "O" EOR LABEL)
     LABEL&$7F                (LABEL ET 7F en hexa)
     *-2                      (adresse courante moins 2)
     LABEL.%10000000          (LABEL OU 10000000 en binaire)

Parenthèses et priorités dans les expressions :
Les parenthèses ne sont normalement pas acceptées dans les expressions. Elles
ne sont pas utilisées pour modifier les priorités dans l'évaluation des
expressions. Toutes les opérations arithmétiques ou logiques sont évaluées de
gauche à droite (2+3*5 sera assemblé comme 25 et non 17).
Les parenthèses sont utilisées pour retrouver une valeur de la mémoire à
l'emplacement spécifié par la valeur de l'expression sans les parenthèses,
comme un adressage indirect. Cet emploi est restreint à certains pseudo
opcodes par exemple :

               DO        ($300)

dit à l'assembleur de générer le code si la valeur de l'adresse $300, à ce
moment de l'assemblage, est différente de zéro.


Exemple d'utilisation d'expressions.
La possibilité pour l'assembleur d'évaluer les expressions comme LAB2-LAB1-1
est très utile dans les types de sources suivants :

     COMPARE   LDX       #EODATA-DATA-1
     BOUCLE    CMP       DATA,X
               BEQ       TROUVE         ;trouvé
               DEX
               BPL       BOUCLE
               JMP       REJETTE        ;non trouvé
     DATA      HEX       CACFC5D9
     EODATA    EQU       *

avec ce type de source, vous pouvez ajouter ou enlever des données, et la
valeur qui est chargée dans le registre X dans la boucle de comparaison sera
automatiquement ajustée.

Syntaxe de données immédiates.
Pour les opcodes comme LDA, CMP, &c., qui acceptent les données immédiates
(comme les nombres et contrairement aux adresses), le mode immédiat est
signalé en faisant précéder l'expression d'un "#".
Par exemple on a LDX #3. De plus :

     #<expression   donne l'octet de poids faible de l'expression
     #>expression   donne l'octet de poids fort de l'expression
     #/expression   est une syntaxe optionnelle pour obtenir l'octet de poids
fort de l'expression

Modes d'adressage du 6502.
L'assembleur accepte tous les opcodes 6502 et 65C02 avec les mnémoniques
standard. Il accepte aussi BLT (branchement si plus petit que.  N.D.T. :
Branch if Less Than) et BGE (branchement si plus grand ou égal. N.D.T. :
Branch if Greater or Equal) comme équivalents respectifs de BCC et BCS.


Il existe 12 modes d'adressage légaux. Leurs syntaxes appropriées sous Merlin
est :

                         syntaxe                  exemple
                         -------                  -------
implicite                OPCODE                   CLC
accumulateur             OPCODE                   ROR
immédiat (donnée)        OPCODE #expr             ADC #$F8
                                                  CMP #"M"
                                                  LDX #>LABEL1-LABEL2-1
page zéro (adresse)      OPCODE expr              ROL 6
     indexé en X         OPCODE expr,X            LDA $E0,X
     indexé en Y         OPCODE expr,Y            STX LAB,Y
absolu (adresse)         OPCODE expr              BIT $300
     indexé en X         OPCODE expr,X            STA $4000,X
     indexé en Y         OPCODE expr,Y            SBC LABEL-1,Y
indirect                 JMP (expr)               JMP ($3F2)
     préindexé en X      OPCODE (expr,X)          LDA (6,X)
     postindexé en Y     OPCODE (expr),Y          STA ($FE),Y

Adressage spécial forcé non-page zéro.
Il n'y a pas de différence de syntaxe entre les modes page zéro et absolu.
L'assembleur utilise automatiquement la page zéro quand cela est nécessaire.
Merlin offre la possibilité de forcer le mode non-page zéro. Pour ce faire,
il suffit d'ajouter un signe (sauf  un "D") à la fin de l'opcode. Exemple :

     LDA       $10       s'assemble comme page zéro (2 octets) tandis que
     LDA:      $10       s'assemble comme non-page zéro (3 octets).

De plus, dans les modes indexés indirects, seule une expression page zéro est
autorisée, et l'assembleur produira un message d'erreur si l'"expr" ne
renvoie pas à une adresse en page zéro.

NOTE : le "mode accumulateur" ne requiert pas d'opérande (la lettre "A").
Certains assembleurs demandent un "A" comme opérande pour ce mode.
L'assembleur décidera de la légalité du mode d'adressage pour n'importe quel
opcode donné.


Les opcodes SWEET 16.
L'assembleur accepte les opcodes SWEET 16 avec les mnémoniques standard. Les
registres usuels SWEET 16 R0 à R15 n'ont pas à etre "égalés" et le "R" est
optionnel. Pour l'opcode SET, un espace ou une virgule ne peuvent etre
utilisés entre les parties registre et donnée de l'opérande ; c'est à dire,
SET R3, LABEL est équivalent à SET R3 LABEL. On notera que l'opcode NUL est
assemblé en un seul octet (de meme que HEX 0D) et non en 2 octets comme il
serait interprété par la ROM SWEET 16. Ceci est intentionnel, et effectué
pour des raisons internes.

Note : les opcodes SWEET 16 ne seront pas reconnus par l'assembleur tant que
le pseudo opcode SW n'a pas été assemblé. Ce pseudo opcode permettra
l'assembleur des SWEET 16.

Opcodes 65C02 et 65802
L'assembleur assemble aussi bien les sources 65C02 et 65802. Le pseudo opcode
XC active ces caractéristiques. Cet opcode est repris dans la section
suivante sur les pseudo opcodes.


Description des pseudo opcodes de l'assembleur.

Directives :

EQU (=)   (égal. N.D.T. : EQUate)

     label     EQU       expression
     label      =        expression     (syntaxe alternée)

     START     EQU       $1000          (égale START à $1000)
     CHAR      EQU       "A"            (égale CHAR à la valeur ASCII de A)
     PTR        =        *              (PTR égale au présent PC)

utilisé pour définir la valeur d'un LABEL, d'habitude une adresse externe ou
une constante souvent utilisée pour laquelle un nom explicite est désiré. Il
est recommandé que tous ceux-ci soient localisés au début du programme.
L'assembleur ne permet pas une "égalisation" à un nombre en page zéro après
que le label égalé ait été utilisé, une telle situation peut meme déboucher
sur un mauvais source (voir aussi à "variables")

Notez que les labels respectent les majuscules. Donc, l'assembleur
considèrera les labels suivants comme différents :

     START          (label majuscule)
     Start          (label mixte)
     start          (label minuscule).

EXT       (label externe. N.D.T. : EXTernal label)

     label     EXT       (le label est un nom de label externe)
     PRINT     EXT       (définit PRINT comme externe)

Ce pseudo opcode définit un label comme externe pour utilisation par le
linker. La valeur du label, au moment de l'assemblage, est mise à $8000, mais
la valeur finale est calculée par le linker. La table des symboles listera le
label comme ayant la valeur $8000 ainsi que ses références externes (0 -
$FE). Voir la partie LINKER du manuel pour plus d'informations sur cet
opcode.


ENT       (label d'entrée. N.D.T. : ENTry label).

     label     ENT
     PRINT     ENT       (définit Print comme label d'entrée)

Ce pseudo opcode définira le label dans la colonne des labels comme un label
d'entrée. Un label d'entrée est un label pouvant référer à un label externe
servant dans un autre module du source. Les véritables adresses d'un label
d'entrée seront calculées par le linker.
Une fois le module source relatif écrit, ou assemblé, on peut utiliser le
label ENT comme si c'était un label ordinaire. Il peut etre égalé, on peut
sauter à ce label, ou brancher, etc. Le listing de la table des symboles
écrira l'adresse relative du label et la marquera d'un "E".
Voyez la partie LINKER de ce manuel pour plus d'informations sur cet opcode.


ORG       (déterminer l'origine. N.D.T. : set ORiGin)

               ORG       expression
               ORG
               ORG       $1000          (début du source en $1000)
               ORG       DEBUT+FIN      (début à la valeur de l'expression)
               ORG                      (nouvelle origine)

Etablit l'adresse à laquelle le programme sera logé. La valeur par défaut est
$8000. Habituellement il n'y aura qu'un ORG situé au début du programme. Si
plus d'un ORG est utilisé, le premier établit l'adresse du BLOAD, tandis que
le sécond établit la réelle origine. Ceci peut etre utilisé pour créer un
code qui se charge à une adresse alors qu'il fonctionne à une autre adresse.
Vous ne pouvez pas utiliser ORG *-1 pour copier les pointeurs d'objets comme
dans certains assembleurs. Ceci sera fait par DS-1.



     ORG sans opérande est traité comme une commande "REORG".


BIG KIKI & PHILDEBOUZ... 02/92



   (ORG Continu)
   -------------
     ORG sans opérande est accepté et traité comme un REORG. Ceci
 est prévu pour utiliser le rétablissemnt de l'adresse correcte du
 pointeur après un segment de code ayant un différent ORG. (Lorsqu'
 ils sont utilisés dans un fichiers REL, les labels compris dans
 une section entre une "Adresse ORG" et une "Non-Adresse ORG" sont
 considérés comme des adresses absolues. Ceci est UNIQUEMENT destiné
 à ètre utilisé dans une section à déplacer vers une adresse expli-
 cite.)

     Exemple ORG sans opérande:

                      1            ORG  $1000
     1000:  A0 00     2            LDY  #0
     1002:  20 21 10  3            JSR  MOVE           ;"MOVE" IS
     1005:  4C 12 10  4            JMP  CONTINUE       ; NOT LISTED
                      5            ORG  $300           ; ROUTINE TO
     0300:  8D 08 C0  6  PAGE 3    STA  MAINZP         ; BE MOVED
     0303:  20 ED FD  7            JSR  COUT
     0306:  8D 09 C0  8            STA  AUXZP
     0309:  60        9            RTS
                      10           ORG                 ; REORG
     1012:  A9 C1     11 CONTINUE  LDA  #"A"
     1014:  20 00 03  12           JSR  PAGE3



   REL    RELocate code module
   ---------------------------
     Ce code demande à l'assembleur de générer un code fichiers
 compatible avec le "linker" relocalisé. Ce code doit ètre introduit
 en premier lors de l'utilisation ou de la définition de quelque
 Label que ce soit. Regardez la section "LINKER" de ce manuel pour
 plus d'infos sur ce code.




   OBJ  ( set OBJect)
   ------------------
     OBJ expression:

          OBJ $4000      (Utilisé pour Adresse Hexa)
          OBJ START      (Utilisé avec un Label)

     Le code OBJ n'est accepté qu'en premier au début d'un code et
 ne défini qu'une division entre la table de symbole et l'espace
 Object code en mémoire (A défaut $8000). L'adresse OBJ n'est accep-
 tée que si elle est comprise entre $4000 et $BFE0. La plupart des
 gens ne se serviront pas de ce code. Si le code REL est utilisé,
 alors le code OBJ n'est plus "regardé". Si DSK est utilisé, alors
 vous pouvez, (mais ceci n'est pas nécessaire), faire un OBJ en
 $FBE0 pour optimiser l'espace de la table de symbole.



   PUT  (PUT a text file in assembly)
   ----------------------------------
     PUT Filename:
        DOS 3.3  exemples
          PUT  SOURCEFILE      (PUT's file T.SOURCEFILE)
          PUT  !SOURCE         (PUT's file SOURCE)
          PUT  !SOURCE,D2      (PUT's file provenant du DRIVE 2)

        PRODOS  exemples
          PUT  SOURCEFILE      (PUT's file SOURCEFILE)
          PUT  /PRE/SOURCE     (PUT's file provenant de PRE)

     "PUT Filename" lit le fichier nommé et "l'insère" à l'endroit
 du code.
     Note DOS 3.3: Les paramètres Drive et Slots sont acceptés en
 syntaxe standard de DOS. Le "Filename" spécifié doit ètre un fichier
 Texte avec le préfixe "T." S'il ne possède pas ce "T." dans le
 catalogue du disque, le "Filename" spécifié doit démarrer avec un
 caractère plus petit que "A Commercial". Ceci indique à Merlin que
 le fichier à voir sera sans "T." Le caractère "!" peut ètre utilisé:

     Disk File name = T.SOURCE CODE     (Nom du catalogue)
     PUT  File name = SOURCE CODE       (Nom dans le code PUT)

     Disk File name = SOURCE CODE       (Nom du catalogue)
     PUT  File name = !SOURCE CODE      (Nom dans le PUT)



   (PUT Continu)
   -------------
     Note PRODOS: les paramètres Drive et Slots ne sont pas acceptés
 vous devez utiliser les noms d'accès, des catalogues et des fichiers
     Note: "Insert se réfère à l'aasemblage et non à l'endroit d'une
 source. Le fichier lui-meme est actuellement placé juste après la
 source principale. Ces fichiers ne sont en mémoire qu'un certain tps
 donc un très long programme peut ètre assemblé facilement en utili-
 sant PUT.

     Voila 2 restriction sur un fichier PUT. Premièrement, il ne peut
 y avoir de MACRO définition dans un fichier PUT, elle doit se trouv-
 er dans la source principale ou dans un fichier USE. Deuxièmement,
 un fichier PUT ne peut appeler d'autres fichiers PUT avec des codes
 PUT. Bien sur, le rattachment peut ètre simulé en ayant dans le
 programme principal ("Main Program") uniquement les définitions mac-
 ro et l'appel.
     Chaque variable (Comme )LABEL ), doit ètre utilisée comme des
 variables "locales" ("Local variables"). Les variables usuelles )1 à
 )8 doivent ètre sélectionnées dans ce but en utilisant le code va-
 riable VAR.



   USE (USE a text file as macro library)
   --------------------------------------
     USE Filename
        USE  T.MACRO LIBRARY        (Exemple DOS 3.3)
        USE  !MACROS                (DOS 3.3 sans "T.")
        USE  T.MACROS,S5,D1         (DOS 3.3 avec Slot et Drive)
        USE  /LIB/MACROS            (ProDos)

     Cette manipulation s'effectue comme un PUT mais le fichier est
 conservé en mémoire. Ceci est fait pour charger une librairie Macro
 utilisée par le fichier Source.



   VAR  (Setup VARiables)
   ----------------------
     VAR expr;expr;expr...
          VAR  1;$3;LABEL       (Set up VAR's 1,2 et 3)
     C'est la juste manipulation pour "égaliser" les variables )1 à
 )8. VAR 3;$42;LABEL sélectionnera )1=3, )2=$42 et )3=Label. Ceci
 pour ètre utilisé prioritairement avant un PUT. Si un fichier PUT
 utilise  )1 à )8, excepté dans les lignes PMC (ou>>>) pour l'appel
 des macros, il DOIT y avoir une déclaration précédant ceux-ci.



   SAV  (SAVe object code)
   -----------------------
     SAV Filename
        SAV  file        (Synthaxe ProDos ou DOS 3.3)
        SAV  /OBJ/PROG   (Synthaxe ProDos)

     "SAVe Filename" sauvera "l'object code" présent, sous le nom
 spécifié. Ceci est fait exactement comme la commande sauvegarde du
 "EXEC mode object", mais cela peut prendre beaucoup de temps durant
 l'assemblage.

     Ce pseudo-code apporte un moyen de sauvegarder des portions de
 programme ayant plus d'un ORG. Cela permet l'assemblage de fichiers
 très larges. Après la sauvegarde, l'adresse object est resettée à la
 dernière spécification de OBJ ou à $8000 par défaut.

     Les fichiers sauvés avec la commande SAVe seront sauvés pour
 pouvoir charger à une adresse correcte.

     Toutefois, les codes PUT et SAV (ou DSK) le rendent possible
 pour l'assemblage de fichiers très larges.



     TYP (set ProDos file type for DSK et SAV) (ProDos uniquement)
     -----------------------------------------
        TYP expression
          TYP  $00                  (Pas de fichiers Type)
          TYP  $06                  (Fichier Type binaire)

        Ceci sélectionne le fichier type à utiliser par les codes
 DSK ou PUT. Le type BIN est le type par défaut. Les fichiers type
 valables sont 0, 6, $F0-$F7, et $FF (Sans type, Bin, CMD, Fichiers
 utilisateur et Sys).



     DSK  (Assemble directly to DiSK)
     --------------------------------
        DSK  Filename  (Ou Pathname en ProDos)
          DSK  PROG           (DOS 3.3 ou ProDos)
          DSK  /OBJ/PROG      (Exemple ProDos)

        "DSK Filename" ordonne à l'assembleur d'assembler le code
 suivant directement sur le disque. Si DSK est déjà en cours, l'an-
 cien fichiers sera fermé et un nouveau commencera. Ceci est courant
 pour des fichiers extremement larges.

        NOTE: Les fichiers faits pour ètre utilisés avec le chargeur
 de rattachement DOIVENT ètre sauvés avec le pseudo DSK, voir le code
 REL.



     END  (End of a Source File)
     ---------------------------
        END            (Option unique pour ce code)
        Il est rare d'utiliser une commande ordonnant à l'assembleur
 d'ignorer le restant d'un fichier source. Les Labels arrivant après
 le code END seront ignorés.



     DUM  (DUMmy section)     ("section morte")
     --------------------
        DUM expression
          DUM  $1000      (Démarrer le code DUMmy ("mort") à $1000)
          DUM  LABEL      (Démarrer code à la valeur du Label)
          DUM  END-START  (Démarrer à la valeur END-START)

        Ceci démarre des sections de code qui examineront les valeurs
 de labels mais ne produira pas d'object code. L'expression doit don-
 ner l'ORG désiré de cette section. Il est possible de RE-ORG tel une
 section utilisant un autre code DUM ou utilisant ORG. Bien qu'aucun
 object code n'est créé depuis une section DUMmy, la sortie texte de
 l'assembleur apparaitra comme si le code était créé.



     DEND  (Dummy END)
     -----------------
        DEND              (Option unique pour ce code)
        Ceci cloture une section Dummy et rétablit l'adresse ORG à
 la valeur donnée en entrant en section Dummy.

        Exemple d'utilisation de DUM et DEND:
          1            ORG   $1000
          2 
          3  IOBADRS   =     $B7EB
          4
          5            DUM   IOBADRS
          6  IOBTYPE   DFB   1
          7  IOBSLOT   DFB   $60
          8  IOBDRV    DFB   1
          9  IOBVOL    DFB   0
         10  IOBTRCK   DFB   0
         11  IOBSECT   DFB   0
         12            DS    2         ;Pointer to DCT
         13  IOBBUF    DA    0
         14            DA    0
         15  IOBCMD    DFB   1
         16  IOBERR    DFB   0
         17  ACTVOL    DFB   0
         18  PREVSL    DFB   0
         19  PREVDR    DFB   0
         20            DEND
         21 
         22  START     LDA   #SLOT
         23            STA   IOBSLOT
         24  *  et ainsi de suite



        FORMATTAGE PSEUDO OPS
        ---------------------

     LST ON/OFF   (LiSTing Control)
     ------------------------------
        LST ON ou OFF
          LST ON             (listing On)
          LST OFF            (Listing Off)
          LST                (Listing On, option)

        Ces commandes sont effectives si le listing assemblé est
 envoyé à l'écran ou non. Vous pouvez utiliser ceci pour envoyer
 par exemple une portion du listing à l'imprimante. Chaque nombre
 d'instruction LST peuvent ètre dans la source. Si la condition LST
 est en position Off à la fin de l'assemblage, la table de symbole ne
 sera pas imprimée.

        L'assembleur n'analyse actuellement que le troisième carac-
 tère de l'opérande pour voir si il y a ou non c'est un espace. Donc
 LST a le meme effet que LST ON. La directive LST n'aura pas d'effet
 sur l'actuelle génération d'object code. Si la condition LST est en
 position Off, l'object code sera généré plus rapidement, mais ceci
 n'est recommandé que pour des programmes débuggés.

        NOTE: CONTROL-D bascule ce "flag" durant la seconde passe.



     EXP ON/OFF/ONLY  (Macro EXPand control)
     ---------------------------------------
        EXP ON ou OFF ou ONLY
          EXP ON      (Macro Expand On)
          EXP OFF     (Imprime uniquement l'appel macro)
          EXP ONLY    (Imprime uniquement l'appel généré)

        EXP ON imprimera la macro entière durant l'assemblage. La
 condition OFF imprimera uniquement le pseudo code PMC EXP en défaut
 ON. Ceci n'a aucun effet sur les object codes générés. EXP ONLY cau-
 sera une expansion de la macro dans le listing en omettant la ligne
 d'appel et la fin de la ligne macro (Si la ligne d'appel macro est
 labellée, elle sera toutefois imprimée). Ce mode imprimera comme si
 les lignes macro avaient été écrites en dehors de la source.



     LSTDO ou LSTDO OFF   (LiST DO OFF areas of codes)
     -------------------------------------------------
        LSTDO OFF
          LSTDO           (Lister les espaces DO OFF)
          LSTDO OFF       (Ne pas lister les espaces DO OFF)

        Ce code déclenche le listing des espaces de codes DO OFF à
 imprimer ou à na pas imprimer.



     PAU  (PAUse)
     ------------
        PAU               (Option unique pour ce code)
        Dans le second passage, ceci met en pause jusqu'à ce qu'une
 touche soit frappée. Ceci est pratique pour débugger.



     PAG  (New PAGe)
     ---------------
        PAG               (Option unique pour ce code)
        Ceci envoie un $8C à l'imprimante. Ca n'a aucun effet sur
 l'écran meme si on utilise une carte 80 colonnes.



     AST  (Send a line of ASTerisks)
     -------------------------------
        AST expression
          AST  30         (Envoyer 30 astérix (et obelix) au listing)
          AST  NUM        (Envoyer un astérisque (et perils) NUM)

        Ceci envoie un nombre d'astérisques à l'imprimante, équival-
 lent à la valeur de l'opérande. AST10 enverra 10 astérisques par
 exemple.



     SKP  (SKiP lines)
     -----------------
        SKP Expression
          SKP  5           (Sauter 5 lignes ds le Listing)
          SKP  LINES       (Sauter "LINES" lignes ds le Listing)

        Le nombre format est le mème que AST.



     TR  ON/OFF   (Tronquer) (Truncate Control)
     -----------------------
        TR  ON ou OFF
          TR  ON           (Limiter impression Object Code)
          TR  OFF          (Ne pas limiter l'impression)

        TR ON ou TR (Tout seul) limite l'impression object code à 3
 bytes par ligne source, mème si la ligne en génère plus de 3. TR OFF
 remet en route l'impression de tout les bytes object.



     DAT  (DATa stamp assembly Listing)  (ProDos uniquement)
     ----------------------------------
        DAT                (Option unique pour ce code)

        Cela imprime la Date et l'Heure dans la seconde passe de
 l'assembleur. Valable uniquement pour Merlin ProDos.



     CYC  (Calculer et imprimer les temps de CYCles pour un code)
     ------------------------------------------------------------
        CYC                (Imprimer cycle & total de code)
        CYC OFF            (Stopper impression temps de cycle)
        CYC AVE            (Imprimer cycle & moyenne)

     Ce code provoquera pendant l'assemblage un programme de comptage
 cycles à imprimer durant l'assemblage. Un second code CYC provoquera
 le total accumulé pour retourner à zéro. CYC AVE fera une moyenne ds
 les cycles inderterminables à cause de l'embranchement, indèxés et
 indirectemnt assemblés.



     CYC Continu
     -----------
     Les temps cycles seront imprimés à droite du champ de commentai-
 re; Exemple:

     5  ,03266     ou     5'  ,0326      ou      5''  ,0326

     Le 1er chiffre affiché (Le 5 ds l'exemple donné ci-dessus) est
 le comptage de 5 pour l'instruction en cours. Le second chiffre af-
 fiché est le total de cycles accumulés, en décimal.

     Une simple apostrophe  après le comptage de cycles indi-
 que une possibilité de cycle supplémentaire, dépendant de certaines
 conditions. Si cela apparaissait dans une instruction de branchement
 alors il sera indiqué qu'un cycle peut etre additionné si le bran-
 chement se faisait. Pour les instructions de non-branchement, l'apo-
 strophe indique qu'un cycle peut etre additionné si la limite de la
 page est dépassée.

     Une double apostrophe après le comptage de cycle indique que
 l'assembleur a déterminé qu'un branchment sera pris et que le bran-
 chement a sauté une limite de page. Dans ce cas, le cycle est affi-
 ché et ajouté au total.

     Le code CYC travaille pour les extra-codes 65c02. Il ne travail-
 lera pas pour les codes additionnels 65c02 présents dans le Rockwell
 65c02 (i.e. RMB#, SMB#, BBR# et BBS#). Ces codes ne sont pas accepté
 par Merlin, excèpté en utilisant la macro librairie Rockwell. Tous
 ces codes non accèptés sont des instructions 5 cycles avec une ou
 deux possibilités d'extra cycles pour les instructions de branche-
 ment BBS et BBR.

     Le code CYC travaille pour les codes 65802, mais il n'addition-
 nera PAS les extra cycles requis quand M=0 ou X=0.



    

  ------------------------
   STRING DATA PSEUDO OPS
  ------------------------

    Notes générale sur les données String et les délimiteurs String

     Différents délimiteurs on différents effets. Chaque délimiteur
 plus petit qu'un (en valeur ASCII) simple apostrophe produit un
 String avec le Bit-Haut ON, sinon le Bit-Haut sera OFF. Par exemple
 les délimiteurs !"#$%& produiront un String en ASCII "négative" et
 les délimiteurs '()+? en produiront un en ASCII "positive". Habi-
 tuellement les guillemets (") et l'apostrophe (') sont les délimit-
 eurs de choix, mais les autres délimiteurs stipulent le moyen d'in-
 sérer un String contenant un guillemet ou une apostrophe de part et
 d'autre du String. Exemples d'effets de délimiteurs:

     "HELLO"             (Negatice ASCII, Hi bit set)
     !HELLO!             (Negative ASCII, Hi bit set)
     #HELLO#             (Negative ASCII, Hi bit set)
     &HELLO&             (Negative ASCII, Hi bit set)
     !ENTER "HELLO"!     (String with embedded quotes)
     'HELLO'             (Positive ASCCI, Hi bit clr)
     (HELLO(             (Positive ASCII, Hi bit clr)
     'ENTER "HELLO"'     (String with embedded quotes)

   Tous les codes de cette section, execpté REV, accèptent les don-
 nées hexa après le String. Toutes les synthaxes suivantes sont
 acceptables:

     ASC "string"878D00
     FLS "string",878D00
     DCI "string",87,8D,00
     STR "string",878D00
     INV "string",878D00



     ASC (Definir texte ASCii)
     -------------------------
        ASC d-string
          ASC  "STRING"         (Negative ASCII string)
          ASC  "STRING"         (Positive ASCII string)
          ASC  "Bye,Bye",8D     (Negative with added hex bytes)

     Ceci mets un String ASCII délimité dans l'object code. L'unique
 restriction sur le délimiteur, c'est qu'il ne doit pas arriver lui-
 meme sur le String.



     DCI  (Dextral Character Inverted)
     ---------------------------------
        DCI d-String
          DCI  "STRING"         (Neg. ASCII, execpté pour le "G")
          DCI  'STRING'         (Pos. ASCII, execpté pour le "G")
          DCI  'Hello',878D     (Pos. with two added hex bytes)

        C'est la mème chose que ASC, sauf que le String est mis en
 mémoire avec le dernier caractère ayant le bit haut opposé aux
 autres.



     INV  (Define INVert Text)
     -------------------------
        INV  d-string
          INV  "STOP!"          (Neg. ASCII, inverser à l'impress.)
          INV  'END',878D       (Positive, added bytes)

        Ceci mets un String délimité en mémoire, en format inverse.



     FLS  (Define FLaShing Text)
     ---------------------------
        FLS  d-string
          FLS  "The End"        (Neg. ASCII, flasher à l'impress.)
          FLS  'The End',8D00   (Pos., flash with added bytes)

     Ceci mets un String délimité en mémoire, en format flash.



     REV  (REVerse)
     --------------
        REV  d-string
          REV  "Insert"         (Neg. ASCII, reversed in memory)
          REV  'Insert"         (Idem mais en positif)

     Exemple: REV "DISK VOLUME"
        Ceci donne  EMULOV KSID (Choix délimité comme un ASC), des
 données Hexa ne doivent PAS ètre ajoutées après la fin du String.



     STR  (Definea String with a leading lenght byte)
     ------------------------------------------------
        STR  d-string
          STR  "/PATH/"         (Pos. ASCII, (ProDos Pathname ?))
          STR  "HI"             (Result" 02 C8 C9)
          STR  'HI',8D          (Result" 02 48 49 8D)

        Ceci mets un String délimité en mémoire avec un "Leading
 Length Byte". STR travaille comme un code ASC. Notez que les bytes
 hexa qui suivent, s'il y en a, ne sont pas comptés dans la longueur.
 Cette facilité est concue pour une utilisation ProDos qui utilise
 des types de données très larges.



     DFS Continu
     -----------

     Le symbole # est accepté mais ignoré, comme un <. Le symbole >
 doit ètre utilisé pour spécifier le Bit haut d'une expression, sinon
 le Bit bas est toujours conservé. Le symbole > doit apparaitre en
 premier caractère uniquement ou tout de suite après #. L'instruction
 DFB >LAB1-LAB2 produira le Bit haut de la valeur de LAB1-LAB2.

     Par exemple:
          DFB $34,100,LAB1-LAB2,%1011,>LAB1-LAB2
     est le format correct DFB qui génèrera l'object code (hexa)

          34  64  DE  0B  09
     assuming that LAB1=$81A2 et LAB2=$77C4



     HEX  (Define Hexa datas)
     ------------------------
        HEX  hex-data
          HEX  0102030F         (Results: 01 02 03 0F en mémoire)
          HEX  FD,ED,C0         (Results: FD,ED,C0 en mémoire)

     C'est une alternative à DFB qui permet l'insertion de données
 hexa. Contrairement aux autres cas, le $ n'est ni requis ni accepté.
 L'opérande doit consister en des nombres hexa contenant 2 chiffres
 hexa (Par exemple, utiliser 0F et non F). Les nombres hexa peuvent
 ètre séparés ou collés. Un message erreur sera envoyé si il y a un
 nombre de trop ou si il y a plus de 64 caractères.



     DS  (Define Storage)
     --------------------
        DS Expression
        DS Expression1, Expression2
        DS \ (Slash Inversé)
        DS \,Expression2
               DS  10           (Zero out 10 bytes of mémory)
               DS  10,$80       (Put $80 in 10 bytes of mem.)
               DS  \            (Zero'mem to next memory page)
               DS  \,$80        (Put $80 in mem to next page)

     Ceci réserve un emplacement pour le stockage de données String.
 "It zeros out" cet espace si l'expression est positive. DS 10, par
 exemple, sélectionnera 10 bytes pour le stockage.

     Parce que DS ajuste le pointeur Object Code, une instruction
 comme DS-1 peut etre utilisée pour ramener les Objects et les poin-
 teurs d'adresse à un byte.

     La première alternative avec DS, avec 2 expressions, remplira
 les bytes expression1 avec la valeur de (Le Bit bas de) expression2
 pourvu que expression2 soit positive.

     Le seconde alternative, sous la forme "DS \", remplira la mémoi-
 re jusqu'à la prochaine page mémoire. La forme "DS\,expression2"
 fera la meme chose, mais en utilisant les Bits-bas de l'expression2.

     Note pour REL et le "Linker"
     L'option "\" (Slash inversé) est prévue pour une utilisation
 principale avec des fichers REL et pour travailler d'une facon légè-
 rement différente avec ceux-ci. Chaque code "DS \" arrivant dans un
 fichier REL obligera le "Linker" a charger le fichier suivant à la
 première page disponible et à rempli avec 0 ou avec le byte indiqué.
 Noter que, pour des fichiers REL, la localisation du code n'a aucun
 effet sur cette action. Pour eviter la confusion, mettez ce code en
 fin du fichier.






   -----------------------
   MISCELANEOUS PSEUDO OPS
   -----------------------


     KBD  (Define Label from KeyBoarD)
     ---------------------------------
        Label KBD
        Label KBD d-string
          OUTPUT  KBD           (Get value of Output from kbd)
          OUTPUT  KBD "Send to Printer"
                                (Promt with the d-string for the
                                 value of Output)

     Ceci permet au Label d'etre égalisé depuis le clavier durant
 l'assemblage. Chaque expression peut etre entrée, cependant un mes-
 sage BAD INPUT arrivera si l'entrée ne peut etre définie.

     Le String délimité optionel sera imprimé sur l'écran à la place
 du message standard "Give value for Label:". Une colonne est mise à
 disposition du String.



     LUP
     ---
        LUP expression          (Loop)
        __^                     (Fin du Loop)

     Le pseudo-code LUP est utilisé pour répéter des portions de
 source entre le LUP et le __^ numéro de temps d'"expression".
 Exemple:
          LUP  4
          ASL
          __^

     Sera assemblé comme:
          ASL
          ASL
          ASL
          ASL



     (LUP continu)
     -------------
        Peut-etre que la principale utilisation de ceci est pour la
 construction de tables. Exemple:

          ]A   -   0
               LUP $FF
          ]A   -   ]A+1
               DFB ]A
               __^
     Assemblera la table 1, 2, 3, ....., $FF.

     La valeur maximum de LUP est $8000, le code sera tout simplement
 ignoré si vous tentez d'aller plus loin.

     NOTE: L'utilisation ci-dessus faite avec des variables incrémen-
 tée dans l'ordre pour construire une table ne MARCHERA PAS si elle
 est utilisée avec une macro. Des structures de programmes comme
 celle-ci doivent etre effectuées comme les parties du programme
 source principal.



     CHK  (Place CHecKsum in object code)
     ------------------------------------
        CHK                     (Option unique pour ce code)

     Ceci mets un "Checksum byte" dans l'object code à l'endroit du
 code CHK. Habituellement placé en fin de programme et peut etre
 utilisé par le programme pour vérifier l'existence de l'image exac-
 te du programme en mémoire.



     ERR  (Force ERRor)
     ------------------
        ERR Expression
        ERR `Expression
          ERR  $80-($300)       (Erreur si $80 n'est pas en $300)
          ERR  *-1/$4100        (Erreur si PC > $4100)
          ERR  \$5000           (Erreur si l'adresse code REL
                                   dépasse $5000)

     "ERR Expression" amènera une erreur volontairement si l'expres-
 sion a une valeur non-zéro et le message "BREAK IN LINE ???" appa-
 raitra.



     (ERR Continu)
     -------------

     Ceci peut etre utilisé pour s'assurer que le programme n'éxèdera
 pas, par exemple, $95FF, en additionnant la dernière ligne:

        ERR  *-1/$9600

     NOTE: L'exemple si dessus vous alertera uniquement que le pro-
 gramme est trop long, mais ne supprimera pas les écritures au delà
 de $9600 durant l'assemblage, mais elles peuvent ne pas ètre char-
 gées. Les erreurs arrivent uniquement dans la seconde passe de l'as-
 semblage et ne "raccourcissent" pas l'assemblage.

     Une autre synthaxe valable:  ERR ($300)-$4C

     Celle-ci produire une erreur dans la première passe et arrètera
 l'assemblage si $300 ne contient pas la valeur $4C.

     Notes pour les fichiers REL et le pseudo code ERR:

     La synthaxe "ERR`EXPRESSION" donnera une erreur en seconde passe
 si le pointeur adresse atteint l'expression ou plus. C'est équiva-
 lent à "ERR *-1/expr", mais lorsqu'il est utilisé avec des fichiers
 REL, il ordonne au "linker" de voir si le dernier byte du module ac-
 tuel n'a pas atteint l'expression ou plus (l'expression doit etre
 absolue). Si  le "Linker" trouve que le module DOIT s'étendre au -
 delà de l'expression, alors il stoppera, acoompagné du message "Con-
 straint Error" suivi de la valeur de l'expression de le code ERR.
 Vous pouvez ainsi constater le résultat qui se produira si on essaye
 de "linker" le fichier PI à une adresse supérieure à $81C. Notez que
 la position de ce code dans un fichier REL n'a pas d'effet sur cette
 action, et qu'il est préférable de le mettre à la fin.



     SW  (SWeet 16 codes)
     --------------------

        SW                      (Option unique pour ce code)

     Ceci autorise des codes Sweet 16. Si SW (Similaire pour XC)
 n'est pas sélectionné, alors ces noms de codes peuvent ètre utilisés
 pour des macros. Si vous n'utilisez pas le Sweet 16, vous pouvez
 utiliser les macros nommés ADD, SUB, Etc...



     XC  (eXtended 65c02 and 65802 Codes)
     ------------------------------------

        XC                      (Option 65c02)
        XC  (2 * ds la rangée)  (Option 65802)

     Ceci permet les extra-codes 65c02, Si vous l'utilsez deux fois,
 les codes 65802 peuvent etre assemblés.
     Notez que le pseudo code XC ne permet pas l'utilsation des codes
 BIT étendus avec le chip Rockwell 65c02. Il y a cepedant une librai-
 rie macro disponible sur le disk Merlin Pro, qui peut etre uitlisée
 pour "outiller" ces codes additionnels.



     MX  (Long Status mode of the 65802)
     -----------------------------------

        MX Expression
          MX  %00               (Modes M & X 16 bits  ON)
          MX  %10               (Mode M  ON et Mode X  OFF)
          MX  %01               (Mode X  ON et Mode M  OFF)
          MX  3                 (Modes M & X 16 bits OFF)

     Ce pseudo code est utilisé pour informer Merlin des prochains
 status de status "long" du processeur 65802. Il fonctionne unique-
 ment lorsque l'assembleur est en mode 65802, ou que 2 codes XC on
 été donnés consécutivement. L'assembleur ne peut déterminer si le
 processeur est en mode 16 bits mémoire (Status M bit=0) ou en mode
 registre index 16 bits (Status X bit=0). Le but du code MX est d'in-
 former l'assembleur du status des ces bits.

     Trois des exemples ci-dessus utilisent des expressions binaires
 comme opérande du code MX. Notez que chaque expression valide doit
 ètre utilisée aussi longtemps qu'il est avec les valeurs de 0-3.

     Ce code DOIT ètre utilisé lorsque l'on se sert de possibilités
 du 65802 pour informer l'assembleur sur le mode approprié à adopter
 pour assurer l'assemblage correct des modes de commandes immédiats
 (Comme l'expression LDA # par exemple, etc...)



     USR  (USeR définable codes)
     ---------------------------

        USR Optional expressions
          USR Expression            (Exemple dépendant de la défin.)

     C'est un code définissable par l'utilisateur. Il fait un JSR
 $B6DA. Cet endroit contient un RTS après un boot, un BRUN MERLIN ou
 un BRUN BOOT ASM. Pour choisir votre routine, vous devez faire un
 BRUN depuis la commande EXEC après le catalogue. Ceci doit juste
 faire un JMP à $B6DA à la routine principale et puis RTS.

     Les flags et points d'entrées suivants doivent ètre utilisés
 par votre routine:

        USRADS    = $B6DA  ;Doit avoir un JMP à votre routine
        PUTBYTE   = $E5F6  ;Voir dessous
        EVAL      = $E5F9  ;Voir dessous
        PASSNUM   = $2     ;Contient l'assembly pass number
        ERRCNT    = $1D    ;Error Count
        VALUE     = $55    ;Value returned by EVAL
        OPNDLEN   = $BB    ;Contains combined  length of
                           ;operand and command
        NOTFOUND  = $FD    ;See discussion of EVAL
        WORKSP    = $280   ;Contains the operand and
                           ;comment in positive ASCII

     Votre routine sera appellée par le code USR avec A=0, Y=0 et
 "carry set". Pour ordonner à l'assembleur de mettre un byte dans un
 object code, vous devez JSR PUTBYTE avec le byte en A.



     (USR Continu)
     -------------

     PUTBYTE préservera Y mais mèlera A et X. Dans le premier pas-
 sage, PUTBYTE aujustera SEULEMENT les objects et pointeur adresse,
 le contenu des registres n'est pas important. Vous DEVEZ appeler
 PUTBYTE le MEME NOMBRE TEMPS pour chaque passage, ou le pointeur ne
 sera pas gardé correctement et l'assemblage des autres parties du
 programme seront incorrectes !

   Si vos routines on besoin d'évaluer l'opérande, ou une parite de
 celle-ci, vous pouvez le faire avec un JSR EVAL. Le registre X doit
 pointer le premier caractère de la portion de l'opérande à évaluer.
 (Faire X=0 pour évaluer l'expression au début de l'opérande). Au
 retour d'EVAL, X va pointer le caractère suivant l'expression éva-
 luée. Le registre Y sera 0, 1 ou 2, cela dépendra du caractère, si
 c'est une paranthèse droite, un espace, un comma ou une fin d'opér-
 ande.

     Chaque caractère non alloué causera un assemblage couper par un
 message BAD OPERAND ou un autre message erreur. Si un Label dans une
 expression n'est pas reconnu, alors la localisation NOT FOUND sera
 non zéro. Dans le second passage toutefois vous aurez un message
 erreur UNKNOW LABEL et le restant de votre routine sera ignoré. Au
 retour d'EVAL la valeur de l'expression sera la location VALUE et
 VALUE +1, Bit bas en premier. Dans le premier passage, celle valeur
 ne sera pas significative si NOTFOUND est non zéro.

     Les endroits appropriés pour vos routines sont $300-$3CF et $8A0
 $8FF. Vous ne devez pas écrire à $900.

     Vous pouvez utiliser les endroits page zéro $60-$6F, mais ne
 devez pas altérer d'autres endroits. Vous ne devez rien changer de
 $226 à $27F, ou de $2C4 à $2FF. Après retour de vos routines (RTS),
 la ligne USR sera imprimée (Dans le second passage).



     (USR Continu)
     -------------

     Lorsque vous utilisez le code USR dans un fichier source, il est
 sage de s'assurer de la présence en mémoire des routines requises.
 Si, par exemple, votre routine contient un RTS à $310, alors:

          ERR ($310)-$60

     testera ce byte et interrompra l'assemblage si RTS n'est pas là.
 Pareillemnt, si vous savez que la routine requise doit assembler
 exactement 2 bytes de données, vous pouvez le vérifier avec:

          LABEL     USR  OPERAND
                    ERR  *-LABEL-2

     Cela "forcera" une erreur dans le second passage si JSR ne pro-
 duit pas exactement 2 object bytes.

     Il est possible d'utiliser USR pour plusieurs routines différen-
 tes dans la mème source. Par exemple, votre routine doit vérifier la
 première expression opérande pour un index à la routine désirée et
 agir en accord. Chaque "USR 1, QUOI QUE CE SOIT" branchera la pre-
 mière routine, "USR 2, QUELQUECHOSE" branchera la seconde, etc...





     -----------------------
     CONDITIONNAL PSEUDO OPS
     -----------------------

     DO  (Do if true)
     ----------------

        DO Expression
               DO  0                 (Turns assembly Off)
               DO  1                 (Turns assembly On)
               DO  LABEL             (If LABEL<>0 then On)
               DO  LAB1/LAB2         (If LAB1<LAB2 then Off)
               DO  LAB1-LAB2         (If LAB1=LAB2 then Off)

     Ces ensembles avec ELSE et FIN sont les assemblages condition-
 nels de pseudo ops (Pseudo opération codes). Si l'opérande est éva-
 luée à zéro, l'assembleur s'arrètera de générer des objects codes.
 Excepté pour des noms macros, il ne reconnaitra aucun label. Si
 l'opérande est évaluée à un nmobre non zéro, l'aasemblage procèdera
 normalement. Ceci est fréquent lorsqu'on utilise des Macros.

     Il est aussi hai-bituel pour des sources désignées de générer
 simultanément des codes différents pour des situations différentes.
 Par exemple si vous désignez un programme pour aller en ROM chip,
 vous pourrez faire une version pour la ROM et une autre un peu dif-
 férente, comme une version RAM, pour débugger. Ces assemblages con-
 ditionnels peuvent ètre utilisés pour créer ces différents objects
 codes sans avoir recours à deux sources.

     Egalement, dans un programme contenant du texte, vous pourrez
 vouloir une version pour Apples avec des adaptateurs lower case et
 une autre version sans. En utilisant les assemblages conditionnels,
 la modification d'un programme devient plus simple, puisque vous
 n'avez pas à faire de modification dans deux versions différentes de
 codes sources.

     Chaque DO doit ètre déterminé plus tard quelquepart par un FIN,
 et chaque FIN doit ètre précédé d'un DO. ELSE doit uniquement inter-
 venir dedans, comme une structure DO/FIN. Les structures DO/FIN peu-
 vent ètre mises plus de huit fois (possibilité acquise avec quelques
 ELSE au milieu). Si la condition DO est Off (Valeur 0), l'assemblage
 ne reprendra pas jusqu'à ce que le FIN correspondant soit compté, ou
 jusquà ce qu'un ELSE arrive. Les structures DO/FIN sont prises en
 compte pour la mise en place d'assemblages conditionnels dans des
 macros.



     ELSE  (ELSE do this)
     --------------------

        ELSE                         (Option unique pour ce code)

     Intervertis la condition d'assemblage (ON devient OFF et OFF de-
 vient ON), ceci pour le dernier DO.



     IF  (IF so then do)
     -------------------

        IF char,]Var   (IF char est le premier caractère de ]Var )
          IF (,]1                    (Si le premier caractère de ]1
                                      est "(" alors assembler le code
                                      suivant)
          IF ",]TEMP                 (Si le 1er caract. est ", ass.)
          IF "=]1                    (Alternative avec "=")

     Ceci à pour effet de "regarder" si Char est le premier caractère
 de remplacement String pour ]Var. La position est importante. L'as-
 sembleur regarde le premier et le troisième caractère de l'opérande
 pour un assortiment. Si un assortiment est trouvé, alors le code
 suivant est assemblé. Comme avec DO, cela doit se terminer par un
 FIN, avec des opérantions ELSE au milieu. Le comma n'est pas examiné
 et chaque caractère peut ètre utilisé. Par exemple:

          IF "=]1

     peut ètre utilisé pour tester si le premier caractère de la va-
 riable ]1 est un double signe " ou non, peut ètre nécessaire dans
 une macro pouvant ètre définie par des valeurs ASCII ou Hexa.



     FIN  (FINished conditonal)
     --------------------------

        FIN                     (Option unque pour ce code)

     Ceci efface les derniers DO et IF et continue l'assemblage avec
 le plus haut niveau de l'assemblage conditionnel, ou ON si FIN con-
 clu le dernier DO ou IF.



     Exemples d'utilisation de l'assemblage conditionnel
     ----------------------

   * Macro "MOV", déplace des données de ]1 à ]2
        MOV    MAC
               LDA ]1
               STA ]2
               <<<

   * Macro "MOVD", déplace des données de ]1 à ]2 avec diverses syn-
     thaxes valables
        MOVD   MAC
               MOV  ]1;]2
               IF   (,]1           ;Synthaxe MOVD (ADR1),Y;????
               INY
               IF   (,]2           ; MOVD (ADR1),Y;(ADR2),Y
               MOV  ]1;]2
               ELSE                ; MOVD (ADR1),Y;ADR2
               MOV  ]1;]2+1
               FIN
               ELSE
               IF   (,]2           ;Synthaxe MOVD ????;(ADR2),Y
               INY
               IF   #,]1           ; MOVD #ADR1;(ADR2),Y
               MOV  ]1/$100;]2
               ELSE                ; MOVD ADR1;(ADR2),Y
               MOV  ]1+1;]2
               FIN
               ELSE                ;Synthaxe MOVD ????;ADR2
               IF   #,]1           ; MOVD #ADR1;ADR2
               MOV  ]1/$100;]2+1
               ELSE                ; MOVD ADR1;ADR2
               MOV  ]1+1;]2+1
               FIN                 ; MUST close ALL
               FIN                 ; Conditionals, count DOs
               FIN                 ; & IFs, deduct FINs. Must
               <<<                 ; yield zero at end.


     Appels de synthaxes supportés par MOVD:

               MOVD ADR1;ADR2
               MOVD (ADR1),Y;ADR2
               MOVD ADR1;(ADR2),Y
               MOVD (ADR1),Y;(ADR2),Y
               MOVD #ADR1;ADR2
               MOVD #ADR1;(ADR2),Y






     ----------------
     MACRO PSEUDO OPS
     ----------------


     MAC  (Begin MACros définitions)
     -------------------------------

        Label MAC

     Ceci signale le départ d'une macro définition. Il doit ètre la-
 bellé avec le nom macro. Le nom utilisé est réservé et ne peut ètre
 référencé par d'autres choses que le pseudo code PMC (Comme    DA
 NAME ne peut ètre accèpté si NAME est la label de MAC).



     EOM  (<<<)
     ----------

        EOM
        <<<  (Alternative de synthaxe)

     Ceci signale la fin de la défintion macro. Il doit ètre labellé
 et utilisé pour brancher à la fin d'une macro, ou une de ses copies.



     PMC  (>>>)  (Macro name)
     ------------------------

        PMC Macro-name
        >>> Macro-name    (Autre synthaxe)
        Macro-name        (Autre synthaxe 2)

     Ceci ordonne à l'assembleur d'assembler une copie de la macro
 nommée à l'endroit présent. Voir la section MACROS. Il peut ètre la-
 bellé.





     ---------
     VARIABLES
     ---------


     Les labels commencant par un ]    (crochet gauche), sont percus
 comme des variables. Ils peuvent ètre redéfinis aussi souvent que
 vous le désirez. Le but étant de les utiliser dans les macros, mais
 elle ne sont pas concues pour cet usage.

     Des références avancées d'une variable sont impossibles (Avec
 des résultats corrects, mais l'assembleur leur assignera une varia-
 ble. Une variable doit donc ètre définie pour cet usage.

     Il est impossble d'utiliser une variable pour des branchements
 postérieurs en utilisant le mème label aux places numérotées, dans
 le source. Cela simplifie la nomination du label pour des programmes
 larges et utilise moins d'espace pour des labels équivalents. Par
 exemple:

        1         LDY #0
        2 ]JLOOP  LDA TABLE,Y
        3         BEQ NOGOOD
        4         JSR DOIT
        5         INY
        6         BNE ]JLOOP       ;Branch to line 2
        7 NOGOOD  LDX #-1
        8 ]JLOOP  INX
        9         STA DATA,X
       10         LDA TBL2,X
       11         BNE ]JLOOP       ;Branch to line 8





     -------------
     LOCAL  LABELS
     -------------


     Un label local est un label commencant par une colonne. Un label
 local est "attaché" au dernier label global et peut ètre référé à
 chaque ligne de ce label global jusqu'au prochain label global. Vous
 pouvez alors utiliser le mème label local dans d'autres segments
 gouvernés par d'autres labels globaux. Vous pouvez choisr d'utiliser
 un autre moyen de taper un label local comme :1, :2, etc... ou enco-
 re utiliser des noms comme :LOOP, :EXIT, et ainsi de suite.

     Exemples de labels locaux:

        1  START   LDY #0
        2          LDX #0
        3  :LOOP   LDA (JUNK),Y         ;:loop est local pour start
        4          STA (JUNKDEST),Y
        5          INY
        6          CPY #100
        7          BNE :LOOP            ;Rebrancher à LOOP en 3
        8  LOOP2   LDY #0
        9  :LOOP   LDA (STUFF),Y        ;:loop est local à Loop2
        10         STA (STUFFDEST),Y
        11         INY
        12         CPY #100
        13         BNE :LOOP            ;Rebrancher à :LOOP en 9
        14         RTS

     Quelques restrictions d'utilisation de labels locaux:

     Le label local ne peut ètre utilisé dans une macro, vous ne pou-
 vez labeller un MAC, ENT ou EXT avec un label local et vous ne pou-
 vez EQU un label local.

     Label local, Label global et Variables:

     Il y a trois types distincts de albels utilisés par l'assembleur
 Chacun est assemblé et traité différemment par Merlin.

     Label Global: Label ne commencant pas par "]" ou ":"
     Label Local : Label commencant par ":"
     Variable    : Label commencant par "]"


     Notez que le label local ne sauve pas d'espace dans la table de
 symbole, pendant que les variables le font. Le label local peut ètre
 utiliser pour des branchements postérieurs et ultérieurs, alors que
 les variables ne le peuvent pas. La meilleure chose est d'utiliser
 le label local comme un point de branchement, et les variables pour
 des "passing datas".

STEPH95...03/92


Retour sommaire

hr Merlin

Les macros.


 ____________ __________
!            !          !__________                  U_S_E_R_'_s
! ((      )) ! (((()))) !          !               
! ((((  )))) ! ((       ! (((()))) !__________         M_A_N_U_A_L
! (( (()) )) ! ((()))   ! ((    )) !          !
! ((      )) ! ((       ! (((()))) ! ((       !
! ((      )) ! (((()))) ! ((  ))   ! ((       !________
!____________!__________! ((    )) ! ((       !        !
                        !__________! ((       !   ((   !
                                   ! (((()))) !   ((   !
                                   !__________!   ((   !__________
  >>>>>>>>   >>>>>>>>    >>>>>>>              !   ((   !          !
  >>>   >>>  >>>   >>>  >>>   >>>             !   ((   ! ((    )) !
  >>>   >>>  >>>   >>>  >>>   >>>             !________! ((((  )) !
  >>>>>>>>   >>>>>>>>   >>>   >>>                      ! ((  )))) !
  >>>        >>> >>>    >>>   >>>       PART I         ! ((    )) !
  >>>        >>>   >>>   >>>>>>>        ~~~~~~         ! ((    )) !
                                                       !__________!
 traduit  par  SHEHERAZADE  pour  'son'  LO44  préféré
               [[[[[[[[[[[               [[[[
                            __________
                          _!          !_
                         !_!  MACROS  !_!
                           !__________!

 ________________________
!                        !
!  Pourquoi les macros?  !
!________________________!

   Les macros représentent une méthode de raccourci en programmation qui
permet de générer plusieurs lignes de code à partir d'une seule
instruction, ou appel Macro. Elles peuvent etre utilisées de façon
simple pour éliminer l'entrée répétitive de segments de programme
utilisés fréquemment, ou elles peuvent etre utilisées pour générer des
portions complexe de code que les programmeur peuvent ne pas comprendre!

   Des exemples du premier type sont présentés dans ce manuel et dans le
fichier T.MACRO LIBRARY (/LIB/MACROS.S sur le disk Prodos). Des exemples
du second type, type plus complexe, peuvent etre trouvés dans T.FP
MACROS (/LIB/FPMACROS.S sur le disk Prodos) et dans la librairie T.RWTS
MACROS qui se trouve sur le disk DOS 3.3.

   Les macros peuvent également etre utilisées pour simuler des opcodes
non implamtés (disponible sur le 6502) ou pour simuler les opcodes du
65C02 Rockwell, comme dans le fichier T.ROCKWELL MACROS
(/LIB/ROCKWELLS.S sur le disk Prodos).

   Les macros vous permettent réellement d'écrire votre propre langage
et traduit ce langage en code machine avec seulement quelques lignes
code source. Certaines personnes tirent grande fierté du nombre de bytes
de code source qu'elles peuvent générer avec un simple appel Macro!

 ______________________________
!                              !
!  Comment marche une macro ?  !
!______________________________!

   Une macro est simplement une séquence de langage assembleur nommée
par un utilisateur, avec des opérandes d'utilité générale. Vous
définissez la macro de façon générale, et quand vous l'utilisez, via un
appel macro, vous "remplissez les vides" laissés quand vous la
définissez. Voici un court exemple:

     MAC  SWAP      ;defini une macro appelée SWAP
          LDA ]1    ;charge l'accumulateur avec la variable ]1,
                     premier vide
          STA ]2    ;stocker l'accumulateur à l'endroit ]2
                     deuxième vide
          <<<       ;ceci signale la fin de la macro

   Dans cet exemple, les "vides" auxquels on faisait référence
précedemment sont les variables ]1 et ]2. Quand vous appelez la macro
SWAP vous procurez une liste de paramètres qui "remplissent" les
variables [1 et [2. Ce qui se passe réellement c'est que l'assembleur
substitue les paramètres que vous avez donné aux variables lors de
l'assemblage. L'ordre de la substitution est déterminé par la place des
paramètres dans la liste des paramètres et l'endroit de la variable
correspondante dans la définition de la macro. Voici comment SWAP
devrait etre appelée et remplie:

          SWAP $00;$01
           !    !   !___ ($01 prend la place de ]2, 2nd paramètre)
           !    !_______ ($00 prend la place de ]1, 1er paramètre)
           !____________ (debut d'appel de macro)

alors, la macro sera "étendue" en code assembleur,

          SWAP $00;$01
          LDA  $00       ($00 à la place de ]1)
          STA  $01       ($01 à la place de ]2)

   Il est très important de comprendre que TOUT ce qui est utilisé dans
la liste des paramètres sera substitué aux variables. Par exemple:

          SWAP #"A";DATA

donnerait le résultat suivant:

          SWAP #"A";DATA
          LDA  #"A"
          STA  DATA

Vous pouvez ajouter de la fantaisie si vous voulez:

          SWAP #"A";(STRING),Y
          LDA  #"A"
          STA  (STRING),Y

   Comme illustré, la substitution des paramètres entrés par
l'utilisateur avec les variables est entièrement littéral. Il est
tout-à-fait possible de s'embrouiller de cette façon, mais Merlin vous
informera, par un message d'erreur, si vous vous etes trop emporté. Un
problème commun rencontré est d'oublier la différence entre les NOMBRES
et les ADRESSES en mode immédiat. Les deux appels suivant de macros vont
faire des choses différentes:

          SWAP 10;20
          SWAP #10;#20

   Le premier stocke le contenu de la case mémoire 10 (décimal) dans la
case mémoire 20 (décimal). Le second appel de macro stockera le NOMBRE
10 (décimal) dans le NOMBRE 20! Ce qui s'est passé ici c'est qu'un mode
illégal d'adressage a été tenté. Le second appel de macro serait étendu
en quelque chose comme ceci (si c'était possible):

          SWAP #10;#20        ;appel la macro SWAP
          LDA  #10            ;rien de faux ici
          STA  #20            ;hoops! impossible!
     *** BAD ADDRESS MODE *** ;Merlin vous le fait savoir!

   Afin d'utiliser les macros donnée avec Merlin, ou d'écrire les
votres, étudiez la macro en question et essayez de visualiser comment
les paramètres requis seraient substitués. Avec un peu de temps et
d'efforts vous les utiliserez comme un PRO.

 _____________________
!                     !
!  Definir une macro  !
!_____________________!

Une définition de Macro commence avec la ligne:

     Nom  MAC       (pas d'opérande)

avec Nom dans la case de label. Sa définition est terminée par la
pseudo-opération EOM ou <<<. Le label que vous utilisez pour Nom ne peut
etre employé par autre chose qu'un appel valide de Macro: NOM, PMC NOM
ou >>> NOM.

   Des références précédentes à une définition de Macro n'est pas
possible, et aurait pour résultat un message NOT MACRO. Ceci implique
que la macro doit etre définie avant d'etre appelée par NOM, PMC ou >>>.

   Les conditionnels DO, IF, ELSE et FIN peuvent etre utilisé dans une
macro.

   Les labels dans les macros sont mis à jour à chaque fois que la macro
NOM, PMC ou >>> est rencontrée.

   Les messages d'erreur générés par des erreurs dans les macros
arrètent généralement l'assemblage, à cause des effets nuisibles
possibles. De tels messages indiqueront habituellement le numéro de
ligne de l'appel de macro plutot que la ligne dans la macro où se trouve
l'erreur.


 ____________________
!                    !
!  Macros emboitées  !
!____________________!

   On peut emboiter jusqu'à 15 macros de suite.
   Voici un exemple de macro emboitée dans laquelle la définition
elle-meme est emboitée. (ceci peut se faire uniquement quand les deux
définitions se finissent au meme endroit)

     TRDE MAC
          >>>  TR.]1+1;]2+1
     TR   MAC
          LDA  ]1
          STA  ]2
          <<<

   Dans cet exemple >>> TR.LOC;DEST sera assemblé ainsi:

          LDA  LOC
          STA  DEST

et >>> TRDE.LOC;DEST sera assemblé ainsi:

          LDA  LOC+1
          STA  DEST+1
          LDA  LOC
          STA  DEST

   Une forme plus commune d'emboitement est illustré par ces deux
définitions de macros:

     CH   EQU  $24
     POKE MAC
          LDA  #]2
          STA  ]1
          <<<
     HTAB MAC
          >>>  POKE.CH;]1
          <<<

   La macro HTAB peut etre utilisée ainsi:

          HTAB 20             ;htab à la colonne 20 décimale

et générera le code suivant:

          LDA  #20            ;]2 dans la macro POKE
          STA  CH             ;]1 dans la macro POKE, 1er paramètre
                              ;dans la macro HTAB

   Les noms de MACRO peuvent etre aussi mis dans la colonne d'opcodes,
sans utiliser PMC ou >>>, avec les restrictions suivantes: le nom de
Macro ne peut etreun opcode régulier ou un pseudo opcode, tel que LDA,
STA, ORG, EXP, etc. De meme, il ne peut commencer par les lettres DEND
ou POPD.

   Notez que la syntaxe PMC ou >>> n'est pas sujette à cet restriction.


 _______________________
!                       !
!  VARIABLES SPECIALES  !
!_______________________!

   Huit variables, nommées de ]1 à ]8, sont prédéfinies et conviennent
dans les macros. Elles sont utilisées dans les traitements PMC (ou >>>).
L'instruction:

          >>> NAME.expr1;expr2;expr3...

assignera la valeur de expr1 à la variable ]1, celle de expr2 à ]2, et
ainsi de suite. Un exemple de cette utilisation est:

DEFINITION DE MACRO                EXEMPLE DE RESULTAT DE CODAGE

TEMP EQU  $10                      SWAP.$6;$7;TEMP     ;appel macro
SWAP MAC
     LDA  ]1                            LDA  $06
     STA  ]3                            STA  TEMP
     LDA  ]2                            LDA  $07
     STA  ]1                            STA  $06
     LDA  ]3                            LDA  TEMP
     STA  ]2                            STA  $07
     <<<

     >>>  SWAP.$6;$7;TEMP
     >>>  SWAP.$1000;$6;TEMP

   Ce segment de programme échange le contenu de $06 avec celui de $07,
en utilisant TEMP comme auxiliaire, puis échange le contenu de $06 avec
celui de $1000.

   Si, comme précédemment, certaines des variables spéciales sont
utilisées dans la définition de Macro, alors leurs valeurs doivent etre
spécifiées dans le traitelment PMC (ou >>>). Dans le listing assembleur,
les variables spéciales seront remplacées par les expressions
correspondantes.

   Le nombre de valeurs doit correspondre au nombre de variables
utilisées dans la définition de macro. Une erreur BAD VARIABLE sera
générée si le nombre de valeurs est inférieur au nombre de variables
utilisées. Aucun message d'erreur ne sera généré, cependant, si il y a
plus de valeurs que de variables.

   L'assembleur acceptera certains autres caractères à la place de la
période (comme dans les exemples) ou des espaces entre le nom de macro
et les expressions dans un traitement PMC. Vous pouvez utiliser ces
caractères:
     .  /  ,  -  (

   Les points virgules sont nécessaires, cependant, entre les
expressions et il n'y a pas d'espaces supplémentaires accordés.

   Les macros accepteront les datas littérales. Alors l'assembleur
acceptera les types suivants d'appel de macro:

     DEFINITION DE MACRO

     MUV  MAC
          LDA  ]1
          STA  ]2
          <<<

          >>>  MUV.(PNTR),Y;DEST
          >>>  MUV.#3;FLAG,X

avec le codage résultant pour les deux appels de macros préceédents:

     >>>  MUV.(PNTR),Y;DEST        ;appel macro
     LDA  (PNTR),Y                 ;substitue le 1er paramètre
     STA  DEST                     ;substitue le 2ème param.

et,

     >>>  MUV.#3;FLAG,X            ;appel macro
     LDA  #3                       ;substitue le 1er param.
     STA  FLAG,X                   ;substitue le 2ème param.

   Il acceptera aussi:

DEFINITION DE MACRO           EXEMPLE DE CODE RESULTANT

   PRINT  MAC                 PRINT."Exemple"
          JSR  SENDMSG        JSR  SENDMSG
          ASC  ]1             ASC  "Exemple"
          BRK                 BRK
          <<<

   D'autres exemples d'appel de la macro PRINT:

     >>>  PRINT.!"citation"!
     >>>  PRINT."Ceci est un exemple"
     >>>  PRINT."compris?"

   RESTRICTION: Si de telles chaines contiennent des espaces ou des
points virgules, ils DOIVENT etre limités par des guillemets (simple ou
double). De meme des expressions comme >>>WHAT."A" doivent avoir un
délimiteur final. (ceci est vrai seulement dans les appels macros ou les
traitements VAR, mais c'est une bonne pratique dans tous les cas)


Les librairies Macro et les Pseudos Opérations USES

   Il y a un nombre de librairies macro sur le disk Merlin. Ces
librairies sont des exemples de comment on peut établir une librairie de
macros habituelles. Les conditions pour qu'un fichier soit considéré
comme une librairie macro sont:
   1/ seules les définitions macros et les définitions de labels
existent dans le fichier,
   2/ le fichier est un fichier texte,
   3/ si c'est une librairie dos 3.3, le nom de fichier doit etre
précédé de "T.",
   4/ le fichier doit etre accessible au moment de l'assemblage (il doit
etre sur le lecteur de disk courant ou "online").

   Les librairies macros incluses dans Merlin comprennent:

DOS 3.3     PRODOS      fonctions de librairie macro

T.FPMACROS  FPMACROS.S  -permet un accès facile aux routines
                        mathématiques à virgule flottante de l'Applesoft
T.MACROS    MACROS.S    -macros utilisées souvent d'utilité générale
T.ROCKWELL  ROCKWELL.S  -exécute les opcodes relatifs au bit étendu du
                        Rockwell 65C02
T.SENDMSG   SENDMSG.S   -une macro qui permet des impressions faciles à
                        partir du langage machine
T.RWTS      <rien>      -permet un accès facile aux routines disk RWTS
                        du dos 3.3

   Certaines de ces librairies macros peuvent etre incluses dans un
assembleur en incluant simplement un pseudo opcode USES avec le nom de
librairie approprié. Il n'y a pas de limite au nombre de librairie qui
peuvent etre en mémoire en meme temps, excepté dans l'espace mémoire
disponible. Voir la documentation sur les pseudo opcodes USES pour une
discussion sur leur utilisation dans un programme.


_________._._._______._._.__A___S_U_I_V_R_E__._._._______._._.__________
___._._._______._._._______________________________._._._______._._.____


Retour sommaire

hr Merlin

Le linker.


 ____________ __________
!            !          !__________                  U_S_E_R_'_s
! ((      )) ! (((()))) !          !               
! ((((  )))) ! ((       ! (((()))) !__________         M_A_N_U_A_L
! (( (()) )) ! ((()))   ! ((    )) !          !
! ((      )) ! ((       ! (((()))) ! ((       !
! ((      )) ! (((()))) ! ((  ))   ! ((       !________
!____________!__________! ((    )) ! ((       !        !
                        !__________! ((       !   ((   !
                                   ! (((()))) !   ((   !
                                   !__________!   ((   !__________
  >>>>>>>>   >>>>>>>>    >>>>>>>              !   ((   !          !
  >>>   >>>  >>>   >>>  >>>   >>>             !   ((   ! ((    )) !
  >>>   >>>  >>>   >>>  >>>   >>>             !________! ((((  )) !
  >>>>>>>>   >>>>>>>>   >>>   >>>                      ! ((  )))) !
  >>>        >>> >>>    >>>   >>>       PART II        ! ((    )) !
  >>>        >>>   >>>   >>>>>>>        """""""        ! ((    )) !
                                                       !__________!
 traduit  par  SHEHERAZADE  pour  'son'  LO44  préféré
               [[[[[[[[[[[               [[[[
                          _____________
                        _!             !_
                       !_!  LE LINKER  !_!
                         !_____________!

 ________________________
!                        !
!  Pourquoi un linker ?  !
!________________________!

   Les facilités de liaison de Merlin offrent un certain nombre
d'avantages sur les autres assembleurs sans ces possibilités:
   1/ des programmes extrèmement grands peuvent etre assemblés en une
opération, pour plus de 41000 bytes de long,
   2/ les grands programmes peuvent etre assemblés plus rapidement avec
une diminution correspondante dans le temps de développement
   3/ des librairies de sous-programmes (pour accès disk, graphiques,
drivers écran/modem/imprimante, etc) peuvent etre développées et
incorporées à tout programme Merlin,
   4/ des programmes peuvent etre ré-assemblés rapidement pour
fonctionner à n'importe quelle adresse.

   Avec un linker vous pouvez écrire des portions de programmes qui font
des taches spécifiques, désignent un disk général d'entrée/sortie (E/S),
et font ce qui est nécéssaire en test et debuggage. Quand le codage est
correcte, il est assemblé comme un fichier REL et placé sur un disk. A
chaque fois que vous aurez besoin d'écrire un programme qui utilise des
E/S disk vous n'aurez pas à ré-écrire ou réassembler la portion d'E/S
disk de votre nouveau programme. Relier juste votre programme général
d'E/S disk à votre nouveau programme. Cette technique peut etre utilisée
pour beaucoup de sous-programmes souvent utilisés.

   Est-ce qu'un fichier PUT ou une librairie de macros USES ne peuvent
faire la meme chose? Un fichier PUT est ce qui se rappoche le plus de
l'utilisation de fichiers REL ou du linker, mais il y a un peu plus de
désavantages pour certains programmes. Tout d'abord, utiliser un fichier
PUT pour ajouter un sous-programme d'utilité générale aura comme
résultat un assemblage plus lent. Ensuite, tous les labels de défintion
du fichier PUT seront globals dans le programme entier. Avec un fichier
REL, seuls les labels définis comme ENTrées dans le fichier REL (et
EXTérieurs dans le fichier actuel) seront partagés par les deux
programmes. Il n'y a pas de chances d'erreurs  'label dupliqué' lors de
l'utilisation du linker. Regarder l'exemple simple suivant:

   Un fichier REL a été assmblé, il dirige un plotter. Il y a six
entrées dans le driver: PENUP, PENDOWN, NORTH, SOUTH, EAST, WEST. Pour
illustrer la valeur d'un linker, imaginez que le driver a été écrit par
un ami se trouve à 2000 miles de vous. Votre travail est d'écrire un
programme simple pour dessiner un cadre. Le codage ressemblera à
quelquechose de ce genre:

 1             REL                 ;CODE DEPLACABLE
 2  PENUP      EXT                 ;LABEL EXTERIEUR
 3  PENDOWN    EXT                 ;UN AUTRE
 4  NORTH      EXT
 5  SOUTH      EXT
 6  EAST       EXT
 7  WEST       EXT
 8
 9  BOX        LDY  #00            ;INITIALISER Y
10             JSR  PENDOWN        ;PRET A DESSINER
11  :LOOP      JSR  NORTH          ;DEPLACEMENT VERS LE HAUT
12             INY                 ;INCREMENTER COMPTEUR
13             CPY  #100           ;DEJA 100 DEPLACEMENTS?
14             BNE  :LOOP          ; REMARQUER LE LABEL LOCAL
15             LDY  #00            ;REINITIALISER Y
16  :LOOP2     JSR  EAST           ;MAINTEMANT DEPLACEMENT A DROITE
17             INY
18             CPY  #100
19             BNE  :LOOP2         ;FIN DE DEPLACEMENT A DROITE
20  *  VOUS AVEZ L'IDEE, FAIRE SOUTH, PUIS WEST, ET HOP!

   Cet exemple simple illustre certains des pouvoirs des fichiers
reliés, RELogeables. Votre programme n'a pas à se soucier des conflits
entre ses labels et ceux des fichiers REL, vous ne vous souciez pas des
emplacements des labels EXTernes, votre programme fait seulement 30 ou
40 lignes et est capable de dessiner un cadre avec un plotter!

   Des exemples communs de fichiers REL qui ne sont pas visibles se
trouvent dans le pascal Apple. L'unité de dessin à la tortue, l'unité de
remplissage Apple, et les librairies run-times du Fortran Apple sont
toutes des exemples de fichiers REL.

   Regardons un autre exemple qui illustrent les points 1 et 2
précédents. Cette fois vous écrivez un programme de base de données.
Vous avez cassez le programme en 6 modules, tous sont des fichiers REL:
   1/ interface utilisateur
   2/ système fichier ISAM
   3/ système de classement
   4/ système de recherche
   5/ générateur de report
   6/ système de gestion de mémoire

   Vous devez d'abord concevoir et écrire l'interface utilisateur de
votre programme. Ceci sera assemblé et stocké comme un fichier REL.
Puis, le système de fichier ISAM est écrit et débuggé. Vous devez
ensuite lier les deux modules ensemble pour voir comment ils marchent
ensemble. Puis, vous complétez le classement, la recherche, et tout le
reste. En fait, en utilisant des fichiers REL, et en documentant les
points d'ENTrée et leurs conditions, six personnes différentes
pourraient travailler sur le meme projet simultanément sans avoir besoin
d'autre chose que des labels ENT des autres!

   Pour illustrer le point 2, imaginez que les six modules sont tous
codés en fichiers PUT et que le programme résultant fait 40k de longueur
(ce qui fait 160 secteurs de disk ou 80 blocks de disk). Le temps
nécessaire à l'assemblage et au croisement de références d'un tel
programme se mesurerait en heures ou en jours. Changer un byte dans le
programme source nécessiterait un réassemblage complet et une longue
attente! En assemblant chaque section indépendemment dans les fichiers
REL puis en les liant, le changement d'un byte nécessitera l'asemblage
d'un seul module dans les 40k de programme. En bref, avec les fichiers
REL et le linker, des changements dans de gros programmes peuvent etre
faits rapidement et efficacement, augmentant la vitesse de développement
du programme.

 __________________________________________
!                                          !
!  Au sujet de la documentation du linker  !
!__________________________________________!

   Il y a trois pseudo opcodes qui servent directement avec les modules
relogeables et le processus de liaison. Ce sont:
   REL - informe l'assembleur qu'il doit générer des fichiers
relogeables
   EXT - defini un label comme extérieur au fichier actuel
   ENT - defini un label dans le fichier courant comme accessible par
d'autres fichiers REL.

   Il y a deux autres pseudo opcodes qui ne se comportent pas de la meme
façon dans un fichier REL, par rapport à u fichier normal. Ce sont:
   DS - opcode de définition de stockage
   ERR - opcode d'obligation d'erreur

   Chacun de ces 5 pseudo opcodes sera défini ou redéfini dans cette
section quand ils se rapportent à des fichiers REL. Ainsi, une commande
d'édition unique pour les fichiers REL sera ainsi définie: LINK.

   Afin d'utiliser le linker, les fichiers à lier doivent etre
spécifiés. Le linker utilise un fichier contenant les noms des fichiers
à lier. Le format de ce 'fichier de nom pour le linker' diffère en dos
3.3 et en prodos. Ces différences seront illustrées ici.

   La documentation du linker ne fera pas d'essais supplémentaires pour
apprendre à l'utilisateur comment utiliser des fichiers REL.

 _________________________________________________________________
!                                                                 !
!  Pseudo opcodes à utiliser avec des fichiers codés relogeables  !
!_________________________________________________________________!

REL   (génère un fichier codé RELogeable)
"""
   REL                        (seules options pour cet opcode)

   Cet opcode indique à l'assembleur de générer un fichier relogeable
pour utilisation ultérieure avec le linker.

   Ceci est la première priorité avant la définition de tout label. Vous
aurez une erreur BAD REL sinon. Les fichier REL sont incompatibles avec
le pseudo opcode SAV et avec la commande de sauvegarde de code objet du
mode EXEC. Pour avoir un fichier objet sur le disk vous DEVEZ utiliser
l'opcode DSK pour un assemblage direct sur le disk.

   Il y a d'autres opcodes et procédures illlégaux qui sont normaux avec
les fichiers standards.

   Un ORG au début du codage n'est pas autorisé.

   Multiplication, division ou opérations logiques peuvent etre
appliquées aux expressions absolues mais pas aux relatives.

   Voici des exemples d'expressions absolues:
   - une équation à une adresse explicite
   - la différence entre deux labels relatifs
   - les labels définis dans des sections de code FAUSSES

   Voici des exemples d'expressions relatives qui ne sont pas
autorisées:
   - labels ordinaires
   - des expressions qu'utilise le PC, comme: LABEL-*

   L'adresse de départ d'un fichier REL, fourni par l'assembleur, est
$8000. Notez que cette adresse est une adresse fictive, puisqu'elle sera
changée ultérieurement par le linker. C'est pour cette raison que
l'opcode ORG n'est pas autorisé.

   Il y a aussi certaines restrictions qui impliquent l'utilisation de
labels EXTérieurs (externals) dans des expressions opérandes. Aucun
opérande ne peut contenir plus d'un exernal. Pour les opérandes de la
forme suivante:
   #>expression   ou   >expression
à l'endroit où l'expression contient un external, la valeur de
l'expression doit etre contenue dans les 7 bytes de la valeur du label
extérieur. Par exemple:

     LDA  #>EXTERNAL+8        (expression illégale)
     DFB  >EXTERNAL-1         (expression légale)

   On donne le type de fichier LNK aux fichiers objets générés par
l'opcode REL sous Prodos. C'est le type qui sera montré si vous faites
le catalogue du disk sous Merlin. Ce type est le type de fichier $F8.


EXT   (défini un label EXTernal pour le module courant REL)
"""
label EXT
       PRINT EXT        (défini le label PRINT comme EXT)

   Ceci défini le label dans la colonne de label comme un label externe.
Chaque label externe doit etre défini comme un label ENTrée dans son
propre module REL, sinon il ne sera pas raccordé par le Linker (le label
ne sera pas trouvé dans aucun autre des modules assemblés). La
conception de labels ENTrée et EXTerne est ce qui permet aux modules REL
de communiquer et de s'utiliser mutuellement en tant que
sous-programmes, etc.

   La valeur du label se trouve en $8000 et sera modifié par le linker.
Dans le listing de la table de symboles, la valeur d'un external sera
$8000 plus le nombre de référence externe ($0-$FE) et le symbole sera
marqué d'un "X".


ENT   (défini un label comme un label ENTrée dans le codage d'un
"""    module REL)

label ENT
       PRINT ENT         (défini le label PRINT comme ENTrée)

   Ceci défini le label dans la colonne de label comme un label
d'ENTrée. Ceci signifie que le label peut etre appelé en tant que label
externe. Cette facilité permet aux autres modules REL d'utiliser le
label comme s'il faisait part du module REL courant. Si un label est
fait pour etre utiliser par les modules REL il doit etre défini avec les
opcodes ENT, sinon, les autres modules ne sauront pas qu'il existe et le
linker ne sera pas capable de l'utiliser.

   L'exemple suivant d'un segment de module REL va illustrer
l'utilisation de cet opcode:

21             STA  POINTER   ;un code sans signification
22             INC  POINTER   ;pour notre exemple
23             BNE  SWAP      ;PEUT ETRE UTILISER NORMALEMENT
24             JMP  CONTINUE  ;
25   SWAP      ENT            ;DOIT ETRE DEFINI DANS LA
26             LDA  POINTER   ;PORTION DE CODE DU
27             STA  PTR       ;MODULE ET NE PAS ETRE UTILISE
28             LDA  POINTER+1 ;COMME UN LABEL DECLARE (EQU)
29             STA  PTR+1    
30   * etc.

   Remarquez que le label SWAP est associé au code de la ligne 26 et que
le label peut etre utilisé comme tout autre label dans un programme. Il
peut etre utilisé pour un branchement, un saut ou comme un
sous-programme, etc.

   Les labels ENT seront étiquetés dans le listing de la table de
symbole avec un "E".


DS   (definir la sauvegarde)
""
(NDSHE: le symbole < \ > représente en fait un antislash)

   DS \
   DS \expression
       DS \         (va au prochain fichier REL, rempli la mémoire de
                     zéros jusqu'au prochain changement de page)
       DS \1        (va au prochain fichier REL, rempli la mémoire de
                     1 jusqu'à la page suivante)

   Quand cet opcode se trouve dans un fichier REL, le linker charge le
fichier suivant dans le "fichier de noms à linker" au début de la
première page disponible et rempli la mémoire avec des zéros ou avec la
valeur spécifiée dans l'expression. Cet opcode peut etre placé à la fin
de votre fichier source.


ERR   (force une ERReur)
"""
   ERR \expression
       ERR \$4200   (erreur si le code actuel dépasse l'adresse $4200)

   Cet opcode permet au linker de vérifier que le dernier byte du
fichier courant ne se trouve pas à "expresison" ou après. Remarquez que
l'expression doit etre absolue et non pas relative.

   Si le linker détecte que ce n'est pas le cas, le linkage s'arretera
avec un message: CONSTRAINT ERROR (erreur par contrainte):, suivi de la
valeur de l'expression dans l'opcode ERR.

   Remarquez que la position de cet opcode dans un fichier REL n'a pas
d'influence sur son action. Il est recommandé de le mettre à la fin du
fichier.

   Vous pouvez voir comment cela marche en essayant de linker le fichier
PI sur le disk Merlin à une adresse au dessus de $81C.



LINK   (LINKer des fichiers REL, c'est une commande éditeur)
""""
   LINK adrs "nomdefichier"        (commande dos 3.3)
   LINK adrs "pathname"            (commande prodos)

     LINK $1000 "NAMES"            (relie les fichiers dans NAMES)
     LINK $2000 "/MYPROG/NAMES"    (relie les fichiers là)

   C'est commande éditeur appelle le linker. Par exemple, supposez que
vous vouliez relier les fichiers objets dont les noms se trouvent dans
un "fichier de nom à linker" appelé NAMES (dos 3.3 ou prodos avec le
préfixe). Supposez que l'adresse de départ pour le program linké soit
$1000. Alors vous allez taper: LINK $1000 "NAMES" <RETURN>. (les
guillemets à la fin du nom sont optionnels et vous pouvez utiliser
d'autres délimiteurs tels que "'" ou ";"). L'addresse de départ
spécifiée n'a pas d'effet sur l'espace disponible pour le linker.

   Remarquez que cette commandes est uniquement acceptée s'il n'y a pas
de fichier source en mémoire, car le linker le détruirait.


   Fichiers de Noms à Linker (dos 3.3)
   [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
   Le fichier de noms à linker est simplement un fichier texte contenant
les noms de fichier des modules objets REL que vous voulez relier. Il
peut etre ecrit avec l'éditeur Merlin et etre sauvé sur disk avec la
commande EXEC "W". (n'oubliez pas de taper un espace au début du nom de
fichier pour la commande W si vous ne voulez qu'apparaisse un "T." au
début du nom). Ainsi si vous voulez voulez relier les fichiers objets
nommés MYPROG.START, MYPROG.MID, et LIB.ROUTINE,D2, vous devez créer un
fichier texte avec ces lignes:

          MYPROG.START
          MYPROG.MID
          LIB.ROUTINE,D2

   Puis, vous devez le sauver sur disk avec la commande "W" sous le nom
(par exemple) de MYPROG.NAMES. (Utiliser le nom de fichier que vous
voulez ici, il n'est pas nécessaire de l'appeler NAMES.) Puis vous
relierez ces fichiers avec une adresse de départ de $1000 en tapant NEW
puis la commande éditeur: LINK $1000 "MYPROG.NAMES".

   Le linker ne sauvera pas le fichier objet qu'il crée. A la place, il
place les pointeurs du fichier objet pour la commande Objet du mode EXEC
("O") et vous renvoie directement au mode EXEC après l'achèvement du
processus de linkage.


   Fichiers de Noms à Linker (prodos)
   [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
   Le fichier de noms à linker est simplement un fichier spécialement
formaté (de n'importe quel type) contenant les pathnames des fichiers
LNK que vous voulez relier. Ce fichier est plus facilement créé en
assemblant un fichier source avec le format correct, comme suit: chaque
pathname dans le fichier source devrait etre donné selon ce modèle:

          STR  "pathname",00

   Faites attention à bien inclure le 00 à la fin. Ceci est vital. Le 
fichier source entier doit finir par un BRK (c'est-à-dire 00). Ceci
signifie au linker qu'il n'y a pas d'autres pathnames dans le fichier.
Ainsi, si vous vouler relier les noms de fichier LNK /MYDISK/START,
/MYDISK/MID, et /OTHERDISK/END vous devez faire un fichier source
contenant ces lignes:

          STR  "/MYDISK/START",00
          STR  "/MYDISK/MID",00
          STR  "/OTHERDISK/END",00
          BRK

   Il est préférable d'utiliser des pathnames complets comme dans
l'exemple, mais ce n'est pas indispensable. Vous devez alors assembler
ce fichier et sauver le code objet comme, par exemple,
/MYDISK/MYPROG/NAMES. (utiliser les pathnames que vous voulez ici, il
n'est pas nécessaire d'avoir NAMES dans un sous-répertoire ni de
l'appeler NAMES). Alors, vous pouvez relier à l'adresse $803 en tapant
NEW puis: LINK $803 "/MYDISK/MYPROG/NAMES" <RETURN> dans l'éditeur.

   Le type de fichier utilisé par la commande de sauvegarde d'objet est
toujours le type de fichier utilisé dans le dernier assemblage. Ainsi
c'est BIN à moins que le dernier assemblage est un opcode TYP alors ce
sera ce type. Il sera utilisé par la commande de sauvegarde d'objet
après que vous ayez relié un groupe de fichiers. (le linker ne change
pas ce type). Si vous faites une erreur et que le fichier est sauvé sous
un type que vous ne voulez pas, effacez simplement le fichier, changez
le type en allant dans le moniteur et en changeant l'adresse $BE52 pour
obtenir le bon type, revenez dans l'assembleur et resauvez le code
objet. Vous pouvez également assembler un fichier vide, ce qui remettra
le type objet à BIN ($06) mais ceci annulera la commande de sauvegarde
objet et vous devrez linker les fichiers de nouveau.


   Le Processus de Linkage (dos 3.3 et prodos)
   [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
   Plusieurs  messages d'erreur peuvent apparaitre durant le processus
de linkage (voir la section ERREURS de cette doc pour plus
d'information). Si une erreur DOS apparait au sujet du chargement du
fichier, alors vous verrez ce message et le linkage s'arretera. Si
l'erreur DOS 'FILE TYPE MISMATCH' apparait après que le message
"Externals:" ait été imprimé alors cela signifie que la structure
fichier d'un des fichiers est incorrect et que le linkage ne peut etre
fait.

   Le message PROGRAM TOO LARGE peut apparaitre pour deux raisons. Soit
le programme objet est trop grand pour convenir (la taille totale du
code objet du fichier linké ne peut excéder environ $A100) ou le
dictionnaire de linkage a dépassé l'espace alloué ($B000 de longueur).
Chacune de ses possibilités est extrèmement reculée.

   Après le chargement de tous les fichiers, les externals seront
résolus. Chaque label externe utilisé sera inscrit sur l'écran et il
sera indiqué s'il a été résolu ou non. Une indication permet également
de voir si une référence externe correspond à des symboles d'entrée
dupliqués. Pour ces deux erreurs, l'adresse du champ (un ou deux bytes)
affecté est imprimé. C'est l'adresse que le champ aura quand le code
final sera chargé.

   Ce listing peut etre stoppé à tout moment en utilisant la barre
d'espace. La barre d'espace peut etre également utilisée pour des
avancées pas-à-pas au travers de la liste. Si vous pressez la barre
d'espace pendant le chargement des fichiers, le linker fera une pause
juste après avoir résolu la première référence externe.

   La liste peut etre envoyée vers une imprimante en utilisant les
commandes PRTR ou PR# avant la commande LINK. A la fin, le nombre
d'erreurs totales (références externes non résolues et symboles d'entrée
dupliqués) sera imprimé. Après avoir pressé une touche vous serez envoyé
au mode EXEC et pourrez sauver le fichier objet linké avec la commande
de sauvegarde objet, en utilisant le nom de fichier (ou pathname) que
vous voulez. Vous pouvez également retourner dans l'éditeur et utiliser
la commande GET pour déplacer le code linké vers la mémoire principale.


_________._._._______._._.__A___S_U_I_V_R_E__._._._______._._.__________
___._._._______._._._______________________________._._._______._._.____


Retour sommaire

hr Merlin

Informations techniques.


 ____________ __________
!            !          !__________                  U_S_E_R_'_s
! ((      )) ! (((()))) !          !               
! ((((  )))) ! ((       ! (((()))) !__________         M_A_N_U_A_L
! (( (()) )) ! ((()))   ! ((    )) !          !
! ((      )) ! ((       ! (((()))) ! ((       !
! ((      )) ! (((()))) ! ((  ))   ! ((       !________
!____________!__________! ((    )) ! ((       !        !
                        !__________! ((       !   ((   !
                                   ! (((()))) !   ((   !
                                   !__________!   ((   !__________
  >>>>>>>>   >>>>>>>>    >>>>>>>              !   ((   !          !
  >>>   >>>  >>>   >>>  >>>   >>>             !   ((   ! ((    )) !
  >>>   >>>  >>>   >>>  >>>   >>>             !________! ((((  )) !
  >>>>>>>>   >>>>>>>>   >>>   >>>                      ! ((  )))) !
  >>>        >>> >>>    >>>   >>>       PART III       ! ((    )) !
  >>>        >>>   >>>   >>>>>>>        """"""""       ! ((    )) !
                                                       !__________!
 traduit  par  SHEHERAZADE  pour  'son'  LO44  préféré
               [[[[[[[[[[[               [[[[
                    ___________________________
                  _!                           !_
                 !_!  INFORMATIONS TECHNIQUES  !_!
                   !___________________________!


   Le source est placé à STARTOFSOURCE au chargement, sans se soucier de
son adresse originelle.

   Les pointeurs importants sont:

     START OF SOURCE     dans $A,$B     (mis à $901 par défaut)
     HIMEM               dans $C,$D     (par défaut à $9853 en dos 3.3
                                         par défaut à $AA00 en prodos)
     END OF SOURCE       dans $E,$F

   Notez que HIMEM ne change pas à moins qu'une routine USER ou un
programme utilitaire change les adresses $73, $74. Un tel changement
affectera automatiquement les adresses $C, $D.

 ______________________________________________
!                                              !
!  Informations générales (dos 3.3 seulement)  !
!______________________________________________!

   Quand vous sortez pour accéder au basic ou au moniteur, ces pointeurs
sont sauvés sur la carte RAM à $E00A-$E00F. Il sont restaurés quand vous
réentrez dans Merlin.

   Entrer dans Merlin remplace les variables d'E/S actuelles par les
standards et reconnecte le DOS. Ceci revient à taper PR#0 et IN#0 au
clavier. Entrer dans l'EDITEUR déconnecte le dos, ainsi vous pouvez
utiliser des variables telles que INIT sans conséquences désastreuses.
Réentrer dans le mode EXEC déconnecte toute liaison d'E/S que vous
pourriez avoir établi par les commandes PR# de l'éditeur. Sortir de
l'assembleur (assemblage terminé ou ctrl-C) déconnecte également les
liaisons E/S.

   Réentrer après une sortie vers le basic se fait par la commande
"ASSEM". Utiliser simplement "ASSEM" partout où une commande DOS est
valable (par exemple, en basic). Un BRUN MERLIN ou un boot de disk
pourra également provoquer une réentrée à chaud ou bien ne rechargera
pas MERLIN si il est déjà là. Un rechargement peut etre provoqué en
tapant BRUN BOOT ASM qui sera alors une entrée à froid, "détruisant"
tout fichier en mémoire.

 ______________________________________________
!                                              !
!  Informations générales (prodos et dos 3.3)  !
!______________________________________________!


   Si pendant l'assemblage, le code objet dépasse la ram utilisable
alors le code ne sera pas écrit en mémoire, mais l'assembleur semblera
procéder normalement et le résultat sera afficher à l'écran ou sur
imprimante. La seule preuve que cela est arrivé, si ce n'est pas
intentionnel, est que la commande OBJECT CODE SAVE dans le mode EXEC
n'est pas utilisable dans ce cas. Il y a habituellement un espace de 16K
pour le code objet, qui peut etre changé avec l'opcode OBJ.

 _____________________
!                     !
!  Table de Symboles  !
!_____________________!


   La table de symboles est imprimée après l'assemblage à moins que LST
OFF ait été utilisé. Elle est faite par ordre alphabétique puis
numériquement. La table de symbole peut etre stoppée à tout moment en
pressant Ctrl-C. La stopper de cette façon n'affectera pas le code objet
généré. La table de symbole resemble à ceci:

     MD   =    Défintion Macro
     M    =    label défini dans une macro
     V    =    Variable (symbols commençant par "[")
     ?    =    un symbole qui a été défini mais ne sert jamais
     X    =    symbole externe
     E    =    symbole d'entrée

   Les labels locaux ne sont pas montrés dans le listing de la table de
symboles.

   Dans le mode EDIT, MERLIN prend le controle total des entrées et
sorties. Taper un caractère de controle aura l'effet décrit dans cette
doc et PAS celui décrit dans votre manuel de la carte 80 colonnes. Par
exemple, Ctrl-C n'effacera pas l'écran, mais est le "case toggle".
Ctrl-A, qui agit comme un "case toggle" sur la plupart des cartes 80
colonnes, ne fera pas cela dans le mode EDIT mais produit simplement un
Ctrl-A dans la ligne du fichier.

 _________________________
!                         !
!  Information Ultraterm  !
!_________________________!


   Dans l'éditeur, le mode ULTRATERM peut etre modifié par la séquence
ESCAPE donnée dans le manuel ULTRATERM. Ainsi, les commandes suivantes
donnent les effets indiqués:

     ESC 0          40 X 24   (meme effet que VID $10 ou 16)
     ESC 1          80 X 24   caractères standards
     ESC 2          96 X 24
     ESC 3         160 X 24
     ESC 4          80 X 24   caractères de haute qualité
     ESC 5          80 X 32
     ESC 6          80 X 48
     ESC 7         132 X 24
     ESC 8         128 X 32

   Retourner au mode EXEC reimplantera l'état par défaut qui se trouve
dans le programme HELLO du dos 3.3 ou du fichier PARMS du prodos et on
obtient la meme chose de la commande VID 3.

   Excepté pour le format normal 24 X 80, le support de ULTRATERM dépend
de la carte qui se trouve dans le slot 3.

   Il se peut qu'il y ait des problèmes si vous essayez d'envoyer des
choses à l'imprimante alors que vous etes dans certains modes ULTRATERM.
Il est recommandé de passer en mode 40 colonnes avant de faire cela.
"CONTROL I 80N" dans le commande d'imprimante résoud parfois le
problème.

 ______________________________________
!                                      !
!  Répartition de mémoire avec Merlin  !
!______________________________________!


   Les zones mémoires $300-$3EF dans la mémoire principale et $800-$FFF
dans la mémoire auxiliaire sont disponibles pour les ajouts USER et les
routines USR. La page trois dans la mémoire principale sert aux routines
d'interface E/S. (on ne peut envoyer un caractère à COUT, par exemple, à
partir de la mémoire auxiliaire). Merlin n'utilise pas ces zones. La
zone $90-$9F de la page zéro n'est pas utilisée par Merlin et sont
réservées aux routines utilisateur (remarquer que le programme XREF
utilise ces adresses). La zone $60-$6F de la page zéro est réservée pour
les routines utilisateur suplémentaires et peuvent etre utilisées comme
bon vous semble. Il n'y pas d'autre zone de la page zéro disponible.

 __________________________________
!                                  !
!  Configuration (version Prodos)  !
!__________________________________!


   Les données de configuration se trouvent dans un fichier appelé PARMS
qui est chargé quand l'assembleur tourne. Pour changer les datas,
changez juste le fichier source PARMS.S et réassemblez le.

 ___________________________________
!                                   !
!  Configuration (version DOS 3.3)  !
!___________________________________!


   Les DATAS dans le programme de boot Applesoft "HELLO" contient les
informations de configuration. Pour changer les datas, faites juste LOAD
HELLO, changez les données et SAVE HELLO.

 ___________________________________________________________________
!                                                                   !
!  Description des datas pour les configurations Prodos et Dos 3.3  !
!___________________________________________________________________!

   DATA #    PAR DEFAUT  UTILITE

   1         60          nombre de lignes par page (pour PRTR)
   2         0           lignes à passer au changement de page (0
                         provoque un caractère "form feed")
   3         80          nombre de caractères par lignes (pour PRTR)
   4         $80         doit etre 80 si l'imprimante fait son propre CR
                         en fin de ligne, sinon doit etre 0
   5         $83         marqueur 80 colonne. Doit etre $80+3 si la
                         carte 80 colonnes est en slot 3 (ou carte Apple
                         80 col) doit etre choisi au moment du boot.
                         Sinon 0. DOIT ETRE $83 EN PRODOS.
   6,7       $901        adresse de départ du fichier source, ne doit
                         pas etre moins de $901
   8,9       $AA00       NE DOIT PAS ETRE CHANGE
   10,11     $901        fin de pointeur de source. Doit etre égal à
                         l'adresse de départ du fichier source
   12        $DE "^"     le caractère de l'éditeur de la wild card
   13        4           nombre de champs par ligne dans le listing de
                         la table de symbole
   14        $AF "/"     caractère recherché lors d'une entrée "UPDATE
                         SOURCE" dans l'assembleur. Si c'est 0 la
                         question sera évitée.
   15,16,17  14,20,31    les tabs par défaut de l'éditeur et de
                         l'assembleur, remarquer que ces valeurs sont
                         relatives au coté gauche de l'écran
   18        8           nombre de bytes/ligne après la première ligne
   19        5           marqueur erreur/bip et paramètres de départ
                         Ultraterm.
                          Le bit de poids fort, si sur 'on', forcera
                         l'assembleur à faire une pause en attendant une
                         pression sur une touche lors d'une erreur; si à
                         'off', un son retentira pendant 20 secondes
                         puis l'assemblage continuera.
                          Le bit V à 1 déconnecte le bip. Le nibble bas
                         détermine le mode par défaut de l'Ultraterm si
                         vous l'utilisez. La valeur 5 ou $85 met en
                         place le mode 32 X 80.
   20        $40         marqueur de curseur. Donne un curseur régulier
                         si c'est $40 et un curseur bloc si c'est 0. La
                         carte 80-col Apple doit avoir le curseur bloc
                         ce marqueur sera modifié si vous utilisez cette
                         carte.
   21        0           LSTDO par défaut: 0,1-LSTDO ON, >1-LSTDO OFF.
                         Le bit 0, si à 0, provoque une mise au 40
                         colonnes quand il y a une commande PRTR.
   22        72          colonne à laquelle le compte de cycle sera
                         imprimé lors de l'utilisation de l'opcode CYC.
   23        $EC         type de curseur pour Ultraterm. Doit etre
                         changé si le mode Ultraterm est changé (voir
                         byte 19)
   24-44     "$F1" à     noms de type de fichier pour les types de
             "$F7"       fichier défini par l'utilisateur de $F1 à $F7.
                         Ces noms seront montré dans le catalogue.
                         Prodos seulement.

 ____________________________________________
!                                            !
!  Fichiers source Merlin 64K et Merlin Pro  !
!____________________________________________!


   Les fichiers sources de Merlin 64K peuvent etre chargés directement
par Merlin Pro Dos 3.3. Pour utiliser un fichier source Merlin 64k avec
Merlin Pro Prodos vous devez utiliser l'utilitaire CONVERT qui se trouve
sur le disk utilisateur Prodos. Certains changements dans le source
peuvent etre nécessaires à cause des pseudos opcodes manquants dans
Merlin Pro. Si votre programme utilise HIMEM: ou SYM, ils peuvent etre
détruits. Si votre programme utilise l'opcode ERR pour vérifier si HIMEM
ou SYM ont été mis en place, ils peuvent etre détruits. Si votre
programme utilise Sweet 16 alors l'opcode SW devra etre inserré. Ainsi,
tout opcode OBJ devra etre remplacé puisque le sens de cet opcode a été
changé.


 _______________________________
!                               !
!  Notes sur Merlin Pro Prodos  !
!_______________________________!

   La version prodos utilise exclusivement des fichiers TXT comme
fichier source. Ceci inclus les fichiers destinés aux opcodes PUT et
USE, et tous ces fichiers doivent avoir l'extension ".S" dans le nom de
fichier (qui est fourni par l'assembleur pour tous les chargements et
les sauvegardes). Il est suggéré que vous gardiez tous les fichiers
destinés aux opcodes PUT et USE dans un répertoire. Par exemple vous
pouvez sauvez un fichier nommé MYPUT sous le pathname LIB/MYPUT. Il sera
alors appelé dans un programme assemblé comme suit: PUT LIB/MYPUT, ou
PUT /PREFIX/LIB/MYPUT s'il est dans le volume appelé PREFIX.

   Si vous sauvez un fichier sous un nom de directory qui n'existe pas,
un sous répertoire sera créé sous ce nom. Par exemple, supposez que vous
vouliez sauver votre source actuel SRC sur le volume MYVOL et dans le
sous répertoire SUB qui n'existe pas dans le répertoire MYVOL. Alors
tapez simplement /MYVOL/SUB/SRC alors le pathname est demandé (ou juste
SUB/SRC si /MYVOL/ est le préfixe) et le sous répertoire SUB sera créé
automatiquement et le fichier SRC sera placé à l'intérieur.

   Il est sage d'utiliser un pathname complet dans les opérandes des
opcodes SAV, USES et PUT, car sinon le préfixe actuel sera attaché au
nom et pourrait ne pas etre le préfixe que vous désirez.

   Les paramètres de drive et de slot ne sont acceptés par les commandes
et les opcodes. Vous DEVEZ utiliser des pathnames.

   Puisque la version Prodos de Merlin fonctionne grace à son propre
imterpréteur plutot que grace à l'interpréteur BASIC, il n'y a pas de
réentrer à chaud comme avec la version dos 3.3.

   Il n'y a pas d'équivalent aux commandes BASIC CAT ou CATALOG comme
"commandes de disk". L'interpréteur sélectionne automatiquement le
format de catalogue pour la commande "C" selon que vous soyez en mode 40
ou 80 colonnes.

   Le volume Prodos /RAM/ est déconnecté par Merlin Pro puisqu'il
utilise toute la mémoire auxiliaire.

 __________________________________________________________________
!                                                                  !
!  Transférer des fichiers sources de Merlin Pro Dos 3.3 à Prodos  !
!__________________________________________________________________!


   Il y a deux méthodes pour transférer des fichiers de la version dos
3.3 de Merlin Pro à la version Prodos. Puisque la version prodos utilise
uniquement des fichiers texte, vous pouvez charger des fichiers dans la
version dos 3.3 et les écrire en tant que fichiers texte et puis les
transférer avec le programme CONVERT de Apple. Malheureusement, CONVERT
n'est pas un transfert literal, car il effacera les bits hauts dans le
fichier. La version Prodos de Merlin remettra les hauts bits, mais la
tabulation dans l'éditeur sera troublée par cette procédure. Cependant,
vous devez simplement taper FIX dans l'éditeur et resauver le source
pour remédier à ce problème. Les fichiers destinés à "PUT" et "USE"
doivent etre resauvés car, sinon, l'assemblage sera ralenti.

   Une autre méthode est de transférer les fichiers en fichiers binaires
à partir du Dos 3.3 et d'utiliser le fait que la version Prodos de
Merlin a la possibilité de charger des fichiers binaire (ou tout type).
(Ceci ne s'applique pas à la sauvegarde) Après le chargement d'un
fichier source binaire, il peut etre effacé et resauvé (en tant que
fichier TXT). La commande de charmgement permet automatiquement le
chargement de fichiers TXT et BIN. D'autres types de fichiers peuvent
etre chargés en changeant le byte utilisé pour désigner le type de
fichier source qui se trouve en $BE5D (qui contient ordinairement un 4).

   Puisque la version Prodos de l'assembleur n'utilise pas la syntaxe
"T." de la version dos 3.3 pour les fichiers PUT, il sera parfois
nécessaire de renommer de tels fichiers.


                       _____________________
                     _!                     !_
                    !_!  MESSAGES D'ERREUR  !_!
                      !_____________________!


BAD OPCODE  ( mauvais opcode )
[[[[[[[[[[
   Apparait lorsque l'opcode n'est pas valide (peut etre mal
orthographié) ou lorsque l'opcode se trouve dans la colonne de label.


BAD ADRESS MODE  ( mauvais mode d'adressage )
[[[[[[[[[[[[[[[
   Le mode d'adressage n'est pas une instruction 6502 valide; par
exemple, JSR (LABEL) ou LDX (LABEL),Y.


BAD BRANCH  ( mauvais branchement )
[[[[[[[[[[
   Un branchement à une adresse qui est hors de portée, c'est-à-dire qui
dépassent +127 bytes.


   NOTE: la plupart des erreurs stopperont le calcul des adresses par
l'assembleur. Les erreurs de mauvais branchement peuvent etre ignorées
jusqu'à ce que les erreurs précédentes aient été traitées.


DUPLICATE SYMBOL  ( symbole en double )
[[[[[[[[[[[[[[[[
   A la première passe, l'assembleur trouve deux labels identiques.


MEMORY FULL  ( mémoire pleine )
[[[[[[[[[[[
   Ceci est habituellement causé par une de ces deux conditions: code
source trop grand ou table de symbole trop grande. Voir "Note spéciale"
à la fin de cette partie.


UNKNOWN LABEL  ( label inconnu )
[[[[[[[[[[[[[
   Votre programme se réfère à un label qui n'a pas été défini. Ceci
apparait également si vous tentez de vous référez à une définition de
MACRO par quelque chose d'autre que PMC ou >>>. Il peut aussi apparaitre
si le label auquel on fait référence est dans un environement sans
assemblage conditionnel. Ce dernier cas ne se produira pas avec une
définition MACRO.


NOT MACRO  ( pas de macro )
[[[[[[[[[
   Référence précoce à une MACRO, ou référence par PMC ou >>> à un label
qui n'est pas une MACRO.


NESTING ERROR  ( erreur emboitée )
[[[[[[[[[[[[[
   Des macros emboitées plus de 15 fois ou des conditions emboitées plus
de 8 fois généreront cette erreur.


BAD "PUT"  ( mauvais "PUT" )
[[[[[[[[[
   Ceci est causé par un PUT dans une macro ou par un PUT dans un autre
fichier PUT.


BAD "SAV"
[[[[[[[[[
   Ceci est causé par un SAV dans une macro ou un SAV après un multiple
OBJ après le dernier SAV.


BAD INPUT  ( mauvaise entrée )
[[[[[[[[[
   Ceci résulte soit d'une absence d'entrée (<RETURN> seulement), soit
d'une entrée excédant 37 caractères (réponse à l'opcode de requète KBD)
pour la valeur d'un label.


BREAK
[[[[[
   Ce message est causé par un EQU, MAC, ENT ou EXT sans label, un label
trop grand (supérieur à 13 caractères) ou un label contenant des
caractères non-autorisés (un label doit commencer par un caractère au
moins aussi large en valeur ASCII que la colonne et ne doit contenir
aucun caractères en dessous du digit zéro).


BAD ORG
[[[[[[[
   Résulte d'un ORG au début d'un fichier REL.


BAD OBJ
[[[[[[[
   Un OBJ après le début du codage ou OBJ pas entre $4000 et $BFE0.


BAD REL
[[[[[[[
   Un opcode REL apparait après la définition de certains labels.


BAD EXTERNAL
[[[[[[[[[[[[
   EXT ou ENT dans une macro ou l'égalisation d'un label avec une
expression contenant un external, ou un branchement à un external
(utilisation de JMP).


BAD VARIABLE
[[[[[[[[[[[[
   Ceci apparait lorsque vous ne donner pas à une macro le nombre de
variables qu'elle attend. Il peut également apparaitre pour une erreur
de syntaxe dans une chaine de caractère donnée à une variable macro,
comme pour une expression sans les guillemets finaux.


ILLEGAL FORWARD REFERENCE
[[[[[[[[[[[[[[[[[[[[[[[[[
   Un label dont la valeur devient une adresse de page zéro après qu'il
ait été utilisé. Ceci apparait également quand un label inconnu (à la
première passe) est utilisé pour certaines choses qui doivent pouvoir
calculer la valeur à la première passe (par exemple ORG< OBJ DUM). Il
apparait également si un label est utilisé avant d'etre défini dans une
section DUM en page zéro.


TWO EXTERNALS
[[[[[[[[[[[[[
   Deux ou plus externals dans une expression opérande.


DICTIONNARY FULL
[[[[[[[[[[[[[[[[
   Dépassement d'un dictionnaire de transfert dans un fichier REL.


256 EXTERNALS
[[[[[[[[[[[[[
   Le fichier a plus de 256 externals.


ILLEGAL RELATIVE ADRS  ( adresse relative illégale )
[[[[[[[[[[[[[[[[[[[[[
   En mode REL une multiplication, division ou operation logique
apparait en expression relative. Ceci apparait également pour un
opérande du type #>expr ou un DFB >expr quand l'expr contient un
external et que le décalage de la valeur de l'expression à partir de
celle de l'external excède 7.


ILLEGAL CHAR IN OPERAND  ( caractère illégal dans un opérande )
[[[[[[[[[[[[[[[[[[[[[[[
   Un caractère non-mathématique apparait dans l'opérande alors que
l'assembleur attend un opérateur mathématique. Ceci apparait
habituellement dans les appels de macro avec une syntaxe imapropriée
résultant de la substitution de texte.


ILLEGAL FILE TYPE  ( type de fichier illégal )
[[[[[[[[[[[[[[[[[  (sur la Version PRODOS seulement)

   Opcode TYP utilisé avec un opérande illégal. L'opérande doit avoir la
valeur 0,6,F0-F7, ou FF.


NOTE GENERALE: Quand une erreur provoque l'arret de l'assemblage, la
ligne contenant l'erreur est imprimée sur l'écran. Elle peut ne pas
avoir la meme forme que celle qui ce trouve dans le source, car elle
montre les substitutions de texte que peut avoir provoquée une expansion
de macro. Si c'est dans un appel macro, le numéro de ligne sera celui de
la ligne d'appel et pas celui de la ligne dans la macro (qui est
inconnue pour l'assembleur).

 _____________________________________________
!                                             !
!  Note Spéciale - Erreurs de MEMOIRE PLEINE  !
!_____________________________________________!


   Il existe trois causes possibles pour le message d'erreur MEMORY FULL
(mémoire pleine). Voici une description plus détaillée de ce problème et
quelques façons de le résoudre.


MEMORY FULL IN LINE: xx.
[[[[[[[[[[[[[[[[[[[
   Générée durant l'assemblage.
   CAUSE:  Il y a trop de symboles dans la table de symboles; ainsi il
           y a dépassement de la place disponible.
   REMEDE: Rendre la table de symboles plus grande en mettant la valeur
           de OBJ à $BFE0 et utiliser DSK pour assembler directement
           sur le disk.


ERR:MEMORY FULL.
[[[[[[[[[[[[[[[[
   Générée immédiatement après que vous ayez tapé une ligne trop longue.
   CAUSE:  Le code source est trop grand et a dépassé la ram disponible.
   REMEDE: Découper le source en sections plus petites et rajouter les
           quand cela est nécessaire en utilisant le pseudo-op "PUT".


ERROR MESSAGE:    none    (aucun, rien, que dalle koi!)
[[[[[[[[[[[[[[
   Aucun message d'erreur, mais aucun code objet ne sera généré (il
n'apparaitra pas d'information OBJECT sur le menu EXEG).
   CAUSE:  Le code objet généré par un assemblage a dépassé l'espace
           des 16K disponibles.
   REMEDE: Mettre OBJ à une adresse inférieure à $8000 par défaut ou
           utiliser DSK.


                      ___________________________
          ___________________________________________________
    _______^^^^^^^^^^^^_________________^^^^^^^^^__________________
 ______________^^__________^^^^^^______^^_____________________________
______________^^__^^__^^__^^__________^^^^^^^___^^____^^__^^^^^^_______
_____________^^__^^__^^__^^^^^^______^^________^^^^__^^___^^__^^_______
 ___________^^__^^^^^^__^^__________^^________^^__^^^^___^^__^^_______
    _______^^__^^__^^__^^^^^^______^^^^^^^^__^^____^^__^^^^^^______
          ___________________________________________________   
                      ___________________________
                           ___           ___
                          ___             ___
                       _____               _____
        < KISSES >  _________  < FROM >   _________  < SHEHERAZADE>


Retour sommaire

hr Merlin

Sourceror.



           S.O.U.R.C.E.R.O.R        Merlin Pro



    Introduction:
    -------------
       SOURCEROR est sophistiqué et facile pour utiliser un
    désassembleur co-résident destiné à créer des fichiers
    Merlin en dehors de programmes Binaires, éxecuté habi-
    tuellement en un certain temps.
       SORCEROR désassemble les codes -Sweet 16- aussi bien
    que les codes 6502, 65C02 ou 65802.



    Uitilisation de SOURCEROR:
    --------------------------
 1. BRUN SOURCEROR à partir du mode EXEC de Merlin
 2. Pour faire appel à SOURCEROR, tapez -USER- depuis le mode EDIT
    en mode 40 Colonnes. Si vous ètes en mode 80 Colonnes, la com-
    mande sera ignorée.
 3. Il vous sera ensuite demandé si vous voulez charger un fichier
    à désassembler. Si vous sélectionnez cette option, le fichier
    sera chargé et il vous sera demandé les adresses de chargement
    et de fin du programme.
    Vous pourrez aussi accéder à une "fourniture secrète" avant le
    chargement. C'est possible en tapant -CTRL S- avant ou au lieu
    du nom du fichier. Ceci est prévu pour faciliter le désassemb-
    lage d'un programme en utilisant une version RAM de Sweet 16.

    ```Si vous avez chargé un fichier codé, passez à l'étape 5```


 4. Maintenant, il vous sera demandé de taper -RETURN- si le pro-
    gramme à désassembler est à son adresse originale (de déroule-
    ment), ou alors vous devrez spécifier en Hexa la présente
    adresse du code à désassembler. Et finalement, il vous sera
    demandé l'adresse originale de ce programme.

 5. Enfin, la page contenant les synoptiques des commandes utilisées
    en désassemblage apparaitra. Vous pourrez alors démarrer le
    désassemblage ou utiliser toute autre commande.
    Votre première commande doit contenir une adresse Hexadécimale.

 <<<< NOTE >>>>: Pendant le désassemblage, vous DEVEZ utiliser l'ad-
           resse ORIGINALE du programme et non l'adresse ou il se
           trouve actuellement. Il vous apparaitra que vous ètes en
           train de désassembler le programme à son adresse origina-
           le, mais actuellement, SOURCEROR désassemble le code à
           l'endroit présent et transfère les adresses.


 6. Lorsque vous avez fini d'utiliser SOURCEROR, vous devez taper
    -USER1- depuis l'EDITOR pour se débarasser de SOURCEROR et pour
    libérer la mémoire utilisée par le désassembleur.



    Commandes utilisées en Désassemblage:
    -------------------------------------
    Les commandes de désassemblage sont très proches de celles uti-
 lisées par le désassembleur dans le Moniteur Apple. Toutes les com-
 mandes acceptent une adresse Hexa à 4 caractères avant le lettre de
 commande. Si ce chiffre est oublié, le désassemblage continue
 depuis la présente adresse. Un nombre doit ètre spécifié seulement
 sur l'entrée initiale.

    Si vous entrez un nombre plus élevé que la présente adresse, un
 nouvel ORG sera créé.

    Plus communément, vous devez entrer une adresse plus basse que
 la présente valeur par défaut. Dans ce cas, le désassembleur cher-
 che à voir si cette adresse est égale à une adresse précédente. Si
 c'est la cas, il se produit un retour à cet endroit. Sinon, il se
 produit un retour à la nouvelle adresse et il se créer un nouvel
 ORG. Il est généralemnt préférable d'avoir de nouveaux ORG quand
 c'est possible. Si vous avez un nouvel ORG et que vous n'en voulez
 pas, essayez de revenir d'un Bit jusqu'à ce que vous n'ayez plus
 de nouvel ORG sur le désassemblage.

    Ce retour vous permet de répéter un désassemblage si vous avez,
 par exemple, utilisé un Hexa ou une autre commande, et de changer
 ce dont vous avez envie.



    Description des Commandes:
    --------------------------
 -L- (LIST) : C'est la principale commande de désassemblage. Elle
       désassemble 20 lignes de codes. Elle peut ètre répétée
       (Ex: 2000LLL désassemblera 60 lignes de codes à partie de
       $2000). Si un JSR est trouvé par l'interpréteur SWEET 16,
       le désassemblage est automatiquement  basculé en mode
       SWEET 16.

 -S- (SWEET) : C'est a peu près la meme chose que -L-, mais cela
       oblige le désassembleur à démarrer en mode SWEET 16. Le mode
       SWEET 16 retourne en mode Normal 6502 chaque fois que le code
       Sweet 16 RTN est trouvé.

 -N- (NORMAL) : C'est a peu près la meme chose que -L-, mais cela
       oblige le désassembleur à démarrer en mode NORMAL 6502.

 -H- (HEX) : Cette commande créé le mode de données HEX. Si vous
       insérez un nombre HEX de 1 Byte (Un ou deux caractères), ce
       Byte sera créé.

 -T- (TEXT) : Cette commande tente de désassembler les données se
       trouvant à l'adresse actuelle comme une ligne ASCII. Dépen-
       dant de la forme des données, ce sera (automatiquement)
       désassemblé sous un pseudo-code ASC, DCI, INV ou FLS. Le
       délimiteur approprié ( " ou ') sera automatiquement choisi.
       Le désassemblage s'arretera  lorsqu'une donnée inappropriée
       sera rencontrée, lorsque seront traités 62 caractères, ou
       lorsque le Bit Haut de la donnée changera. En dernière con-
       dition, le code ASC est automatiquement changé en DCI.
           Quelquefois, le changement en DCI n'est pas approprié.
       Ce changement peut ètre déjoué en utilisant la commande -TT-
       à la place de -T- .
           Occasionnellement, le désassemblage peut ne pas s'arrèter
       à la bonne place, parce que les codes suivant sont comme des
       données ASCII pour SOURCEROR. Dans ce cas, vous devrez limi-
       ter le nombre de caractères entrés en insérant un nombre HEX
       à un ou deux caractères après la commande -T- .

 -W- (WORD) : Cela désassemble les deux prochain Bytes à l'endroit
       présent, comme un code DA. En option, si la commande -WW- est
       utilisée, ces Bytes seront désassemblés comme un code DDB.
           Si W- (W moins) est utilisé comme une commande, les deux
       Bytes sont désassemblés sous la forme DA LABEL-1. La dernière
       est souvent la forme appropriée lorsque le programme utilise
       les adresses en les mettant sur la pile. Vous pouvez le
       détecter pendant le désassemblage ou après que le programme
       ait été désassemblé. Dans Le dernièr cas, il pourra ètre à
       votre avantage de refaire le désassemblage avec quelques
       notes à la main.



    Commandes de Nettoyage:
    -----------------------
 -/- (CANCEL) : Cela efface essentiellement la dernière commande.
       Plus exactement, cela retabli la dernière adresse par défaut
       (l'adresse utilisée pour une commande qui n'était pas neces-
       sairement attachée à une adresse).Ceci est d'usage, ca vous
       permet d'ignorer l'entrée d'une adresse lorsqu'un retour est
       désiré.
           Par exemple, supposons que vous tapez -T- pour désassem-
       bler un texte, vous ne pouvez pas savoir ce qui suit le texte
       vous pouvez seulement taper -L- pour le regarder. Alors si le
       texte est suivi d'une donnée Hex (Comme $8D pour un retour
       chariot par exemple), tapez simplement -/- pour effacer le
       -L- et tapez la commande appropriée -H- .

 -R- (READ) : Pour lire les données de $1000 à $10FF, tapez 1000R.
       Après cela, R tout seul vous donnera la page mémoire suivante
       Les nombres utilisés pour cette commande sont totalement in-
       dépendants des adresses de désassemblage.
           Cependant, vous pouvez désassembler, alors utilisez
       (adresse)R, puis L tout seul, et le désassemblage procèdera
       comme si vous n'aviez jamais utilisé le R. Si vous n'avez pas
       l'intention d'utiliser l'adresse par défaut lorsque vous re-
       tournez au désasemblage, il est possible d'apporter une note
       là où vous vouliez reprendre, ou d'utiliser la commande  /
       avant la commande  R.

 -Q- (QUIT) : Ceci arrète le désassemblage et va automatiquement en
       procédure finale. Si vous tapez une adresse avant le Q, le
       pointeur d'adresse est remis à cette adresse avant la procé-
       dure. Si, à la fin du désassemblage, il est inclus dans les
       lignes:     2341- 4C 03 E0      JMP  $E003
                   2344- A9 BE 94      LDA  $94BE,Y
       et que la dernière ligne n'inclus que des "déchets", tapez
       2344Q. Cela effacera la dernière ligne.



    Procédure Finale:
    -----------------
    Après la commande Q, le programme doit traiter quelques instants
 les codes d'assemblage. Si vous faites un RESET à ce moment, vous
 retournerez à Merlin et perdrez le code désassemblé.
    Le traitement prendra une ou deux secondes si le programme est
 court, et quelques minutes s'il est assez long. Soyez patient.
    Lorsque le traitement est terminé, vous retournez à Merlin avec
 une nouvelle source créée. Vous pouvez utiliser la commande SAVE de
 Merlin pour sauvegarder quand vous le désirez.



    Manipulation avec une Source Terminée:
    --------------------------------------
    Vous pourrez noter qu'un DA sera plus approprié dans les formats
 DA LABEL-1 ou DDB LABEL. Dans ce cas, il sera préférable de désas-
 sembler à nouveau en prenant quelques notes. Le désassemblage est
 si rapide et facile, que c'est souvent plus facile que d'essayer de
 changer directement la source.

    La source n'aura, dans une table d'équation à la fin, aucune
 reconaissance de labels extérieurs ou autres. Vous devrez regarder
 cette table de près. Elle ne devrait contenir aucune page d'équa-
 tion zéro excepté s'il y a une résultante de DA, à savoir JMP ou
 JSR. C'est une manière sure de voir une erreur dans le désassem-
 blage (Une de vos erreurs, et non de SOURCEROR). Cela peut résul-
 ter d'une tentative de désassemblage de quelques données comme un
 code régulier.

    NOTE: Si vous essayez d'assembler la source dans ces conditions,
 vous aurez une erreur aussitot que les équations apparaitront. Si,
 éventuellement vous déplacez les équations au début du programme,
 vous n'aurez pas d'erreur, mais l'assamblage NE SERA PAS CORRECT.

    Il est très important d'agir dans cette première situation si
 un inconvénient venait à apparaitre, si, par exemple, le désas-
 sembleur trouvait la donnée AD008D.
    Cela désassemblera correctement, comme LDA $008D. L'assembleur
 assemble toujours ce code comme une instruction de page zero, en
 donnant les deux bytes A5 8D. Occasionnellement, vous trouverez un
 programme qui utilise cette forme pour une instruction de page zero
 Dans ce cas, vous aurez à insérer un caractère après le code LDA
 pour l'avoir assemblé de facon identique à sa forme originelle.
 Souvent, il y a une donnée en première place plutot qu'un code, et
 on doit agir avec cela pour avoir un assemblage correct.



    Message de Mémoire Pleine:
    --------------------------
    Lorsque le fichier source atteind les bytes $600 de la fin, dans
 son espace libre, vous verrez le message MEMORY FULL et HIT A KEY.
 Lorsque vous enfoncez une touche, SOURCEROR ira directement en pro-
 cédure finale. La raison du "trou" du byte $600, est que SOURCEROR
 a besoin d'un certain espace pour cette procédure. Il y un laisser
 passer secret en mémoire au point de mémoire pleine. Si vous appuy-
 ez sur la touche CTRL-O (Pour Override, laisser passer), SOURCEROR
 retournera à une autre commande. Vous pouvez l'utiliser pour spéci-
 fier le point de cloture. Vous pouvez aussi l'utiliser pour aller
 un peu plus loin que SOURCEROR et désassembler un peu plus de
 lignes. Evidemment, vous ne devrez pas pousser ceci à l'extrème. Si
 vous utilisez trop de memoire, SOUCEROR n'acceptera plus le laisser
 passer et démarrera automatiquement la procédure finale.



    Changement des Tables Labels de SOURCEROR:
    ------------------------------------------
    Les tables labels utilisées par SOURCEROR sont juste assemblées
 fichiers source Merlin. Le fichier source est sur le Disk Merlin et
 peut ètre modifié directement par l'utilisateur. Il doit ètre as-
 semblé et sauvé sous le mème nom que le fichier label précédent.






    INFORMATION LISTING APPLESOFT:
    ------------------------------

    Sourceror FP:
    -------------
    Un fichier source de Basic Applesoft entièrement étiqueté et
 commenté peut ètre généré par le programme SOURCEROR.FP, sur
 l'autre face de la disquette ProDos Merlin.

    Ce programme travaille en faisant un scan de la copie Applesoft
 présente dans l'ordinateur et gébère des fichiers textes contenant
 la plus grosse partie du Basic Applesoft: APSOFT.1, APSOFT.2,
 APSOFT.3, APSOFT.4.

    Pour garder de la place, ces fichiers contiennent des macros qui
 sont définies dans un autre fichier sur la disquette intitulée
 APSOFT.S. Ce fichier, lorsque l'assemblage utilise la commande PRTR
 imprimera un désassemblage formatté de l'Applesoft, prenant et uti-
 lisant autant que nécessaire les fichiers APSOFT. Des détails sont
 donnés plus loin.

    S.V.P NOTEZ que ceci n'est PAS un listing "officiel" de APPLE
 COMPUTER, Inc., mais plutot un produit de la recherche personnelle
 de l'auteur et de l'interprétation de la ROM originale de l'Apple-
 soft. APPLE COMPUTER n'a été en aucun cas sollicité pour la prépa-
 ration de ces données, ni pour la finition du produit. L'utilisa-
 tion du terme APPLE ne saurais ètre intreprétée pour représenter
 quelconque visa ou autre de APPLE COMPUTER, Inc.

    De plus Roger Wagner Publications ne fourni aucune garantie ou
 viabilité quant à l'exploitation de ces données.

    ATTENTION: SOURCEROR.FP et quelques fichiers temporaires sont
 EFFACES lorsque SOURCEROR.FP est en cours. Pour cette raison, il
 est préférable de faire une copie de la face SOURCEROR.FP.




    Impression d'un Désassemblage Applesoft:
    ----------------------------------------
    1. Bootez ProDos Merlin,
    2. Brun Sourceror.FP depuis la commande de la disquette Merlin,
       utilisez la copie de Sourceror.FP,
    3. Lorsque Sourceror.FP est terminé, L)oad (Chargez) le fichier
       Applesoft,
    4. Pour imprimer le listing, tapez:
           PRTR 1  "I80N""APPLESOFT LISTING"
           ASM

    Dans l'exemple ci-dessus, la commande PRTR enverra le signal sur
 le Slot 1, initialisera l'interface imprimante avec <CTRL I-80N"
 (Le I est en inverse), et imprimera "APPLESOFT LISTING" en tète de
 page.

    Merlin demandera alors "GIVE VALUE FOR SAVEOBJ :" si vous voulez
 ou non sauver  un 'object code' généré par l'assemblage. Il est re-
 commandé de répondre "0". C'est tout ce que vous avez à faire pour
 enclencher la procédure d'impression. Si vous répondez "1", vous
 sauverez un 'object code' au dépens d'un ralentissement du système.

    Merlin éxécutera maintenant la première passe assembleur. La
 disquette sera sollicitée un instant, avec quelques périodes
 entre celles-ci. C'est normal. La première passe entière prends
 environ 3 minutes et demi.

    Merlin imprimera alors un désassemblage complet, et un listing
 Applesoft commenté. Il prendra 105 pages (Y compris les tables de
 symboles) et presque 1 heure 30 pour imprimer (Débit d'imprimante
 de 80 caractères/seconde).




    AppleSoft Source Cross Référence Listing:
    -----------------------------------------
    Merlin offre une autre source d'informations internes, les
 adresses internes Applesoft, subroutines et page zéro de "cross
 références". En utilisant l'utilitaire XREFA avec une source
 Applesoft, vous pouvez produire un listing de chaque routine,
 d'adresses de pages zéro et savoir là où elles sont utilisées et
 appellées. Ce sont des informations inestimables pour quelqu'un qui
 veut utiliser ces routines dans l'Applesoft pour ses programmes.

    Pour, par exemple, appeler un programme de l'utilisateur par un
 programme Applesoft en cours, faire des appels à des routines
 Applesoft internes et utiliser des pages zéro en $50 et $51 comme
 des registres temporaires ou des pointeurs. Ce "Cross Référence"
 informera immédiatement le programmeur si les routines que son pro-
 gramme utilise détruiront ou non le contenu de ces deux pages ou si
 cela causera des difficultées à localiser des bugs dans son progr.


    Manipulations pour Impression d'un Applesoft Cross Référence:
    -------------------------------------------------------------
 1. Chargez le fichier Applesoft depuis le disk SOURCEROR.FP,
 2. Quittez le mode EXEC et Appuyez sur -D- pour Disk commande,
 3. BRUN  /MERLIN/UTIL/XREFA,
 4. Allez en Editor avec la commande -E-,
 5. Envoyez la commande suivante: USER 3,
 6. Envoyez la commande PRTR: PRTR 1 "I80N" "APPLESOFT XREF"
 7. Envoyez la commande ASM pour démarrer la procédure d'assemblage

    Lorsque ceci sera fait, la source Applesoft sera à nouveau as-
 semblée. Le programme XREFA la sortie imprimante à la table de
 "Cross Référence".


Retour sommaire

hr Merlin

Glossaire.



    Glossaire:
    ----------
 Abort       :  Terminer une opération prématurément.
 Access      :  Localiser ou réparer une donnée.
 Address     :  Un endroit bien spécifique en mémoire.
 Algorithm   :  Une méthdoe spécifique pour résoudre un probl.
 Allocate    :  Allouer ou réserver un place.
 ASCII       :  Un système standard de 128 caractères assignés par
                des codes alpha-numériques.
 Base        :  Dans un système numérique, l'exposant auquel le
                système se réfère; Le nombre de symboles requiéris
                par ce système numérique.
 Binary      :  Un système de base de 2 nombres composés uniquement
                de zéros et de uns.
 Bit         :  Une unité de données binaires, comme 1 ou 0.
 Branch      :  Execution continue à un nouvel endroit.Branchement.
 Buffer      :  Espace temporaire de stockage de données.
 Byte        :  Représentation Hexadécimale de 8 bits binaires.
 Carry       :  Fouiller dans le registre 6502.
 Chip        :  Petite pièces de silicone et germanium contenant
                une foule de circuits intégrés.
 Code        :  Ecriture de données ou instructions de language
                machine.
 Ctrl        :  Abréviation de Control.
 Cursor      :  Caractère usuellement clignotant blanc qui marque la
                position du prochain caractères qui va ètre tapé.
 Data        :  Donnée. Information ou fait utilisé dans un progr.
 Décrement   :  Valeur décroissant constamment.
 Défault     :  Valeur nominale ou condition assignée à un paramètre
                s'il n'est pas spécifié par l'utilsateur.
 Delimit     :  Séparation. Comme un  :  dans une ligne de programme
                Basic.
 Displacement:  Constante ou variable utilisée pour calaculer la
                distance entre deux endroiits de la mémoire.
 Equate      :  Etablir une variable.
 Expression  :  Donnée symbolique, actuelle ou implicite.
 Fetch       :  Retrouver ou acquérir.
 Field       :  Portion de donnée réservée à un type spécifique de
                donnée.
 Flag        :  Endroit de la mémoire ou d'un registre utilisé pour
                préserver ou établir le status d'une opération don-
                née ou d'une condition.
 Hex         :  Système de nombres (Base 16) héxadécimaux, composés
                de chiffres de 1 à 9 et de lettres de A à F.
 High Order  :  Le premier Byte, ou le plus significatif, pour une
                valeur ou un adresse Hexa de deux Bytes.
 Hook        :  Adresse vecteur pour une routine ou un port I/O.
 Increment   :  Valeur croissant constamment.
 Initialize  :  Mettre tous les paramètres de programmes à zero, à
                la valeur normale ou par défaut.
 I/O         :  Entrée/Sortie
 Interface   :  Méthode d'interconnexion des équipements.
 Invert      :  Changer à l'état opposé.
 Label       :  Nom appliqué à une variable ou une adresse.
 Lookup      :  Argot; Voir table.
 Low-order   :  Le second ou le + petit Byte significatif d'une
                adresse ou d'une valeur de deux Bytes.
 LSB         :  Least Significant Bit or Byte.
 Macro       :  En assembleur, capacité à appeler un code par un nom
                symbolique et le placer dans le fichier Object.
 Microproc.  :  Coeur du micro-ordinateur (Le 6502 dans l'Apple)
 Mod         :  Algorythme retourant le reste d'une division.
 Mode        :  Sous-opération particulière.
 Module      :  Portion de programme destinée à une tache spécifique
 Mnemonic    :  Abréviation symbolique utilisant des caractères
                aidant au rappel d'une fonction.
 MSB         :  Most Significant Bit or Byte.
 Null        :  Sans valeur.
 Object Code :  Code pret à executer produit par un programme assem-
                bleur.
 Offset      :  Valeur d'un déplacement.
 Opcode      :  Instruction exécutée par le 6502.
 Operand     :  Données utilisées par une instruction du 6502.
 Page        :  Espace mémoire de 256 Bytes.
 Parameter   :  Valeur ou constante utilisée par un programme ou une
                opération pour une fonction.
 Peripheral  :  Procédé extérieur.
 Pointer     :  Endroit de la mémoire contenant une adresse de donée
                quelque part en mémoire.
 Port        :  Point d'interconnexion physique reliant les équi-
                pements exterieurs.
 Prompt      :  Caractère sollicitant l'utilisateur à entrer une
                donnée.
 Pseudo      :  Artifice, substitut.
 RAM         :  Random Access Memory.
 Register    :  Endroit mémoire, registre.
 Relative    :
 ROM         :  Read Only Memory.
 Sign Bit    :  Bit huit d'un Byte; négatif si valeur > à $80
 Source cde  :  Donnée entrée dans l'assembleur destinée à produire
                un programme en language machine lorsque elle est
                assemblée.
 Stack       :  Espace de stockage temporaire en RAM utilisé par le
                6502 et par des programmes en language assemblé.
 String      :  Un groupe de caractères ASCII usuellement inclus par
                les délimiteurs comme ' ou " .
 Sweet 16    :  Programme simulant un microprocesseur 16 Bits.
 Symbol      :  Label mnémonique ou symbolique.
 Syntax      :  Méthode prescrite pour l'entrée des données.
 Table       :  Liste de valeurs, mots et données référencé par un
                programme.
 Toggle      :  Passage d'un état à un autre.
 Variable    :  Expression alphanumérique pouvant ètre assignée à un
                nombre de valeurs.
 Vector      :  Adresse à référencer.


Retour sommaire

hr Merlin

Utilitaires.



               
       U.T.I.L.I.T.I.E.S          Merlin Pro


    Formateur:
    ----------
    Ce programme est concu pour réhausser l'utilisation de Merlin
 comme un éditeur texte. Il formattera automatiquement un fichier en
 paragraphes en utilisant une longueur de ligne spécifique. Dans le
 fichier original, les paragraphes sont séparés par une ligne vide.

    Pour utiliser FORMATTER, vous devez d'abord faire un BRUN depuis
 le mode EXEC. FORMATTER se chargera alors en haute mémoire.

    Pour formatter un fichier en mémoire, envoyez une commande USER
 depuis l'éditeur.

    Le programme FORMATTER demande des limites à formatter (Range).
 Si vous donnez juste un nombre, le fichier sera formatté depuis
 cette ligne jusqu'à la fin. Il vous sera demandé une longueur de
 ligne qui devra ètre inférieure à 250. Pour finir, vous devrez
 dire si vous voulez que le fichier soit justifié sur les 2 cotés.
 (Plutot que d'ètre seulement à gauche)

    La première chose donnée par le programme est le controle de
 chaque commencement de ligne par un espace. Si ce n'est pas le cas,
 un espace est inséré à chaque début de ligne. Ceci est fait pour
 donner une marge gauche en utilisant la commande éditeur TAB avant
 l'utilsation de la commande PRINT, pour imprimer le fichier.

    FORMATTER utilise des espaces inversés pour le remplissage né-
 cessité par les justifications des deux cotés. Ceci est fait pour
 pouvoir les localiser et reformatter le fichier plus tard si vous
 le voulez. Il est important de ne pas utiliser les commandes FIX et
 TEXT sur un fichier après que celui-ci ait été formatté (A moins
 qu'une copie ait été sauvée). Pour les fichiers provenant d'une
 source extérieure, il est préférable d'utiliser en premier la com-
 mande FIX pour s'assurer qu'ils sont dans les formats exigés par
 FORMATTER. Pour la mème raison, il est conseillé de reformatter un
 fichier en utilisant seulement la justification, avant toute édi-
 tion du fichier.

    N'oubliez pas d'utiliser les commandes TAB avant d'imprimer un
 fichier formatté.




    IREF   IREFA:
    -------------
    Cet utilitaire fourni un moyen de générer un listing Cross -
 Référence de tous les labels utilisés avec un programme de lan-
 guage assemblé Merlin.

    Un tel listing peu vous aider rapidement à trouver ou identi-
 fier des valeurs à travers un programme. Ceci plus spécialement
 lorsque vous tentez de comprendre, de debugger ou d'affiner
 certaines portions d'un long programme.

    L'assembleur Merlin produit tout seul l'impression de ses
 tables de symboles uniquement après un assemblage correct. Pendant
 que la table de symboles vour permet de visualiser les valeurs ou
 les adresses actuelles des labels,  cela ne vous permettra pas de
 poursuivre l'utilisation des labels à travers le programme.

    C'est là que le programme XREF intervient.

    XREF vous donne une impression alphabétique et numérique com-
 plète d'un label utilisé dans un programme de language assemblé.
 XREFA donne une table de Cross Référence par adresse. Ceci est plus
 utilisé pour une source importante contenant assez de fichiers PUT.

    XREF.H et XREFA.H sont des versions ProDos des programmes XREF
 et XREFA qui utilisent une page de haute mémoire plutot qu'une page
 mémoire 3. Ceci est prévu pour les utilisateurs ayant une Horloge
 en page 3.



       Exemples d'impression de Table de Symboles Merlin:

       Table de Symboles - Ordre Alphabétique:
          ADD    =$F786    BC    =$F7B0    BK    =$F706

       Table de Symboles - Ordre Numérique:
          BK     =$F706    ADD   =$F786    BC    =$F7B0


       Exemple d'impression Merlin XREF:

       Table de Symboles Cross Référencés - Ordre Alphabétique:
          ADD    =$F786  101  185*
          BC     =$F7BO  90   207*
          BK     =$F706  104  121*

       Table de Symboles Cross Référencés - Ordre Numérique:
          BK     =$F706  104  121*
          ADD    =$F786  101  185*
          BC     =$F7B0  90  207*


    Comme vous pouvez le voir dans l'exemple ci-dessus, la "défini-
 tion ou la valeur actuelle d'un label est indiquée par le signe "="
 et le numéro de ligne de chaque ligne dans le fichier source que le
 label fait apparaitre est listé à droite de la définition. En plus,
 le numéro de ligne où le label est soit défini soit utilisé comme
 un point d'entrée majeure est suffixé par un "*".

    Le rajout d'un trait est une notation spéciale pour des sources
 supplémentaires qui sont données durant l'assemblage avec le pseudo
 code PUT: par exemple, "134.82" indique  la ligne 134 du fichier
 source (Qui est la ligne qui contient le code PUT) et  la ligne 82
 du fichier PUT, où le label est actuellement utilisé.




    Instructions XREF:
    ------------------
 1. Allez en mode Executive Merlin, assurez vous que vous avez SAUVE
    le fichier sur lequel vous travailliez, et sélectionnez le numé-
    ro de DRIVE où se trouve le disk Merlin.
 2. CATALOGUEZ le disk et lorsque Merlin vous demande une commande,
    après le catalogue, entrez BRUN XREF.
 2a.Pour Merlin ProDos, appuyez sur D (Disk) et lorsque Merlin vous
    demande une commande, entrez /MERLIN/UTIL/XREF.
 3. Tapez la commande USER appropriée:
       USER O   -Imprime uniquement un list.assemblé ou un Cross-Ref
                 alphabétique (Notez que USER est idem à USER O).
       USER 1   -Imprime listing assemblé et un Cross-Référence
                 alphabétique et numérique.
       USER 2   -N'imprime pas le listing assemblé mais imprime les
                 listings Cross-Référence aplhab. uniquement.
       USER 3   -N'imprime pas le listing assemblé mais imprime les
                 listings Cross-Ref alphabétiques et numériques.

    Les commandes USER 1 à 3 (Ci-dessus) occasionnent des label dans
 assemblages conditionnels avec le DO en condition OFF, ignorés et
 non imprimés dans la table de Cross Référence.

    Il y a des commandes USER additionnelles 4 à 7 qui ont les mèmes
 fonctions éxecpté qu'elles occasionnent des labels dans les espaces
 d'assemblages conditionnels à imprimer, quel que soit l'état du DO.

    NOTE: Vous pouvez changer de commande USER quand vous le voulez
 (de USER 1  à USER 2  par exemple). Le changement ne sera permanent
 que si vous entrez une commande ASM (En dessous).

 4. Entrez une commande ASM pour commencer l'assemblage et l'impres-
    sion.


    Pendant que le programme XREF requiert les sorties assembleur,
 les codes avec LST OFF ne seront pas éxécutés et les labels se
 trouvant dans ces espaces n'apparaitront pas dans les tables. En
 particulier, il est nécessaire pour la bonne éxécution de XREF que
 la condition de LST soit ON à la fin de l'assemblage (Puisque le
 programme intercepte la sortie régulière de table de symbole). Pour
 la mème raison, la commande CTRL-D ne doit pas ètre utilisée durant
 l'assemblage. Le programme permet de déterminer si l'assembleur lui
 envoie un message d'erreur dans la première passe et interrompt
 l'assemblage dans ce cas, mais ce n'est pas sur à 100% .

    Une autre chose pour savoir quand utiliser une commande macro
 avec XREF. Les labels définis dans les définitions macros n'ont pas
 de signification globale et ne sont donc pas Cross Référencés.

       DEF    MAC                     <---- Définition Macro
              CMP  #]1
              BNE  DONE
              ASL
       DONE   <<<
   -------------------------          <---- Commencement Programme
              >>>  DEF.GLOBAL         <---- Appel Macro

    Dans l'exemple ci-dessus, la variable GLOBAL est Cross Référencé
 mais le label local DONE ne l'est pas.




    XREFA:
    ------
    C'est une adresse de programme Cross Référence tout à fait com-
mode lorsque vous avez un certain nombre de fichiers PUT. Puisque ce
programme n'a besoin que de 5 Bytes par Cross référence au lieu de 6
il peut supporter des sources beaucoup plus longues. Une des réfé-
 rences ne sera pas donnée parce qu'elle est égale à la valeur du
label éxecpté pour des labels EQUivalents, cas où il sera indiqué
l'adresse compteur lorsque l'équation sera terminée.



    PRINTFILER:
    -----------
    PRINTFILER est un utilitaire inclus dans Merlin qui sert à sau-
 ver sur disquette un listing assemblé comme un fichier séquentiel.
 Il vous permet en option de sélectionner "File Packing" qui réduit
 l'espace requit et vous permet de couper la sortie Vidéo pour des
 opérations plus rapides.

    Les fichiers textes générés par PRINTFILER incluent les Object
 codes d'un listing assemblé, ce qui n'est normalement pas faisable
 lors de sauvegardes de fichiers sources. Cela permet de disposer
 complètement d'informations de programmes de languages assemblés et
 donne l'avantage de ne pas avoir à assembler un programme pour voir
 les Objects Codes.



    APPLICATIONS:
    -------------
    Inclus dans les applications:
 - Incorporation des fichiers textes assemblés dans un document
    préparé par un mot processeur (Word Processor).
 - Envoi d'un fichier par communications avec un modem.
 - Disposition d'un mailing permettant de travailler avec le désas-
    semblage complet sans avoir à assembler le programme.



    Comment Utiliser PRINTFILER en Dos 3.3:
    ---------------------------------------
 1. Depuis le mode EXEC, assurez vous que vous avez sauver chaque
    fichier source (Sélectionnez en premier le Drive des fichier à
    sauver), sélectionner le Drive où se trouve PRINTFILER (Usuelle-
    ment le Disk Merlin) et faites un catalogue. Lorsque vous verrez
    apparaitre "COMMAND:", tapez BRUN PRINTFILER (Vous devez passer
    cette étape si vous avez avez déjà chargé Printfiler).

 2. Appuyez sur RETURN, sélectionner le Drive contenant le fichier à
    assembler et chargez le fichier en mémoire. (Vous devez passer
    cette étape si vous avez déjà fait BRUN PRINTFILER).

 3. Quittez l'éditeur, sélectionnez le Drive de là où vous voulez
    sauver le désassemblage, entrez dans l'éditeur à nouveau et
    entrez  USER "Nom de fichier" (Avec les guillemets). Vous pouvez
    alors utiliser la commande PRTR si vous voulez que les tètes de
    pages soit envoyés avec le listing. Dans ce cas, entrez la com-
    mande suivante à la place de la commande USER: PRTR 8 "Nom du
    fichier" "Page header" (Avec tous les guillemets).

 4. Entrez ASM, et après qu'il vous soit demandé si vous voulez "UP-
    DATE SOURCE", PRINTFILER assemblera automatiquement le fichier
    source directement sur le disk. Notez que vous ne verrez rien
    apparaitre sur l'écran puisque PRINTFILER est préconfiguré pour
    couper la sortie vidéo, ceci pour la rapidité des opérations.




    Comment utiliser PRINTFILER sous ProDos:
    ----------------------------------------
 1. Soyez certain que le fichier /MERLIN/UTIL/PRINTFILER est en
    place. Puis appuyez sur D pour commande Disk, et entrez: BRUN
    /MERLIN/UTIL/PRINTFILER.

 2. Chargez le fichier à assembler. Lorsque vous entrez dans
    l'éditeur, tapez USER "Pathname" (Nom de fichier) (En incluant
    les guillemets). Pour la commande PRTR, idem que pour l'utilsa-
    tion sous Dos 3.3, ci-dessus paragraphe 3. A la place de la com-
    mande USER, faites PRTR 8 "Pathname" "Page Header".

 3. Idem que paragraphe 4 de l'utilisation sous Dos 3.3, ci-dessus.




    Changer les Options de PRINTFILER:
    ----------------------------------
    Printfiler possède 2 options que vous pouvez changer: "File
 Packing" et "Vidéo Output". Changements que vous pouvez entrer
 temporairement ou de facon permanente.

    File Packing réduit la taille des fichier mis sur disquette par
 le remplacement des blancs par un simple caractères ayant un bit
 haut à l'état Off. Un listing de fichier compacté vous montre les
 blancs remplacés par une lettre en inverse (A= 1 blanc, B= 2 blancs
 C= 3 blans, etc...).

    Unpacking (décompactage) permet de restituer le fichier sous sa
 forme originale. Notez que lorsque vous ne pouvez pas assembler de
 fichier, vous pouvez au moins le lire.

    Vidéo échoing permet d'imprimer sur l'écran ce qui est envoyé
 sur la disquette. Le temps que cela prends ralentit Printfiler.

    Le procédé de coupure de la sortie vidéo permet un gain de temps
 de 25% environ.

    De plus, les fichiers non compactés prennent presque 2 fois plus
 de place que des fichiers compactés, et prennent presque 3 fois
 plus de temps.

    Pour changer les options PRINTFILER: (temporairement)
       Entrez en éditeur, entrez "MON" et entrez:
    300:00  00  Pour compacter et vidéo coupée, ou
    300:00  80  Pour compacter et vidéo en service, ou
    300:80  00  Pour décompacter et vidéo coupée, ou
    300:80  80  Pour décompacter et vidéo en service, ou

       les valeurs normales sont 300:80  00

    Tapez RETURN  CTRL-Y  RETURN pour retourner en mode EXEC. Les
 valeurs entrées sont valables jusqu'à ce que vous refassiez un
 BRUN PRINTFILER.

    Pour changer les options PRINTFILER: (De facon permanente)
    1. Chargez Printfiler et faites un ASM. Pendant l'assemblage,
       il vous sera demandé plusieurs choses:
    2. Après la question UPDATE SOURCE?, Printfiler demandera GIVE
       VALUE FOR FORMAT: si vous tapez 0, vous mettrez en service
       l'option Pack. Si vous tapez 1, ce ne sera pas le cas.
    3. Printfiler demandera alors GIVE VALUE FOR MONITOR: Si vous
       tapez 0, la sortie vidéo sera coupée, si vous tapez 1, ce
       sera l'inverse. Printfiler assemblera immédiatemment en
       Object Codes.
    4. Quitter l'éditeur et sauvez l'Object Code. A chaque fois que
       vous ferez un BRUN de l'Object Code, les valeurs utilisées
       seront celles entrées plus haut.

STEPH95...02/92


Retour sommaire

hr Merlin

Le microprocesseur 65802.



Merlin Pro 65802

LE MICROPROCESSEUR 65802
~~~~~~~~~~~~~~~~~~~~~~~~

Le nouveau microprocesseur 65802 est une amélioration du 65C02, qui supporte
l'adressage 16 bits, de nouveaux opcodes et de nouveaux modes d'adressage.

Il y a un nouveau bit d'état, appelé "bit d'émulation" et nommé E. Si ce bit
est à 1, alors le 65802 est totalement compatible avec le 6502 et le 65C02,
mais reconnait de nouveaux opcodes. Si ce bit est à 0, alors certaines
petites choses (comme le traitement de BRK) se passent differemment du 6502,
et l'adressage 16 bits est possible.

Le bit d'émulation E peut etre changé par seulement un opcode, XCE, qui
l'échange avec le bit de retenue C du registre d'état. Comme E ne fait pas
partie techniquement du registre d'état, PLP ne le change pas.

Quand E=0 (emulation off), il y a deux bits du registre d'état qui controle
les modes 16 bits du processeur. Un de ces bits, le bit 5, est le bit
inutilisé du 6502, et l'autre, le 4, est le bit BRK sur le 6502.
L'utilisation de ces derniers bits est rendu possible par un changement dans
la façon de traiter un BRK quand E=0.

Le bit 5 du registre d'état est appelé M, et sélectionne l'accès mémoire (par
LDA, etc..) sur 8-bits (M=1) ou 16-bits (M=0) ainsi que la taille de
l'accumulateur.

Le bit 4 du registre d'état est appelé X et sélectionne la longueur des
registres d'index (X et Y) sur 8-bits (X=1) ou 16-bits (X=0).

Quand E=0 et M=0, l'accumulateur est sur 16-bits et est appelé le registre C,
avec A correspondant aux 8 bits de poids faibles, les 8 bits de poids forts
étant appelés B. (On doit cependant utiliser LDA,etc.. dans le mode 16-bits).
Dans le mode 16-bits (E=0 et M=0), une instruction LDA $1000 chargera le
registre A sur 8 bits avec la valeur en $1000 et le registre B avec la valeur
en $1001.

Le registre de pile est aussi sur 16 bits quand E=0. Ainsi, on peut mettre
une pile n'importe où en mémoire.

Il y a un nouveau registre appelé le registre direct D quand E=0. Ce registre
augmente l'adressage en page zéro du 6502, qui est appelé "adressage direct"
sur le 65802. Quand E=0 n'importe quel "mode adresse direct" comme LDA $40
opère en ajoutant l'octet suivant l'opcode ($40 ici) au contenu du registre
direct, qui forme alors l'adresse effective pour l'instruction. Si le
registre direct contient la valeur $2010, alors l'instruction serait
équivalente à LDA $2050 (car $2010+$40=$2050), mais serait exécutée plus
rapidement. Pour une exécution plus rapide, l'octet haut du registre direct D
devrait etre laissé à 0, car des cycles d'horloges supplémentaires sont
nécessaires s'il n'est pas à zéro. L'effet de l'amélioration du registre
direct est de permettre l'implémentation d'une page zéro n'importe où en
mémoire. Par exemple si vous placez le pointeur $1000 en position $300  ($00
en $300 et $10 en $301) et que vous chargez le registre D avec la valeur
$300, alors l'instruction LDA (0),Y chargera l'accumulateur avec les données
qui sont à l'adresse $1000+Y (c'est-à-dire à partir de l'adresse contenue à
la position $300+0 plus la valeur de Y). Notez que si le registre direct
contient la valeur 0, alors l'adressage direct est complètement équivalent au
vieil "adressage en page zéro" dans tous les modes.


Les modes d'adressage "directs":
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L'utilisation du terme "direct" vient d'abominations de syntaxes commes
"adressage indirect direct pré-indexé". Les plus suspicieux d'entre vous
pourraient penser que ces termes ont été expressement choisis pour dérouter
les débutants et garder un air mystérieux sur la programmation en langage
assembleur. Nous éviterons ces termes et, à la place, nous décrirons les
différents modes d'adressage en montrant la syntaxe en assembleur
correspondante. Nous utiliserons un simple tiret "-" pour indiquer une
expression page zéro, et deux tirets pour indiquer une adresse ou une valeur
sur 16 bits.

Mode adresse : -

C'est le plus simple des modes d'adressage "directs". Le registre direct est
ajouté à - (le 2e octet de l'instruction). Cela forme l'adresse effective.
Ainsi, si D=$1234 alors LDA $56 chargera l'accumulateur à partir de l'adresse
$1234+$56=$128A (et de $128B si M=0).

Mode adresse : -,X

Le registre direct est ajouté à - et le résultat est ajouté au registre X
pour former l'adresse effective.

Mode adresse : -,Y

Ce mode est disponible seulement pour LDX -,Y et STX -,Y. Le registre direct
est ajouté à - et est ajouté à Y pour former l'adresse effective. (Notez que
l'assembleur acceptera des choses comme LDA $10,Y mais comme direct,Y n'est
pas supporté par LDA, ce sera assemblé comme si c'était LDA $0010,Y.) Pour
forcer le mode non-direct pour une instruction LDX ou STX, utilisez la
syntaxe LDX: et STX:.

Mode adresse : (-),Y

Le registre direct  est ajouté à - pour former une adresse adrs1. Alors le
contenu de adrs1,adrs1+1 forme une adresse adrs2. Elle est à son tour ajoutée
au registre Y pour former l'adresse effective. Par exemple, si D=$1234 et que
les adresses $125A,$125B contiennent l'adresse $DBA1 alors l'instruction LDA
($26),Y chargera l'accumulateur avec l(es) octet(s) en $DBA1+Y (et $DBA2+Y si
M=0).

Mode adresse : (-,X)

Le registre direct est ajouté à - pour former une adresse adrs1. Elle est
ajoutée au registre X pour former adrs2, puis le contenu de adrs2,adrs2+1
forme adrs3 qui sera l'adresse effective.

Mode adresse : (-)

Le registre direct est ajouté à - pour former l'adresse adrs1. Puis le
contenu de adrs1,adrs1+1 forme l'adresse effective.


Modes d'adressages absolus:
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Le modes d'adressage "--", "--,X" et "--,Y" opèrent de la meme manière que
sur le 6502, sauf bien sur en mode 16 bits. (Si M=0, STA $1000 rangera A en
$1000 et B en $1001.) Ainsi ces modes n'ont pas besoin d'etre détaillés ici.


Adressage immédiat:
~~~~~~~~~~~~~~~~~~~
L'adressage immédiat se réfère à des choses comme LDA #3 et CPX #$45. Le
65802 permet aussi ces memes opcodes pour opérer sur des données sur 16-bits.
Ainsi, ils opéreront sur 8 ou 16 bits dépendemment des bits d'états M et X.
Des codes tels que LDA #, CMP #, BIT #, (en fait n'importe quel code n'ayant
pas X ou Y) opèreront sur des données 16 bits si le drapeau M est à zéro. Les
codes immédiats comme LDX # ou CPY #, qui mettent en oeuvre X et Y, opèreront
sur des données 16 bits si le drapeau X est à zéro. Malheureusement,
l'assembleur (quel qu'il soit) n'a aucune façon de savoir quels seront l'état
des registres M et X dans un programme en exécution. Ainsi, pour que
l'assembleur assemble correctement un opcode immédiat, il doit etre informé
des états de ces bits. Cela est fait par le pseudo-opcode MX. (L'instruction
MX %01 dit à l'assembleur que M=0 et X=1, par exemple. Notez l'utilisation de
données binaires ici).


Adressage relatif à la pile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C'est un nouveau mode d'adressage qui n'a pas d'équivalent sur 6502. Il
existe à la fois en versions normales et indirectes indexées. Chacune de ces
versions est supportée par les instructions ORA, AND, EOR, ADC, STA, LDA,
CMP, et SBC:

-,S
Dans ce mode, le registre de pile est ajouté à - pour former l'adresse
effective (qui est une adresse dans la pile).

(-,S),Y
Dans ce mode, le registre de pile est ajouté à - pour former une adresse
adrs1. Puis le contenu de adrs1,adrs1+1 forme une adresse adrs2. L'adresse
effective est adrs2+Y. Le but de ce mode d'adressage est d'utiliser la pile
pour passer des adresses de données à des routines.


Adressage indirect long:
~~~~~~~~~~~~~~~~~~~~~~~~
C'est un nouveau mode d'adressage qui existe en versions normale et indexée.
Chacune est supportée par les instructions ORA, AND, EOR, ADC, STA, LDA, CMP
et SBC. Bien que l'assembleur supporte ces modes d'adressage, ils ne font
rien d'utile sur le 65802. (Ils sont fournis pour les capacités d'adressage
étendues du microprocesseur 65816) :

[-] (NRJP:En fait ce sont des crochets !)
Le registre direct est ajouté à - pour former une adresse adrs1. Le contenu
de adrs1,adrs1+1 est alors l'adresse effective. Dans le mode 16 bits, l'octet
en adrs1+2 donne le "banc d'adresse".

[-],Y
Le registre direct est ajouté à - pour former une adresse adrs1. Le contenu
de adrs1,adrs1+1 (et adrs1+2 en mode 16 bits) est alors ajouté au registre Y
pour former l'adresse effective.


Adressage du déplacement de blocs:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ceci s'applique seulement aux opcodes de déplacement de blocs MVP (move
forward (déplacement vers l'avant)) et MVN (move backward (déplacement vers
l'arrière)). Voir la description de ces codes.



NOUVEAUX OPCODES:
-----------------

Le 65802 supporte toutes les instructions du 65C02 (non-compris les codes
Rockwell). En plus, il dispose des nouveaux opcodes suivants :

Nouvelles instructions PUSH et PULL:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PEA --  (empile l'adresse absolue effective)
        ($F4 ; 3 octets)
Ceci met l'adresse 16 bits -- sur la pile, octet de poids fort en premier.

PEI -   (empile l'adresse indirecte effective)
        ($D4 ; 2 octets)
Le registre direct est ajouté à - pour former adrs1. Le contenu de
adrs1,adrs1+1 est alors mis sur la pile, octet haut en premier.

PER --  (empile l'adresse indirecte relative effective)
        ($62 ; 3 octets)
L'opérande donne un offset. Il est alors ajouté au compteur de programme (PC)
courant pour former une adresse adrs1. Le contenu de adrs1,adrs1+1 est
empilé, octet haut en premier.


PLB     (dépile le registre de banc de données)
        ($AB ; 1 octet)
Les registres de banc de données et de banc de programme appartiennent aux
capacités d'adressage étendues du 65816 et donc n'ont que peu d'utilité pour
le 65802.

PHB     (empile le registre de banc de données)
        ($8B ; 1 octet)

PLD     (dépile le registre direct)
        ($2B ; 1 octet)

PHD     (empile le registre direct)
        ($0B ; 1 octet)

PHK     (empile le registre de banc de programme)
        ($4B ; 1 octet)



INSTRUCTIONS DE MANIPULATION D'ETAT
-----------------------------------

REP #-  (mets à 0 les bits d'état définis par l'octet)
        ($C2 ; 2 octets)
Si le bit n de - est à 1, alors le n-ième bit du drapeau d'état correspondant
est mis à 0. Si le bit n de - est à 0, alors le n-ième bit est inchangé.

SEP #-  (mets à 1 les bits d'état définis par l'octet)
        ($E2 ; 2 octets)
Si le bit n de - est à 1, alors le n-ième bit du drapeau d'état correspondant
est mis à 1. Si le bit n de - est à 0, alors le n-ième bit est inchangé.

XCE     (échange le bit d'émulation E avec la retenue C)
        ($FB ; 1 octet)
Notez que c'est la seule façon de changer ou de lire le drapeau d'émulation
E.


NOUVELLES INSTRUCTIONS DE MANIPULATION DE REGISTRE:
---------------------------------------------------
(Rappel: le registre C est l'ensemble accumulateur A et B.)

TCD     (transfère l'accumulateur C au registre direct D)
        ($5B ; 1 octet)

TDC     (transfère le registre direct D à l'accumulateur C)
        ($7B ; 1 octet)

TCS     (transfère l'accumulateur C au registre de pile)
        ($1B ; 1 octet)

TSC     (transfère le registre de pile à l'accumulateur C)
        ($3B ; 1 octet)

TXY     (transfère X dans Y)
        ($9B ; 1 octet)

TYX     (transfère Y dans X)
        ($BB ; 1 octet)

XBA     (échange les parties A et B de l'accumulateur)
        ($EB ; 1 octet)


NOUVELLES INSTRUCTIONS DE BRANCHEMENT ET DE SAUT
------------------------------------------------

BRL --  (Branchement relatif long)
        ($82 ; 3 octets)
C'est juste comme un branchement sur le 6502 sauf que l'offset peut etre
compris entre -32768 et +32767.

JSR (--,X) (Saut pré-indexé à un sous-programme)
           ($FC ; 3 octets)
Un saut au sous-programme est effectué à l'adresse contenue en -- plus X.
(Il y a aussi des sauts "longs" qui ne font rien sur le 65802, et qui ne sont
pas supportés par l'assembleur).


INSTRUCTIONS DE DEPLACEMENT DE BLOCS
------------------------------------

MVP -,-   (Déplacement de blocs vers l'avant)
          ($44 ; 3 octets)
Cette instruction déplace l'octet contenu à l'adresse contenue dans le
registre X à l'adresse contenue dans le registre Y. Puis X et Y sont
incrémentés et l'accumulateur C est décrémenté. Le processus est répété
jusqu'à ce que l'accumulateur soit nul. Les deux octets suivants l'opcode
spécifient le banc de destination et le banc source respectivement. Sur le
65802 ils doivent etre à zéro, mais vous devez quand meme le spécifier.

MVN -,-   (Déplacement de blocs vers l'arrière)
          ($54 ; 3 octets)
Cette instruction déplace l'octet contenu à l'adresse contenue dans le
registre X à l'adresse contenue dans le registre Y. Puis X,Y et
l'accumulateur C sont décrémentés. Le processus est répété jusqu'à ce que
l'accumulateur soit nul. Les deux octets suivants l'opcode spécifient le banc
de destination et le banc source respectivement. Sur le 65802 ils doivent
etre à zéro, mais vous devez quand meme le spécifier.


INSTRUCTIONS DIVERSES
---------------------

COP -   (Coprocesseur)
        ($02 ; 2 octets)
Ceci entraine un saut à l'adresse contenue dans $FFF4,5. La signification du
deuxième octet dépendrait de la façon avec laquelle ce serait implanté dans
le système. Cette instruction peut etre utilisée pour appeler un coprocesseur
comme un coprocesseur arithmétique, mais ceci est lié au hardware.

STP     (Arrete l'horloge)
        ($DB ; 1 octet)
Arrete l'horloge du microprocesseur.

WAI     (Attend une interruption)
        ($CB ; 1 octet)
Mets la ligne RDY en état bas. Attend un IRQ ou un NMI.

RJP...03/92


Retour sommaire

hr Merlin

Carte mémoire.




Carte mémoire sous Merlin Pro, DOS 3.3
--------------------------------------

Adr$       Mémoire principale
      _____________________________
FFFF !                             !
     ! Moniteur                    !
F800 !_____________________________!
     !                             !
     ! Integer Basic (si chargé)   !
D000 !_____________________________!
     !                             !
     ! Positions d'entrées/sorties !
C000 !_____________________________!
     !                             !
     ! DOS 3.3                     !
9853 !_____________________________!
     !                             !
     ! Macros (fichiers USE)       !
     !                             !  _ Fin des fichiers librairies
     !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
     ! espace inutilisé            !
     !                             !  _ Fin du source
     !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~! 
     ! Fichier source              !
900  !_____________________________!
8FF  !                             !
     ! Espace pour l'éditeur et    !
     ! l'assembleur                !
800  !_____________________________!
     !                             !
     ! Page texte 1                !
400  !_____________________________!
     !                             !
     ! Vecteurs DOS                !
3F0  !_____________________________!
     !                             !
     ! Interfaces I/O pour les     !
     ! routines utilisateurs       !
300  !_____________________________!
     !                             !
     ! Buffer clavier              !
200  !_____________________________!
     !                             !
     ! Pile                        !
100  !_____________________________!
     !                             !
     ! Page zéro                   !
0    !_____________________________!



Adr$     Mémoire auxiliaire
      _____________________________
FFFF !                             !
     ! Moniteur                    !
F800 !_____________________________!
     !                             !
     ! Merlin Pro                  !
D000 !_____________________________!
     !                             !
     ! Positions d'entrées/sorties !
C000 !_____________________________!
     !                             !
     ! Code objet et dictionnaire  !
     ! (s'il existe)               !
8000 !_____________________________! _ Adresse OBJ (8000 par défaut)
     !   Limite ignorée si REL     !
     !                             !
     ! Table des symboles          !
     !                             !
1000 !_____________________________!
     !                             !
     ! Programmes USER (XREF,...)  !
     !       ou                    !
     ! espace libre                !
800  !_____________________________!
     !                             !
     ! Utilisé par carte 80 col.   !
400  !_____________________________!
     !                             !
     ! Inutilisé                   !
300  !_____________________________!
     !                             !
     ! Utilisé par XREF            !
200  !_____________________________!
     !                             !
     ! Pile de Merlin              !
100  !_____________________________!
     !                             !
     ! Page zéro de Merlin         !
0    !_____________________________!




Carte mémoire sous Merlin Pro, ProDOS
-------------------------------------

Adr$      Mémoire principale
      _____________________________
FFFF !                             !
     ! ProDOS                      !
D000 !_____________________________!
     !                             !
     ! Positions d'entrées/sorties !
C000 !_____________________________!
     !                             !
     ! Interpréteur Merlin Pro     !
AA00 !_____________________________!
A9FF !                             !
     ! Macros (fichiers USE)       !
     !                             !  _ Fin des fichiers librairies
     !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
     ! espace inutilisé            !
     !                             !  _ Fin du source
     !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~! 
     ! Fichier source              !
900  !_____________________________!
8FF  !                             !
     ! Espace pour l'éditeur et    !
     ! l'assembleur                !
800  !_____________________________!
     !                             !
     ! Page texte 1                !
400  !_____________________________!
     !                             !
     ! Vecteurs divers             !
3F0  !_____________________________!
     !                             !
     ! Interfaces I/O pour les     !
     ! routines utilisateurs       !
300  !_____________________________!
     !                             !
     ! Buffer clavier              !
200  !_____________________________!
     !                             !
     ! Pile                        !
100  !_____________________________!
     !                             !
     ! Page zéro                   !
0    !_____________________________!



Adr$     Mémoire auxiliaire
      _____________________________
FFFF !                             !
     ! Moniteur                    !
F800 !_____________________________!
     !                             !
     ! Merlin Pro                  !
D000 !_____________________________!
     !                             !
     ! Positions d'entrées/sorties !
C000 !_____________________________!
     !                             !
     ! Code objet et dictionnaire  !
     ! (s'il existe)               !
8000 !_____________________________! _ Adresse OBJ (8000 par défaut)
     !   Limite ignorée si REL     !
     !                             !
     ! Table des symboles          !
     !                             !
1000 !_____________________________!
     !                             !
     ! Programmes USER (XREF,...)  !
     !       ou                    !
     ! espace libre                !
800  !_____________________________!
     !                             !
     ! Utilisé par carte 80 col.   !
400  !_____________________________!
     !                             !
     ! Inutilisé                   !
300  !_____________________________!
     !                             !
     ! Utilisé par XREF            !
200  !_____________________________!
     !                             !
     ! Pile de Merlin              !
100  !_____________________________!
     !                             !
     ! Page zéro de Merlin         !
0    !_____________________________!




Traduction de RJP : 6/3/92


Retour sommaire

hr Merlin

Complément Merlin 8/16.



Les commandes de l'éditeur dans la version Merlin 8:

Manuel
Disk
Disk

Editor
Editor

Retour sommaire