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.
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.
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.
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
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
____________ __________
!
!
!__________
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__._._._______._._.__________
___._._._______._._._______________________________._._._______._._.____
____________ __________
!
!
!__________
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__._._._______._._.__________
___._._._______._._._______________________________._._._______._._.____
____________ __________
!
!
!__________
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>
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".
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.
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
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
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