2IMGCdrP@@0 X DISQUETTE DE DONNEES NON AMORCABLE.BCO=====!====!====!====!====!====!====!====!====!====!====!====!====!====!====!===@ O=====<====<====<====<====<====<====<====<====<====<====<====<====<====<====<===/gZ  AWTEMP.0000003  HS3.B' $TXT4ERLIN0000 =11$TXT5IN.PRO.SANS(*P  $TXT6MP.000000~1J^  $TXT7INPRO0000R,U } $TXT8IN.MACROS #<  $TXT9IN.LINKERFind8 Find (d-string) Find (line number) ?= Find (suite) Find (liste de suites) = =   !"#$%&source )par des caracteres non-alphanumeriques.$ De ce fait,FW "CAT" trouvera: CAT CAT-1! (CAT,X)"mais ne trouvera pas : CATALOG& SC "LABEL"]?= FW 20,30/50,99 "PTR" [trouver toutes les 9 lignes contenant "PTR"]97 Ceci est une alternative a Find.Cette commande ne ?=trouvera le mot specifie que s'il est encadre dans le ous terminez avec les memes lignes mais dans un ordre different.FW (Find Word) FW (d-string/d-string)" FW (num de ligne)?= FW "LABEL" [trouver toute ligne contenant ) ligne) TO (num de ligne)% MOVE (suite) TO (num de ligne)< MOVE 10 TO 20 [deplace la ligne 10 avant la 20]75 Identique a COPY mais apres le deplacements des >< Toutes les autres tque les changements ne soient effectues ,vous 53devrez confirmer si vous voulez effectuer tous les 9changements ou seulement quelques-uns ,"ALL" ou "SOME".75 Si vous selectionnez "SOME",tapez "S",l'editeur ?=s'arrete des que la 1ere chaine esturs ainsi pour changer 97"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.;9 Avant 0 "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 97doivent avoir les memes delimiteC ou "/"Change! Change (d-string d-string)?= C "hello" good-bye [cherche hello et le remplace 3 par good-bye]8 C 50"hello" bye [changement en ligne 50]?= C 50,10 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- 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 0 AT 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) EW (suite)% EW (liste de suites);9 Les lignes editees sont celles concer plus bas en 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 plarincipale a l'adresse definie par 4 ORG dans le source]?= GET$4000 [place l'objet en memoire > principale a l'adresse $4000]:8 Cette commande deplace le cssions 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 ?= pabel Inconnu" > dans le cas contraire]* VAL"$1000/2" [renvoie $0800]* VAL"%1000" [renvoie $0008]>< Cette commande retourne la valeur de toutes les formes 53de labels ou d'expreO 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 "Lionne comme un PR# en basic ,mais attention, dans )Merlin, PR# selectionne une imprimante!?= Pour selectionner une carte 80 colonnes en port 3,tapez >< Fonctes,plusieurs minutes peuvent etre >le mode EDITION.Voir ausstenant la chaines %delimitee qui est specifiee par EW. EW "PTR" EW 10,20 "PTR"Edit Edit, Edit (num de ligne) Edit (suite)6 Edit (d-string) Edit (liste de suites)?= E 10,50 "lacements 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];9 Cette commande deplace le fichier source en memoire >< SWAP recouvrira aussi XREF programmes ou d'autres USER >< 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 n source en memoire auxiliaire vous quittez 42Merlin pour l'Applesoft et lancez votre programme <:assemble.Vous terminez avec deux programmes complets l'un 'avec Merlin,l'autre avec l'Applesoft.86 Notez que GET et SWAP peuvent etre des commande6avec la version DOS 3.3 de Merlin puisque vous pouvez <:travailler sur votre assembleur en conservant Merlin dans 53les banques de memoire auxiliaire, quand vous avez ;9correctement assemble votre programme vous utilisez SWAP > inserer des caracteres de controle ou des caracteres ! de commande tels que CTRL-Q. CTRL-P (do ***'s)?= SI utilisees comme 1er carac?= 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 (Insait lance une commande d'insertion pour Merlin. CTRL-D (Delete Detruit)7 Detruit le caractere place sous le curseur.! Delete Key (touche Delete)2 Detruit le caractere avant le curseur. CTRL-F (Find)xJMERLIN PRO - MANUEL DE L'UTILISATEUR L'ASSEMBLEURL'assembleur :GECette partie du manuel n'a pas pour but de vous apprendre le langage LJassembleur. Elle va juste v')*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPcode 6502 ou 65C02 DOIVENT etre d{limit{es par un simple ou double KIapostrophe. Dans le cas contraire, l'assembleur interpr}tera la d-chaine 4comme un LABEL, une expression ou meme une donn{e.NLNotez bien que certains pseudo opcodes tout comme les "ceci est une d-chaine"$ 'ceci est une autre d-chaine' @une autre@2 Zen voici une d{limit{e par un z majusculeZ "A" 'A'LJRemarquez que les chaines d{limit{es utilis{es comme objet pour n'importe LJquel opchaines. Celles-ci doivent etre IGd{limit{es par un caract}re non num{rique autre qu'un slash (/) ou une NLvirgule (,). Une telle chaine est appel{e "d-chaine". Le d{limiteur courant .est le simple ou double apostrophe (' ou "). Exemples :LLes 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{ :FDLa plupart des pseudo opcodes, et quelques opcodes du 6502 et 65C02 LJpermettent que leurs op{randes soient des 1/ Expressions( 2/ Chaines d{limit{es (d-chaines) 3/ Donn{es) 4/ Nom de fichier ou de r{pertoireExpressions :MKLes expressions sont d{finies dans la partie conventions syntaxiques de ce manuel.Chaines d{limit{es :Nemples pour chacun d'eux.D{finitions pr{liminaires :NLLes types d'op{rande de presque tous les pseudo opcodes de Merlin ainsi que NLceux des microprocesseurs 6502 et 65C02 peuvent etre plac{s dans une de ces quatre cat{gories : ez des probl}mes @ d{terminer la bonne m{thode pour, par exemple, %construire une expression correcte.OMLa description des pseudo opcodes illustre les fonctions des nombreux pseudo PNopcodes de Merlin, la syntaxe correcte pour les utiliser et les exent KIconstruire diff{rentes expressions, et la syntaxe correcte utilis{e pour PNsp{cifier les diff{rents modes d'adressage autoris{s par le 6502 ou le 65C02. NLCette partie devrait etre comprise avant d'utiliser l'assembleur, car sinon MKvous auri/ Structures conditionnelles- 7/ Pseudo-opcodes pour les macros 8/ VariablesPNLes conventions syntaxiques de l'assembleur illustrent la syntaxe d'une ligne GEde code, la bonne m{thode pour sp{cifier nombres et donn{es, commpseudo OPCODES. 1/ Les directives* 2/ Gestion des entr{es-sorties0 3/ Gestion des chaines de caract}res; 4/ Gestion des donn{es et des zones de stockage$ 5/ Pseudo-opcodes vari{s) 6,' 1/ Organisation des nombres% 2/ Organisation du source6 3/ Expressions autoris{es par l'assembleur# 4/ L'adressage imm{diat3 5/ Mode d'adressage du 6502 et du 65C02& Description des es :$ 1/ D{finitions pr{liminaires,2 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'assembleurous expliquer les r}gles de syntaxe @ utiliser OMdans vos sources, et vous d{crire les options qui vous sont accessibles dans l'assembleur.&A propos de cette partie du manuel :ECe chapitre sur l'assembleur est d{coup{ en trois grandes partiopcodes 6502 et 65C02 NLutilisent le d{limiteur pour d{terminer le bit de poids fort des caract}res LJde la chaine (ASCII haut ou bas). Dans de tels cas, le d{limiteur devrait 2etre restreint @ un simple ou double apostrophe. Donn{es :HFLes 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)KILes noms de fichiers sont d{finis comme le nom d'un fichier DOS 3.3 sans LJd{limiteur, comme pn "$" et les binaires d'un "%", donc 0les quatre nombres suivants sont {quivalents :3 100 $64 %1100100 %01100100NComme montr{ dans le dernier nombre binaire, les z{ros en tete sont ignor{s.Donn{e imm{diate et adressIlong) si vous en utilisez plus. Une ligne de commentaire seule est aussi limit{e @ 64 caract}res.Organisation des nombres :KIL'assembleur accepte les nombres d{cimaux, hexad{cimaux et binaires. Les MKhexad{cimaux doivent etre pr{c{d{s d'uf s'il n'y a pas d'op{rande.8Convention sur la taille des caract}res et op{randes :LJLa taille maximale que peuvent atteindre op{rande + commentaire est de 64 PNcaract}res. Vous aurez une erreur "op{rande trop grand" (N.D.T. : operand too Kt les SWEET 16 PNPOPD). Par exemple, vous pouvez utiliser PAGE @ la place de PAG (mais @ cause NLdes exceptions, la quatri}me lettre ne doit pas etre un "0"). Le listing du OMsource ne sera pas tr}s beau avec un opcode de plus de cinq caract}res, saucontenu courant du compteur d'adresse.AConventions pour les opcodes et pseudo opcodes dans un source :LJL'assembleur regarde uniquement les trois premiers caract}res de l'opcode MK(avec certaines exceptions comme pour les appels de macros er ASCII que le nombre NL"0". Remarquez que les points (.) ne sont pas autoris{s dans les labels car Fils sont utilis{s pour sp{cifier le OU logique dans les expressions.MKUne ligne peut contenir juste un label. Cela {quivaut @ {galer ce label au (label est de 13 caract}res, mais plus de 8 IGproduiraient un listing moins lisible. Un label doit commencer avec un NLcaract}re au moins aussi grand, en valeur ASCII, que le deux-points (:), et NLne doit pas contenir de caract}re plus petit, en valeuodes), .except{ que le num{ro de ligne sera imprim{.OMLe 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 :ECLa taille maximale d'un e commen\ant par ";" sont KIaccept{es et tabul{es dans la zone de commentaires comme dans la ligne 3 LJci-dessus. L'assembleur accepte les lignes vides dans le source et il les PNtraitera comme une instruction SKP 1 (voir la partie sur les pseudo opcE62 * CECI EST UNE LIGNE UNIQUEMENT DE COMMENTAIRES?3 ;TABULE PAR L'EDITEURPNUne ligne comportant uniquement des commentaires peut commencer par "*" comme JHci-dessus dans la ligne 2. Cependant, les lignion du source :Syntaxe d'une ligne de source0Une typique ligne de source ressemble @ cela :6 LABEL OPCODE OPERANDE ;COMMENTAIREVoici quelques exemples :B1 START LDA #50 ;CECI EST UN COMMENTAIRteurs, comme par exemple des apostrophes autour du nom. Les sources, PNnoms 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 :OrganisatS seulement)OMLes noms de r{pertoires sont d{finis comme les noms de r{pertoires ProDOS et DBsont donc restreints @ la d{finition de ceux-ci dans le manuel de NLl'utilisateur ProDOS. Les noms de r{pertoires utilis{s par Merlin n'ont pas PNde d{limiar exemple sans apostrophes autour du nom. Les sources LJportent le suffixe ".S". Les fichiers TXT, USE et PUT sont pr{fix{s "T.". HFL'{ventuel pr{fixe ou suffixe ne doit pas etre utilis{ dans le nom du fichier.-Noms de r{pertoires : (ProDOe :MKPour faire comprendre @ l'assembleur de traiter un nombre comme une donn{e OMplutot qu'une adresse, ce nombre doit etre pr{fix{ par un "#". Le "#" est l@ 7pour sp{cifier un "nombre" ou "donn{e", par exemple :2 LDA #100 LDA #$64 LDA #%1100100OMCes trois instructions vont toutes charger l'accumulateur avec le nombre 100 (d{cimal).KUn nombre non pr{c{d{ d'un "#" sera interpr{t{ comme une adresse. Ainsi :3 LDA 1000 LDA $3E8 LDA %1111101000Gst priorit{s dans les expressions :PNLes parenth}ses ne sont normalement pas accept{es dans les expressions. Elles JHne sont pas utilis{es pour modifier les priorit{s dans l'{valuation des PNexpressions. Toutes les op{rations arithm{tiques ou logiques 1)5 "O"!LABEL (ASCII "O" EOR LABEL)5 LABEL&$7F (LABEL ET 7F en hexa): *-2 (adresse courante moins 2)> LABEL.%10000000 (LABEL OU 10000000 en binaire)1Parenth}ses elexes :5 LABEL1-LABEL2 (label1 moins label2)? 2*LABEL+$231 (2 fois label plus 231 en hexa)< 1234+%10111 (1234 plus le binaire 10111)B "K"-"A"+1 (ASCII "K" moins ASCII "A" plus (primitive constitu{e d'un label)G #"A" (primitive constitu{e de la lettre "A")C * (primitive = valeur courante du PC)@Les suivantes sont des exemples d'expressions plus comps primitives en utilisant les 'op{rateurs arithm{tiques et logiques."Exemples d'expressions l{gales :: #01 (expression primitive = 1)C #$20 (expression primitive = 32 d{cimal)A LABELnt construites en utilisant les expressions primitives NLd{finies ci-dessus, avec ou sans op{ration arithm{tique et/ou logique. Ceci MKveut dire que les expressions peuvent prendre la forme de primitives ou de FDprimitives avec op{rations sur d'autressembleur connait les quatre expressions arithm{tiques : +, -, / (division IGenti}re), et * (multiplication). Il connait aussi les trois op{rations 0logiques : ! (ou exclusif), . (ou), et & (et).Construction d'expressions :KILes expressions socas n[3, la "valeur" de l'expression primitive OMest juste la valeur ASCII du caract}re. Le bit de poids fort sera @ 1 si des Jguillemets (") sont utilis{s, et @ 0 si une apostrophe (') est utilis{e.)Expressions arithm{tiques et logiques :PNL'aquel caract}re ASCII pr{c{d{ ou entour{ par des guillemets ou apostrophes: 4 le caract}re "*" (tenant lieu d'adresse courante)PNTous les formats de nombres acceptent 16 bits de donn{es et les z{ros de tete PNne sont jamais requis. Dans le essions sont construites @ partir d'"expressions primitives" par FDutilisation d'op{rations arithm{tiques et logiques. Les expressions primitives sont : 1 un label6 2 un nombre (qu'il soit d{cimal, $hexa ou %bin)NL 3 n'importe de poids fort de l'accumulateur.*Expressions autoris{es par l'assembleur.OMPour rendre plus claire la syntaxe qu'accepte et/ou requiert Merlin, on doit 0d{finir sa signification par une "expression".Expressions primitives :KILes expr 10 DA 100 DA 1000 DA 10000de la meme fa\on, ORA #$80est moins clair que& ORA #%100000005qui met @ 1 le bit1 DA $A DA $64 DA $3E8 DA $2710Aest correcte mais plus myst{rieuse que son {quivalent d{cimal : DA 1 DA ont des fa\ons {quivalentes de charger A avec l'octet situ{ en $3E8.>Utilisation des nombres d{cimaux, hexad{cimaux et binaires :OMUtilisez le format appropri{ pour la clart{. Par exemple la table de donn{es : DA $ sont {valu{es de ;gauche @ droite (2+3*5 sera assembl{ comme 25 et non 17).KILes parenth}ses sont utilis{es pour retrouver une valeur de la m{moire @ MKl'emplacement sp{cifi{ par la valeur de l'expression sans les parenth}ses, JHcomme un adressage indirect. Cet emploi est restreint @ certains pseudo opcodes par exemple :! DO ($300)MKdit @ l'assembleur de g{n{rer le code si la valeur de l'adresse $300, @ ce 1moment de l'assemblage, est diff{rente de z{ro.&@ une adresse en page z{ro.LJNOTE : le "mode accumulateur" ne requiert pas d'op{rande (la lettre "A"). ECCertains assembleurs demandent un "A" comme op{rande pour ce mode. OML'assembleur d{cidera de la l{galit{ du mode d'adressage pour n'importe qutandis queE LDA: $10 s'assemble comme non-page z{ro (3 octets).PNDe plus, dans les modes index{s indirects, seule une expression page z{ro est IGautoris{e, et l'assembleur produira un message d'erreur si l'"expr" ne )renvoie pas quand cela est n{cessaire. NLMerlin offre la possibilit{ de forcer le mode non-page z{ro. Pour ce faire, Mil suffit d'ajouter un signe (sauf un "D") @ la fin de l'opcode. Exemple :K LDA $10 s'assemble comme page z{ro (2 octets) LDA (6,X)? postindex{ en Y OPCODE (expr),Y STA ($FE),Y(Adressage sp{cial forc{ non-page z{ro.MKIl n'y a pas de diff{rence de syntaxe entre les modes page z{ro et absolu. OML'assembleur utilise automatiquement la page z{ro BIT $300? index{ en X OPCODE expr,X STA $4000,XA index{ en Y OPCODE expr,Y SBC LABEL-1,Y>indirect JMP (expr) JMP ($3F2)= pr{index{ en X OPCODE (expr,X) LDX #>LABEL1-LABEL2-19page 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 CLC7accumulateur OPCODE ROR<imm{diat (donn{e) OPCODE #expr ADC #$F8< CMP #"M"I .PNIl existe 12 modes d'adressage l{gaux. Leurs syntaxes appropri{es sous Merlin est :; syntaxe exemple; ------- -------7implicite OPCODE 65C02 avec les mn{moniques KIstandard. Il accepte aussi BLT (branchement si plus petit que. N.D.T. : KIBranch if Less Than) et BGE (branchement si plus grand ou {gal. N.D.T. : IBranch if Greater or Equal) comme {quivalents respectifs de BCC et BCSonA #>expression donne l'octet de poids fort de l'expressionPN #/expression est une syntaxe optionnelle pour obtenir l'octet de poids fort de l'expressionModes d'adressage du 6502.KIL'assembleur accepte tous les opcodes 6502 etdonn{es imm{diates JH(comme les nombres et contrairement aux adresses), le mode imm{diat est 4signal{ en faisant pr{c{der l'expression d'un "#".$Par exemple on a LDX #3. De plus :C # CHK (Option unique pour ce code)E Ceci mets un "Checksum byte" dans l'object code @ l'endroisation ci-dessus faite avec des variables incr{men-F t{e dans l'ordre pour construire une table ne MARCHERA PAS si elle C est utilis{e avec une macro. Des structures de programmes comme C celle-ci doivent etre effectu{es comme les parties du prog )A - )A+1 DFB )A __^/ Assemblera la talbe 1, 2, 3, ....., $FF.G La valeur maximum de LUP est $8000, le code sera tout simplement+ ignor{ si vous tentez d'aller plus loin.G NOTE: L'utilSL ASL ASL (LUP continu) -------------E Peut-etre que la principale utilisation de ceci est pour la# construction de tables. Exemple: )A - 0 LUP $FF 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 Am{ sur l'{cran @ la placeF du message standard "Give value for Label:". Une colonne est mise @ disposition du String. LUP ---( LUP expression (Loop)/ __^ (Fin du Loop)C )D Ceci permet au Label d'etre {galis{ depuis le clavier durant F l'assemblage. Chaque expression peut etre entr{e, cependant un mes-< sage BAD INPUT arrivera si l'entr{e ne peut etre d{finie.F Le String d{limit{ optionel sera impri Label KBD d-string@ OUTPUT KBD (Get value of Output from kbd)) OUTPUT KBD "Send to Printer"B (Promt with the d-string for the3 value of OutputQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| ----------------------- MISCELANEOUS PSEUDO OPS -----------------------( KBD (Define Label from KeyBoarD)( --------------------------------- Label KBDxDO=!=!=!==!=!====!====!====!====!====!====!====!====!====!====!====!====!====!===@ O=<=<=<==<=<====<====<====<====<====<====<====<====<====<====<====<====<====<===pression ERR `ExpressionC ERR $80-($300) (Erreur si $80 n'est pas en $300)8 ERR *-1/$4100 (Erreur si PC > $4100)@ ERR `$5000 (Erreur si l'adresse code REL 3 d{passe $5000)F "ERR Expression" am}nera une erreur volontairement si l'expres-E sion a une valeur non-z{ro et le message "BREAK IN LINE ???" appa- raitra. (ERR Continu) -------------G Ceci peut etrt du code MX est d'in-. former l'assembleur du status des ces bits.F Trois des exemples ci-dessus utilisent des expressions binairesE comme op{rande du code MX. Notez que chaque expression valide doitC }tre utilis{e aussi longtemps qu'il ent lorsque l'assembleur est en mode 65802, ou que 2 codes XC onD {t{ donn{s cons{cutivement. L'assembleur ne peut d{terminer si leE processeur est en mode 16 bits m{moire (Status M bit=0) ou en modeG registre index 16 bits (Status X bit=0). Le bu %01 (Mode X ON et Mode M OFF); MX 3 (Modes M & X 16 bits OFF)D Ce pseudo code est utilis{ pour informer Merlin des prochainsE status de status "long" du processeur 65802. Il fonctionne unique-D m* 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 ez que le pseudo code XC ne permet pas l'utilsation des codesG BIT {tendus avec le chip Rockwell 65c02. Il y a cepedant une librai-F rie macro disponible sur le disk Merlin Pro, qui peut etre uitlis{e* pour "outiller" ces codes additionnels.------------------------0 XC (Option 65c02)0 XC (2 * ds la rang{e) (Option 65802)F Ceci permet les extra-codes 65c02, Si vous l'utilsez deux fois,* les codes 65802 peuvent etre assembl{s.G Not'est pas s{lectionn{, alors ces noms de codes peuvent }tre utilis{sC 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)+ ------------n, et qu'il est pr{f{rable de le mettre @ la fin. SW (SWeet 16 codes) --------------------> SW (Option unique pour ce code)C Ceci autorise des codes Sweet 16. Si SW (Similaire pour XC) G n'expression de le code ERR.G Vous pouvez ainsi constater le r{sultat qui se produira si on essayeG de "linker" le fichier PI @ une adresse sup{rieure @ $81C. Notez queG la position de ce code dans un fichier REL n'a pas d'effet sur cette9 actio tuel n'a pas atteint l'expression ou plus (l'expression doit etre E absolue). Si le "Linker" trouve que le module DOIT s'{tendre au -G del@ de l'expression, alors il stoppera, acoompagn{ du message "Con-D straint Error" suivi de la valeur de l" donnera une erreur en seconde passeE si le pointeur adresse atteint l'expression ou plus. C'est {quiva-G lent @ "ERR *-1/expr", mais lorsqu'il est utilis{ avec des fichiers G REL, il ordonne au "linker" de voir si le dernier byte du module ac-Exe valable: ERR ($300)-$4CF Celle-ci produire une erreur dans la premi}re passe et arr}tera6 l'assemblage si $300 ne contient pas la valeur $4C.9 Notes pour les fichiers REL et le pseudo code ERR:G La synthaxe "ERR`EXPRESSIONimera pas les {critures au del@E de $9600 durant l'assemblage, mais elles peuvent ne pas }tre char-G g{es. Les erreurs arrivent uniquement dans la seconde passe de l'as-4 semblage et ne "raccourcissent" pas l'assemblage.2 Une autre synthae utilis{ pour s'assurer que le programme n'{x}dera> pas, par exemple, $95FF, en additionnant la derni}re ligne: ERR *-1/$9600E NOTE: L'exemple si dessus vous alertera uniquement que le pro-E gramme est trop long, mais ne supprest avec les valeurs de 0-3.E Ce code DOIT }tre utilis{ lorsque l'on se sert de possibilit{sF du 65802 pour informer l'assembleur sur le mode appropri{ @ adopterE pour assurer l'assemblage correct des modes de commandes imm{diats1 (Comme l'expression LDA # par exemple, etc...)" USR (USeR d{finable codes)" ---------------------------" USR Optional expressionsF USR Expression (Exemple d{pendant de la d{fin.)C C'est un code d{fioutine contient un RTS @ $310, alors: ERR ($310)-$60G testera ce byte et interrompra l'assemblage si RTS n'est pas l@.C Pareillemnt, si vous savez que la routine requise doit assembler? exactement 2 bytes de donn{es, vous pouvim{e (Dans le second passage). (USR Continu) -------------G Lorsque vous utilisez le code USR dans un fichier source, il estF sage de s'assurer de la pr{sence en m{moire des routines requises. @ Si, par exemple, votre r{crire @ $900.D Vous pouvez utiliser les endroits page z{ro $60-$6F, mais ne E devez pas alt{rer d'autres endroits. Vous ne devez rien changer deF $226 @ $27F, ou de $2C4 @ $2FF. Apr}s retour de vos routines (RTS),7 la ligne USR sera imprra la location VALUE et F VALUE +1, Bit bas en premier. Dans le premier passage, celle valeur6 ne sera pas significative si NOTFOUND est non z{ro.G Les endroits appropri{s pour vos routines sont $300-$3CF et $8A0) $8FF. Vous ne devez pas expression n'est pas reconnu, alors la localisation NOT FOUND sera D non z{ro. Dans le second passage toutefois vous aurez un message E erreur UNKNOW LABEL et le restant de votre routine sera ignor{. AuE retour d'EVAL la valeur de l'expression sependra du caract}re, siF c'est une paranth}se droite, un espace, un comma ou une fin d'op{r- ande.F Chaque caract}re non allou{ causera un assemblage couper par unG message BAD OPERAND ou un autre message erreur. Si un Label dans uneF pointer le premier caract}re de la portion de l'op{rande @ {valuer.C (Faire X=0 pour {valuer l'expression au d{but de l'op{rande). AuE retour d'EVAL, X va pointer le caract}re suivant l'expression {va-E lu{e. Le registre Y sera 0, 1 ou 2, cela d{neD sera pas gard{ correctement et l'assemblage des autres parties du! programme seront incorrectes !E Si vos routines on besoin d'{valuer l'op{rande, ou une parite deF celle-ci, vous pouvez le faire avec un JSR EVAL. Le registre X doitFera Y mais m}lera A et X. Dans le premier pas-E sage, PUTBYTE aujustera SEULEMENT les objects et pointeur adresse,C le contenu des registres n'est pas important. Vous DEVEZ appelerF PUTBYTE le MEME NOMBRE TEMPS pour chaque passage, ou le pointeur ne sera appell{e par le code USR avec A=0, Y=0 etF "carry set". Pour ordonner @ l'assembleur de mettre un byte dans un9 object code, vous devez JSR PUTBYTE avec le byte en A. (USR Continu) -------------D PUTBYTE pr{servbined length of1 ;operand and command4 NOTFOUND = $FD ;See discussion of EVAL6 WORKSP = $280 ;Contains the operand and7 ;comment in positive ASCIIC Votre routi dessous* EVAL = $E5F9 ;Voir dessous= PASSNUM = $2 ;Contient l'assembly pass number) ERRCNT = $1D ;Error Count4 VALUE = $55 ;Value returned by EVAL: OPNDLEN = $BB ;Contains com faire un JMP @ $B6DA @ la routine principale et puis RTS.C 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 ;Voirnissable par l'utilisateur. Il fait un JSRF $B6DA. Cet endroit contient un RTS apr}s un boot, un BRUN MERLIN ouD un BRUN BOOT ASM. Pour choisir votre routine, vous devez faire unC BRUN depuis la commande EXEC apr}s le catalogue. Ceci doit juste<ez le v{rifier avec:" LABEL USR OPERAND$ ERR *-LABEL-2F Cela "forcera" une erreur dans le second passage si JSR ne pro-& duit pas exactement 2 object bytes.G Il est possible d'utiliser USR pour plusieurs routines diff{ren-G tes dans la m}me source. Par exemple, votre routine doit v{rifier laF premi}re expression op{rande pour un index @ la routine d{sir{e et E agir en accord. Chaque "USR 1, QUOI QUE CE SOIT" branchera la pre-D mi}re caract}re de l'op{randeD pour un assortiment. Si un assortiment est trouv{, alors le code E suivant est assembl{. Comme avec DO, cela doit se terminer par un G FIN, avec des op{rantions ELSE au milieu. Le comma n'est pas examin{6 et chaque car IF "=)1 (Alternative avec "=")G Ceci @ pour effet de "regarder" si Char est le premier caract}reF de remplacement String pour )Var. La position est importante. L'as-F sembleur regarde le premier et le troisi}me IF (,)1 (Si le premier caract}re de )1G est "(" alors assembler le code0 suivant)F IF ",)TEMP (Si le 1er caract. est ", ass.)= Intervertis la condition d'assemblage (ON devient OFF et OFF de-& vient ON), ceci pour le dernier DO. IF (IF so then do) -------------------D IF char,)Var (IF char est le premier caract}re de )Var )E structures DO/FIN sont prises enE compte pour la mise en place d'assemblages conditionnels dans des macros. ELSE (ELSE do this) --------------------C ELSE (Option unique pour ce code)GG vent }tre mises plus de huit fois (possibilit{ acquise avec quelquesG ELSE au milieu). Si la condition DO est Off (Valeur 0), l'assemblageG ne reprendra pas jusqu'@ ce que le FIN correspondant soit compt{, ouD jusqu@ ce qu'un ELSE arrive. Lesns diff{rentes de codes sources.F Chaque DO doit }tre d{termin{ plus tard quelquepart par un FIN,G et chaque FIN doit }tre pr{c{d{ d'un DO. ELSE doit uniquement inter-G venir dedans, comme une structure DO/FIN. Les structures DO/FIN peu- une version pour Apples avec des adaptateurs lower case etF une autre version sans. En utilisant les assemblages conditionnels,C la modification d'un programme devient plus simple, puisque vousG n'avez pas @ faire de modification dans deux versiomme une version RAM, pour d{bugger. Ces assemblages con-E ditionnels peuvent }tre utilis{s pour cr{er ces diff{rents objects+ codes sans avoir recours @ deux sources.D Egalement, dans un programme contenant du texte, vous pourrezE vouloirrces d{sign{es de g{n{rer F simultan{ment des codes diff{rents pour des situations diff{rentes.D Par exemple si vous d{signez un programme pour aller en ROM chip,F vous pourrez faire une version pour la ROM et une autre un peu dif-F f{rente, coes.C Except{ pour des noms macros, il ne reconnaitra aucun label. Si F 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.E Il est aussi hai-bituel pour des sou LAB1-LAB2 (If LAB1=LAB2 then Off)E Ces ensembles avec ELSE et FIN sont les assemblages condition-F nels de pseudo ops (Pseudo op{ration codes). Si l'op{rande est {va-E lu{e @ z{ro, l'assembleur s'arr}tera de g{n{rer des objects cod DO 0 (Turns assembly Off): DO 1 (Turns assembly On)< DO LABEL (If LABEL<>0 then On)> DO LAB1/LAB2 (If LAB1 DOroutine, "USR 2, QUELQUECHOSE" branchera la seconde, etc... ----------------------- CONDITIONNAL PSEUDO OPS ----------------------- DO (Do if true) ---------------- DO Expression; act}re peut }tre utilis{. Par exemple: IF "=)1F peut }tre utilis{ pour tester si le premier caract}re de la va-E 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)F Ceci efface les derniers DO et IF et continue l'assemblage avecF le plus haut niveau ts corrects, mais l'assembleur leur assignera une varia-; ble. Une variable doit donc }tre d{finie pour cet usage.E Il est impossble d'utiliser une variable pour des branchementsE post{rieurs en utilisant le m}me label aux places num{rot{es,bles. Ils peuvent }tre red{finis aussi souvent queF vous le d{sirez. Le but {tant de les utiliser dans les macros, mais+ elle ne sont pas concues pour cet usage.E Des r{f{rences avanc{es d'une variable sont impossibles (Avec F des r{sultade la macro G nomm{e @ l'endroit pr{sent. Voir la section MACROS. Il peut }tre la- bell{. --------- VARIABLES ---------F Les labels commencant par un ) (crochet gauche), sont percusD comme des varia. PMC (>>>) (Macro name) ------------------------ PMC Macro-name, >>> Macro-name (Autre synthaxe). Macro-name (Autre synthaxe 2)E Ceci ordonne @ l'assembleur d'assembler une copie MAC). EOM (<<<) ---------- EOM( <<< (Alternative de synthaxe)G Ceci signale la fin de la d{fintion macro. Il doit }tre labell{ G et utilis{ pour brancher @ la fin d'une macro, ou une de ses copiesi signale le d{part d'une macro d{finition. Il doit }tre la-F bell{ avec le nom macro. Le nom utilis{ est r{serv{ et ne peut }treD 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#ADR1;ADR2$ MOVD #ADR1;(ADR2),Y ---------------- MACRO PSEUDO OPS ----------------& MAC (Begin MACros d{finitions)& ------------------------------- Label MACF Cec ; 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 MOV )1+1;)2+15 FIN ; MUST close ALL> FIN ; Conditionals, count DOs? FIN ; & IFs, deduct FINs. Must9 <<< ),Y MOV )1+1;)2 FIN= ELSE ;Synthaxe MOVD ????;ADR26 IF #,)1 ; MOVD #ADR1;ADR2" MOV )1/$100;)2+15 ELSE ; MOVD ELSEA IF (,)2 ;Synthaxe MOVD ????;(ADR2),Y INY: IF #,)1 ; MOVD #ADR1;(ADR2),Y MOV )1/$100;)9 ELSE ; MOVD ADR1;(ADR2nthaxe MOVD (ADR1),Y;???? INY= IF (,)2 ; MOVD (ADR1),Y;(ADR2),Y MOV )1;)29 ELSE ; MOVD (ADR1),Y;ADR2 MOV )1;)2+1 FIN LDA )1 STA )2 <<<F * Macro "MOVD", d{place des donn{es de )1 @ )2 avec diverses syn- thaxes valables MOVD MAC MOV )1;)2A IF (,)1 ;Syde l'assemblage conditionnel, ou ON si FIN con- clu le dernier DO ou IF.: Exemples d'utilisation de l'assemblage conditionnel ----------------------2 * Macro "MOV", d{place des donn{es de )1 @ )2 MOV MAC dansG le source. Cela simplifie la nomination du label pour des programmesD 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 INY6 6 BNE )JLOOP ;Branch to line 2 7 NOGOOD LDX #-1 8 )JLOOP INX 9 STA DATA,X 10 LDA TBL2,X6 11 BNE )nt de code ayant un diff{rent ORG. (Lorsqu'C ils sont utilis{s dans un fichiers REL, les labels compris dans D une section entre une "Adresse ORG" et une "Non-Adresse ORG" sontF consid{r{s comme des adresses absolues. Ceci est UNIQUEMENT destin{E} (ORG Continu)  -------------C ORG sans op{rande est accept{ et trait{ comme un REORG. CeciD est pr{vu pour utiliser le r{tablissemnt de l'adresse correcte duE pointeur apr}s un segmeDO=!=!=!==!=!====!====!====!====!====!====!====!====!====!====!====!====!====!===@ O=<=<=<==<=<====<====<====<====<====<====<====<====<====<====<====<====<====<===le peuvent pas. La meilleure chose est d'utiliserF le label local comme un point de branchement, et les variables pour des "passing datas".STEPH95...03/92ncant par ")"F Notez que le label local ne sauve pas d'espace dans la table deG symbole, pendant que les variables le font. Le label local peut }treF utiliser pour des branchements post{rieurs et ult{rieurs, alors queE les variables ne s types distincts de albels utilis{s par l'assembleur9 Chacun est assembl{ et trait{ diff{remment par Merlin.; Label Global: Label ne commencant pas par ")" ou ":"- Label Local : Label commencant par ":"- Variable : Label commes locaux:G Le label local ne peut }tre utilis{ dans une macro, vous ne pou-F 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:G Il y a troial @ Loop2& 10 STA (STUFFDEST),Y 11 INY 12 CPY #100B 13 BNE :LOOP ;Rebrancher @ :LOOP en 9 14 RTS< Quelques restrictions d'utilisation de label start% 4 STA (JUNKDEST),Y 5 INY 6 CPY #100A 7 BNE :LOOP ;Rebrancher @ LOOP en 3 8 LOOP2 LDY #0B 9 :LOOP LDA (STUFF),Y ;:loop est loc 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 #0E 3 :LOOP LDA (JUNK),Y ;:loop est local pour chaque ligne de ce label global jusqu'au prochain label global. VousD pouvez alors utiliser le m}me label local dans d'autres segments G gouvern{s par d'autres labels globaux. Vous pouvez choisr d'utiliserG un autre moyen de taper un label localJLOOP ;Branch to line 8 ------------- LOCAL LABELS -------------G Un label local est un label commencant par une colonne. Un labelE local est "attach{" au dernier label global et peut }tre r{f{r{ @ G @ }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 #0C 1002: 20 21 10 3 JSR MOVE ;"MOVE" ISE 1005: 4C 12 10 4 JMP CONTINUE ; NOT LISTEDE 5 ORG $300 ; ROUTINE TOC 0300: 8D 08 C0 6 PAGE 3 STA MAINZP ; BE MOVED. 0303: 20ichier USE. Deuxi}mement, F un fichier PUT ne peut appeler d'autres fichiers PUT avec des codesB PUT. Bien sur, le rattachment peut }tre simul{ en ayant dans leG programme principal ("Main Program") uniquement les d{finitions mac- ro et l'apperogramme peut }tre assembl{ facilement en utili- sant PUT.G Voila 2 restriction sur un fichier PUT. Premi}rement, il ne peutG y avoir de MACRO d{finition dans un fichier PUT, elle doit se trouv-F er dans la source principale ou dans un fs et des fichiersF Note: "Insert se r{f}re @ l'aasemblage et non @ l'endroit d'uneD source. Le fichier lui-meme est actuellement plac{ juste apr}s laG source principale. Ces fichiers ne sont en m{moire qu'un certain tpsF donc un tr}s long p (Nom du catalogue); PUT File name = !SOURCE CODE (Nom dans le PUT) (PUT Continu) -------------F Note PRODOS: les param}tres Drive et Slots ne sont pas accept{sG vous devez utiliser les noms d'acc}s, des catalogueerlin que G 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 ndard de DOS. Le "Filename" sp{cifi{ doit }tre un fichierA Texte avec le pr{fixe "T." S'il ne poss}de pas ce "T." dans leD catalogue du disque, le "Filename" sp{cifi{ doit d{marrer avec unF caract}re plus petit que "A Commercial". Ceci indique @ MUT's file SOURCEFILE)> PUT /PRE/SOURCE (PUT's file provenant de PRE)D "PUT Filename" lit le fichier nomm{ et "l'ins}re" @ l'endroit du code.D Note DOS 3.3: Les param}tres Drive et Slots sont accept{s en G syntaxe staxemples: PUT SOURCEFILE (PUT's file T.SOURCEFILE)4 PUT !SOURCE (PUT's file SOURCE)B PUT !SOURCE,D2 (PUT's file provenant du DRIVE 2) PRODOS exemples8 PUT SOURCEFILE (P vous pouvez, (mais ceci n'est pas n{cessaire), faire un OBJ en 8 $FBE0 pour optimiser l'espace de la table de symbole.' PUT (PUT a text file in assembly)' ---------------------------------- PUT Filename: DOS 3.3 e (A d{faut $8000). L'adresse OBJ n'est accep-D t{e que si elle est comprise entre $4000 et $BFE0. La plupart desC gens ne se serviront pas de ce code. Si le code REL est utilis{,D alors le code OBJ n'est plus "regard{". Si DSK est utilis{, alorsB4000 (Utilis{ pour Adresse Hexa)2 OBJ START (Utilis{ avec un Label)D Le code OBJ n'est accept{ qu'en premier au d{but d'un code etB ne d{fini qu'une division entre la table de symbole et l'espaceF Object code en m{moire lors de l'utilisation ou de la d{finition de quelqueD Label que ce soit. Regardez la section "LINKER" de ce manuel pour plus d'infos sur ce code. OBJ ( set OBJect) ------------------ OBJ expression:6 OBJ $ 03 12 JSR PAGE3 REL RELocate code module ---------------------------A Ce code demande @ l'assembleur de g{n{rer un code fichiersF compatible avec le "linker" relocalis{. Ce code doit }tre introduitB en premier 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 00l.D Chaque variable (Comme )LABEL ), doit }tre utilis{e comme desG variables "locales" ("Local variables"). Les variables usuelles )1 @E )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 Filename7 USE T.MACRO LIBRARY (Exemple DOS 3.3)9 USE !MACROS (DOS 3.3 sans "T.")B USE T.MACROS,S5,D1 (DOS 3.rt") @ $1000)@ DUM LABEL (D{marrer code @ la valeur du Label)< DUM END-START (D{marrer @ la valeur END-START)G Ceci d{marre des sections de code qui examineront les valeursG de labels mais ne produira pas d'obrestant d'un fichier source. Les Labels arrivant apr}s le code END seront ignor{s.1 DUM (DUMmy section) ("section morte") -------------------- DUM expressionE DUM $1000 (D{marrer le code DUMmy ("mopseudo DSK, voir le code REL." END (End of a Source File)" ---------------------------5 END (Option unique pour ce code)F Il est rare d'utiliser une commande ordonnant @ l'assembleurF d'ignorer le {j@ en cours, l'an-F cien fichiers sera ferm{ et un nouveau commencera. Ceci est courant( pour des fichiers extremement larges.F NOTE: Les fichiers faits pour }tre utilis{s avec le chargeurG de rattachement DOIVENT }tre sauv{s avec le ename (Ou Pathname en ProDos)3 DSK PROG (DOS 3.3 ou ProDos)0 DSK /OBJ/PROG (Exemple ProDos)C "DSK Filename" ordonne @ l'assembleur d'assembler le codeE suivant directement sur le disque. Si DSK est de type BIN est le type par d{faut. Les fichiers typeE valables sont 0, 6, $F0-$F7, et $FF (Sans type, Bin, CMD, Fichiers utilisateur et Sys).' DSK (Assemble directly to DiSK)' --------------------------------0 DSK Fil----------------- TYP expression< TYP $00 (Pas de fichiers Type)< TYP $06 (Fichier Type binaire)C Ceci s{lectionne le fichier type @ utiliser par les codesD DSK ou PUT. Lrger @ une adresse correcte.D Toutefois, les codes PUT et SAV (ou DSK) le rendent possible - pour l'assemblage de fichiers tr}s larges.D TYP (set ProDos file type for DSK et SAV) (ProDos uniquement)0 ------------------------. Cela permet l'assemblage de fichiersG tr}s larges. Apr}s la sauvegarde, l'adresse object est resett{e @ la7 derni}re sp{cification de OBJ ou @ $8000 par d{faut.D Les fichiers sauv{s avec la commande SAVe seront sauv{s pour * pouvoir cha{. Ceci est fait exactement comme la commande sauvegarde duF "EXEC mode object", mais cela peut prendre beaucoup de temps durant l'assemblage.E Ce pseudo-code apporte un moyen de sauvegarder des portions deF programme ayant plus d'un ORG (SAVe object code) ----------------------- SAV Filename7 SAV file (Synthaxe ProDos ou DOS 3.3), SAV /OBJ/PROG (Synthaxe ProDos)C "SAVe Filename" sauvera "l'object code" pr{sent, sous le nomE sp{cifi )1=3, )2=$42 et )3=Label. CeciD pour }tre utilis{ prioritairement avant un PUT. Si un fichier PUTE utilise )1 @ )8, except{ dans les lignes PMC (ou>>>) pour l'appelA des macros, il DOIT y avoir une d{claration pr{c{dant ceux-ci. SAV  VAR (Setup VARiables) ---------------------- VAR expr;expr;expr...9 VAR 1;$3;LABEL (Set up VAR's 1,2 et 3)E C'est la juste manipulation pour "{galiser" les variables )1 @C )8. VAR 3;$42;LABEL s{lectionnera3 avec Slot et Drive). USE /LIB/MACROS (ProDos)E Cette manipulation s'effectue comme un PUT mais le fichier estF conserv{ en m{moire. Ceci est fait pour charger une librairie Macro" utilis{e par le fichier Source.ject code. L'expression doit don-G ner l'ORG d{sir{ de cette section. Il est possible de RE-ORG tel uneF section utilisant un autre code DUM ou utilisant ORG. Bien qu'aucunF object code n'est cr{{ depuis une section DUMmy, la sortie texte de7 l'assembleur apparaitra comme si le code {tait cr{{. DEND (Dummy END) -----------------8 DEND (Option unique pour ce code)D Ceci cloture une section Dummy et r{tablit l'adresse ORG @0 la valeur donntion unique pour ce code)E Dans le second passage, ceci met en pause jusqu'@ ce qu'une8 touche soit frapp{e. Ceci est pratique pour d{bugger. PAG (New PAGe) ---------------8 PAG (Option unique pouOFF)> LSTDO OFF (Ne pas lister les espaces DO OFF)D Ce code d{clenche le listing des espaces de codes DO OFF @! imprimer ou @ na pas imprimer. PAU (PAUse) ------------8 PAU (Oples lignes macro avaient {t{ {crites en dehors de la source.8 LSTDO ou LSTDO OFF (LiST DO OFF areas of codes)8 ------------------------------------------------- LSTDO OFF7 LSTDO (Lister les espaces DO object codes g{n{r{s. EXP ONLY cau-F sera une expansion de la macro dans le listing en omettant la ligneE d'appel et la fin de la ligne macro (Si la ligne d'appel macro estF labell{e, elle sera toutefois imprim{e). Ce mode imprimera comme si? l'appel macro); EXP ONLY (Imprime uniquement l'appel g{n{r{)C EXP ON imprimera la macro enti}re durant l'assemblage. LaF condition OFF imprimera uniquement le pseudo code PMC EXP en d{fautG ON. Ceci n'a aucun effet sur lese "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 uniquementn'aura pas d'effetF sur l'actuelle g{n{ration d'object code. Si la condition LST est enF position Off, l'object code sera g{n{r{ plus rapidement, mais ceci 5 n'est recommand{ que pour des programmes d{bugg{s.D NOTE: CONTROL-D bascule cssemblage, la table de symbole ne sera pas imprim{e.E L'assembleur n'analyse actuellement que le troisi}me carac-G t}re de l'op{rande pour voir si il y a ou non c'est un espace. Donc F LST a le meme effet que LST ON. La directive LST bl{ estC envoy{ @ l'{cran ou non. Vous pouvez utiliser ceci pour envoyer C par exemple une portion du listing @ l'imprimante. Chaque nombreE d'instruction LST peuvent }tre dans la source. Si la condition LSTG est en position Off @ la fin de l'a------------------------ LST ON ou OFF+ LST ON (listing On), LST OFF (Listing Off)3 LST (Listing On, option)B Ces commandes sont effectives si le listing assem 21 $ 22 START LDA #SLOT& 23 STA IOBSLOT# 24 * et ainsi de suite FORMATTAGE PSEUDO OPS ---------------------% LST ON/OFF (LiSTing Control)% ------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 DFB 1" 7 IOBSLOT DFB $60 8 IOBDRV DFB 1! 9 IOBVOL DFB 0 10 IOBTRCK DFB 0 11 IOBSECT DFB 08 12 DS 2 ;Pointer to DCT 13 {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 r ce code)C Ceci envoie un $8C @ l'imprimante. Ca n'a aucun effet sur4 l'{cran meme si on utilise une carte 80 colonnes.& AST (Send a line of ASTerisks)& ------------------------------- AST expressionG AST 30 (Envoyer 30 ast{rix (et obelix) au listing)C AST NUM (Envoyer un ast{risque (et perils) NUM)F Ceci envoie un nombre d'ast{risques @ l'imprimante, {quival-C lent @ la valeur de l'op{rande. AST10 enverra les extra cycles requis quand M=0 ou X=0.  ------------------------ STRING DATA PSEUDO OPS ------------------------E Notes g{n{rale sur les donn{es String et les d{limiteurs StringE Diff{rents d{limiteurs on TousE ces codes non acc}pt{s sont des instructions 5 cycles avec une ou E deux possibilit{s d'extra cycles pour les instructions de branche- ment BBS et BBR.F Le code CYC travaille pour les codes 65802, mais il n'addition-5 nera PAS e pour les extra-codes 65c02. Il ne travail-G lera pas pour les codes additionnels 65c02 pr{sents dans le RockwellG 65c02 (i.e. RMB#, SMB#, BBR# et BBS#). Ces codes ne sont pas accept{E par Merlin, exc}pt{ en utilisant la macro librairie Rockwell.le apostrophe apr}s le comptage de cycle indique que F l'assembleur a d{termin{ qu'un branchment sera pris et que le bran-F chement a saut{ une limite de page. Dans ce cas, le cycle est affi- ch{ et ajout{ au total.G Le code CYC travaill alors il sera indiqu{ qu'un cycle peut etre additionn{ si le bran-G chement se faisait. Pour les instructions de non-branchement, l'apo-F strophe indique qu'un cycle peut etre additionn{ si la limite de la page est d{pass{e.D Une double total de cycles accumul{s, en d{cimal.? Une simple apostrophe apr}s le comptage de cycles indi-G que une possibilit{ de cycle suppl{mentaire, d{pendant de certaines G conditions. Si cela apparaissait dans une instruction de branchementE de commentai- re; Exemple:= 5 ,03266 ou 5' ,0326 ou 5'' ,0326E Le 1er chiffre affich{ (Le 5 ds l'exemple donn{ ci-dessus) estF le comptage de 5 pour l'instruction en cours. Le second chiffre af-6 fich{ est { pour retourner @ z{ro. CYC AVE fera une moyenne dsE les cycles inderterminables @ cause de l'embranchement, ind}x{s et indirectemnt assembl{s. CYC Continu -----------G Les temps cycles seront imprim{s @ droite du champper impression temps de cycle)7 CYC AVE (Imprimer cycle & moyenne)G Ce code provoquera pendant l'assemblage un programme de comptageG cycles @ imprimer durant l'assemblage. Un second code CYC provoqueraG le total accumulerlin ProDos.C CYC (Calculer et imprimer les temps de CYCles pour un code)C ------------------------------------------------------------= CYC (Imprimer cycle & total de code)@ CYC OFF (Stop assembly Listing) (ProDos uniquement)) ----------------------------------9 DAT (Option unique pour ce code)C Cela imprime la Date et l'Heure dans la seconde passe de 7 l'assembleur. Valable uniquement pour Mlimiter l'impression)E TR ON ou TR (Tout seul) limite l'impression object code @ 3G bytes par ligne source, m}me si la ligne en g{n}re plus de 3. TR OFF8 remet en route l'impression de tout les bytes object.> DAT (DATa stamp Le nombre format est le m}me que AST.1 TR ON/OFF (Tronquer) (Truncate Control) ----------------------- TR ON ou OFF= TR ON (Limiter impression Object Code): TR OFF (Ne pas 10 ast{risques par exemple. SKP (SKiP lines) ----------------- SKP Expression< SKP 5 (Sauter 5 lignes ds le Listing)B SKP LINES (Sauter "LINES" lignes ds le Listing)/ diff{rents effets. Chaque d{limiteurC plus petit qu'un (en valeur ASCII) simple apostrophe produit un F String avec le Bit-Haut ON, sinon le Bit-Haut sera OFF. Par exempleE les d{limiteurs !"#$%& produiront un String en ASCII "n{gative" etD les d{limiteurs '()+? en produiront un en ASCII "positive". Habi-F tuellement les guillemets (") et l'apostrophe (') sont les d{limit-F eurs de choix, mais les autres d{limiteurs stipulent le moyen d'in-F s{rer un String contenant un guillemet ou unne utilisation ProDos qui utilise $ des types de donn{es tr}s larges. DFS Continu -----------E Le symbole # est accept{ mais ignor{, comme un <. Le symbole >G doit }tre utilis{ pour sp{cifier le Bit haut d'une expressio9 8D)B Ceci mets un String d{limit{ en m{moire avec un "LeadingE Length Byte". STR travaille comme un code ASC. Notez que les bytesG hexa qui suivent, s'il y en a, ne sont pas compt{s dans la longueur.E Cette facilit{ est concue pour u ------------------------------------------------ STR d-stringC STR "/PATH/" (Pos. ASCII, (ProDos Pathname ?))4 STR "HI" (Result" 02 C8 C9)7 STR 'HI',8D (Result" 02 48 4ais en positif)! Exemple: REV "DISK VOLUME"D Ceci donne EMULOV KSID (Choix d{limit{ comme un ASC), desD donn{es Hexa ne doivent PAS }tre ajout{es apr}s la fin du String.7 STR (Definea String with a leading lenght byte)7@ Ceci mets un String d{limit{ en m{moire, en format flash. REV (REVerse) -------------- REV d-stringB REV "Insert" (Neg. ASCII, reversed in memory)8 REV 'Insert" (Idem mn format inverse." FLS (Define FLaShing Text)" --------------------------- FLS d-stringD FLS "The End" (Neg. ASCII, flasher @ l'impress.)@ FLS 'The End',8D00 (Pos., flash with added bytes)NVert Text) ------------------------- INV d-stringE INV "STOP!" (Neg. ASCII, inverser @ l'impress.)9 INV 'END',878D (Positive, added bytes)E Ceci mets un String d{limit{ en m{moire, er le "G")A DCI 'Hello',878D (Pos. with two added hex bytes)D C'est la m}me chose que ASC, sauf que le String est mis enA m{moire avec le dernier caract}re ayant le bit haut oppos{ aux autres. INV (Define Iur le String.( DCI (Dextral Character Inverted)( --------------------------------- DCI d-StringC DCI "STRING" (Neg. ASCII, execpt{ pour le "G")C DCI 'STRING' (Pos. ASCII, execpt{ pou (Positive ASCII string)A ASC "Bye,Bye",8D (Negative with added hex bytes)F Ceci mets un String ASCII d{limit{ dans l'object code. L'uniqueF restriction sur le d{limiteur, c'est qu'il ne doit pas arriver lui- meme sstring",87,8D,00 STR "string",878D00 INV "string",878D00 ASC (Definir texte ASCii) ------------------------- ASC d-string9 ASC "STRING" (Negative ASCII string)9 ASC "STRING"String with embedded quotes)E Tous les codes de cette section, execpt{ REV, acc}ptent les don-A n{es hexa apr}s le String. Toutes les synthaxes suivantes sont acceptables: ASC "string"878D00 FLS "string",878D00 DCI " &HELLO& (Negative ASCII, Hi bit set)8 !ENTER "HELLO"! (String with embedded quotes)7 'HELLO' (Positive ASCCI, Hi bit clr)7 (HELLO( (Positive ASCII, Hi bit clr)8 'ENTER "HELLO"' (e apostrophe de part et7 d'autre du String. Exemples d'effets de d{limiteurs:7 "HELLO" (Negatice ASCII, Hi bit set)7 !HELLO! (Negative ASCII, Hi bit set)7 #HELLO# (Negative ASCII, Hi bit set)7n, sinonE le Bit bas est toujours conserv{. Le symbole > doit apparaitre en G premier caract}re uniquement ou tout de suite apr}s #. L'instructionA DFB >LAB1-LAB2 produira le Bit haut de la valeur de LAB1-LAB2. Par exemple:2 DFB $34,100,LAB1-LAB2,%1011,>LAB1-LAB2B 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) ---------------------  ____________ __________B! ! !__________ U_S_E_R_'_s6! (( )) ! (((()))) ! ! D! (((( )))) ! (( ! (((()))) !__________ CO=====!====!====!====!====!====!====!====!====!====!====!====!====!====!====!===jC O=====<====<====<====<====<====<====<====<====<====<====<====<====<====<====<===Compiler Macros Pour eviter la confusion, mettez ce code en fin di fichier.ant dans unF fichier REL obligera le "Linker" a charger le fichier suivant @ la G premi}re page disponible et @ rempli avec 0 ou avec le byte indiqu{.F Noter que, pour des fichiers REL, la localisation du code n'a aucunF effet sur cette action.'expression2.# Note pour REL et le "Linker"D L'option "`" (Slash invers{) est pr{vue pour une utilisation G principale avec des fichers REL et pour travailler d'une facon l{g}-F rement diff{rente avec ceux-ci. Chaque code "DS `" arrivpression2( pourvu que expression2 soit positive.G Le seconde alternative, sous la forme "DS `", remplira la m{moi-D re jusqu'@ la prochaine page m{moire. La forme "DS`,expression2" G fera la meme chose, mais en utilisant les Bits-bas de l une instruction F comme DS-1 peut etre utilis{e pour ramener les Objects et les poin- teurs d'adresse @ un byte.E La premi}re alternative avec DS, avec 2 expressions, remplira F les bytes expression1 avec la valeur de (Le Bit bas de) ex)F Ceci r{serve un emplacement pour le stockage de donn{es String.F "It zeros out" cet espace si l'expression est positive. DS 10, par 4 exemple, s{lectionnera 10 bytes pour le stockage.D Parce que DS ajuste le pointeur Object Code, DS 10 (Zero out 10 bytes of m{mory)? DS 10,$80 (Put $80 in 10 bytes of mem.)@ DS `' (Zero'mem to next memroy page)? DS `,$80 (Put $80 in mem to next pageil y a un5 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?ent aux autres cas, le $ n'est ni requis ni accept{.E L'op{rande doit consister en des nombres hexa contenant 2 chiffresE hexa (Par exemple, utiliser 0F et non F). Les nombres hexa peuventE }tre s{par{s ou coll{s. Un message erreur sera envoy{ si --- HEX hex-dataC HEX 0102030F (Results: 01 02 03 0F en m{moire)@ HEX FD,ED,C0 (Results: FD,ED,C0 en m{moire)D C'est une alternative @ DFB qui permet l'insertion de donn{esG hexa. Contrairem M_A_N_U_A_L1! (( (()) )) ! ((())) ! (( )) ! !1! (( )) ! (( ! (((()))) ! (( !9! (( )) ! (((()))) ! (( )) ! (( !________:!____________!__________! (( )) ! (( ! !: UP, PENDOWN, NORTH, SOUTH, EAST, WEST. Pour JHillustrer la valeur d'un linker, imaginez que le driver a {t{ {crit par GEun ami se trouve @ 2000 miles de vous. Votre travail est d'{crire un CAprogramme simple pour dessiner un cadre. Le codage ressembl par les deux JHprogrammes. Il n'y a pas de chances d'erreurs 'label dupliqu{' lors de =l'utilisation du linker. Regarder l'exemple simple suivant:DB Un fichier REL a {t{ assmbl{, il dirige un plotter. Il y a six IGentr{es dans le driver: PENlage plus lent. Ensuite, tous les labels de d{fintion JHdu fichier PUT seront globals dans le programme entier. Avec un fichier FDREL, seuls les labels d{finis comme ENTr{es dans le fichier REL (et B@EXT{rieurs dans le fichier actuel) seront partag{se le plus de IGl'utilisation de fichiers REL ou du linker, mais il y a un peu plus de KId{savantages pour certains programmes. Tout d'abord, utiliser un fichier CAPUT pour ajouter un sous-programme d'utilit{ g{n{rale aura comme JHr{sultat un assembk @ votre nouveau programme. Cette technique peut etre utilis{e 4pour beaucoup de sous-programmes souvent utilis{s.IG Est-ce qu'un fichier PUT ou une librairie de macros USES ne peuvent HFfaire la meme chose? Un fichier PUT est ce qui se rappochac{ sur un disk. A JHchaque fois que vous aurez besoin d'{crire un programme qui utilise des HFE/S disk vous n'aurez pas @ r{-{crire ou r{assembler la portion d'E/S HFdisk de votre nouveau programme. Relier juste votre programme g{n{ral KId'E/S disvez {crire des portions de programmes qui font KIdes taches sp{cifiques, d{signent un disk g{n{ral d'entr{e/sortie (E/S), JHet font ce qui est n{c{ssaire en test et debuggage. Quand le codage est IGcorrecte, il est assembl{ comme un fichier REL et plues, CAdrivers {cran/modem/imprimante, etc) peuvent etre d{velopp{es et &incorpor{es @ tout programme Merlin,A? 4/ des programmes peuvent etre r{-assembl{s rapidement pour )fonctionner @ n'importe quelle adresse.KI Avec un linker vous pouop{ration, pour plus de 41000 bytes de long,JH 2/ les grands programmes peuvent etre assembl{s plus rapidement avec >une diminution correspondante dans le temps de d{veloppementHF 3/ des librairies de sous-programmes (pour acc}s disk, graphiqi un linker ? !!________________________!B@ Les facilit{s de liaison de Merlin offrent un certain nombre ?d'avantages sur les autres assembleurs sans ces possibilit{s:HF 1/ des programmes extr}mement grands peuvent etre assembl{s en une .[[[) _____________+ _! !_, !_! LE LINKER !_!* !_____________! ________________________! !! Pourquo(( )) !E >>> >>> >>> >>>>>>> ~~~~~~~ ! (( )) !E !__________!8 traduit par SHEHERAZADE pour 'son' LO44 pr{f{r{/ [[[[[[[[[[[ [>> >>> >>> >>> ! (( ! (( )) !E >>> >>> >>> >>> >>> >>> !________! (((( )) !E >>>>>>>> >>>>>>>> >>> >>> ! (( )))) !E >>> >>> >>> >>> >>> PART II ! !__________! (( ! (( !: ! (((()))) ! (( !D !__________! (( !__________E >>>>>>>> >>>>>>>> >>>>>>> ! (( ! !E >>> >>> >era @ quelquechose de ce genre:5 1 REL ;CODE DEPLACABLE5 2 PENUP EXT ;LABEL EXTERIEUR. 3 PENDOWN EXT ;UN AUTRE 4 NORTH EXT 5 SOUTH EXT 6 EAST EXT 7 WEST EXT 83 9 BOX LDY #00 ;INITIALISER Y510 JSR PENDOWN ;PRET A DESSINER>11 :LOOP JSR NORTH ;DEPLACEMENT VERS LE HAUT:12 INY ;INCREMENTER relogeables< EXT - defini un label comme ext{rieur au fichier actuelHF ENT - defini un label dans le fichier courant comme accessible par d'autres fichiers REL.KI Il y a deux autres pseudo opcodes qui ne se comportent pas de la meme du linker !.!__________________________________________!JH Il y a trois pseudo opcodes qui servent directement avec les modules 2relogeables et le processus de liaison. Ce sont:@> REL - informe l'assembleur qu'il doit g{n{rer des fichiers gros programmes peuvent etre KIfaits rapidement et efficacement, augmentant la vitesse de d{veloppement du programme.- __________________________________________.! !.! Au sujet de la documentationn assemblant chaque section ind{pendemment dans les fichiers IGREL puis en les liant, le changement d'un byte n{cessitera l'asemblage IGd'un seul module dans les 40k de programme. En bref, avec les fichiers IGREL et le linker, des changements dans deocks de disk). Le temps DBn{cessaire @ l'assemblage et au croisement de r{f{rences d'un tel IGprogramme se mesurerait en heures ou en jours. Changer un byte dans le GEprogramme source n{cessiterait un r{assemblage complet et une longue IGattente! Eir besoin .d'autre chose que des labels ENT des autres!GE Pour illustrer le point 2, imaginez que les six modules sont tous KIcod{s en fichiers PUT et que le programme r{sultant fait 40k de longueur DB(ce qui fait 160 secteurs de disk ou 80 blompl{tez le classement, la recherche, et tout le GEreste. En fait, en utilisant des fichiers REL, et en documentant les A?points d'ENTr{e et leurs conditions, six personnes diff{rentes KIpourraient travailler sur le meme projet simultan{ment sans avotilisateur de FDvotre programme. Ceci sera assembl{ et stock{ comme un fichier REL. DBPuis, le syst}me de fichier ISAM est {crit et d{bugg{. Vous devez HFensuite lier les deux modules ensemble pour voir comment ils marchent IGensemble. Puis, vous cREL: 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{moireGE Vous devez d'abord concevoir et {crire l'interface unt &toutes des exemples de fichiers REL.A? Regardons un autre exemple qui illustrent les points 1 et 2 GEpr{c{dents. Cette fois vous {crivez un programme de base de donn{es. IVous avez cassez le programme en 6 modules, tous sont des fichiers dessiner un cadre avec un plotter!FD Des exemples communs de fichiers REL qui ne sont pas visibles se KItrouvent dans le pascal Apple. L'unit{ de dessin @ la tortue, l'unit{ de GEremplissage Apple, et les librairies run-times du Fortran Apple soGreli{s, RELogeables. Votre programme n'a pas @ se soucier des conflits JHentre ses labels et ceux des fichiers REL, vous ne vous souciez pas des IGemplacements des labels EXTernes, votre programme fait seulement 30 ou @40 lignes et est capable deDROITE17 INY18 CPY #100A19 BNE :LOOP2 ;FIN DE DEPLACEMENT A DROITE:20 * VOUS AVEZ L'IDEE, FAIRE SOUTH, PUIS WEST, ET HOP!DB Cet exemple simple illustre certains des pouvoirs des fichiers I COMPTEUR<13 CPY #100 ;DEJA 100 DEPLACEMENTS??14 BNE :LOOP ; REMARQUER LE LABEL LOCAL515 LDY #00 ;REINITIALISER YE16 :LOOP2 JSR EAST ;MAINTEMANT DEPLACEMENT A Efa\on dans un fichier REL, par rapport @ u fichier normal. Ce sont:* DS - opcode de d{finition de stockage' ERR - opcode d'obligation d'erreurGE Chacun de ces 5 pseudo opcodes sera d{fini ou red{fini dans cette JHsection quand ils se rapportent @ des fichiers REL. Ainsi, une commande Bd'{dition unique pour les fichiers REL sera ainsi d{finie: LINK.A? Afin d'utiliser le linker, les fichiers @ lier doivent etre JHsp{cifi{s. Le linker utilise un fichier contenant les noms des onception de labels ENTr{e et EXTerne est ce qui permet aux modules REL ;9de communiquer et de s'utiliser mutuellement en tant que sous-programmes, etc.JH La valeur du label se trouve en $8000 et sera modifi{ par le linker. HFDans le listing de label comme un label externe. GEChaque label externe doit etre d{fini comme un label ENTr{e dans son KIpropre module REL, sinon il ne sera pas raccord{ par le Linker (le label A?ne sera pas trouv{ dans aucun autre des modules assembl{s). La KIcalogue 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)KI Ceci d{fini le label dans la colonneDA #>EXTERNAL+8 (expression ill{gale)3 DFB >EXTERNAL-1 (expression l{gale)EC On donne le type de fichier LNK aux fichiers objets g{n{r{s par IGl'opcode REL sous Prodos. C'est le type qui sera montr{ si vous faites Gle cats op{randes de la forme suivante:$ #>expression ou >expressionA?@ l'endroit o| l'expression contient un external, la valeur de IGl'expression doit etre contenue dans les 7 bytes de la valeur du label ext{rieur. Par exemple:5 Ltte raison que "l'opcode ORG n'est pas autoris{.IG Il y a aussi certaines restrictions qui impliquent l'utilisation de FDlabels EXT{rieurs (externals) dans des expressions op{randes. Aucun HFop{rande ne peut contenir plus d'un exernal. Pour ledes expressions qu'utilise le PC, comme: LABEL-*HF L'adresse de d{part d'un fichier REL, fourni par l'assembleur, est KI$8000. Notez que cette adresse est une adresse fictive, puisqu'elle sera DBchang{e ult{rieurement par le linker. C'est pour cetion @ 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 ordinaires7 - .2 Un ORG au d{but du codage n'est pas autoris{.B@ Multiplication, division ou op{rations logiques peuvent etre =appliqu{es aux expressions absolues mais pas aux relatives./ Voici des exemples d'expressions absolues:+ - une {quarde de code objet du IGmode EXEC. Pour avoir un fichier objet sur le disk vous DEVEZ utiliser 5l'opcode DSK pour un assemblage direct sur le disk.KI Il y a d'autres opcodes et proc{dures illl{gaux qui sont normaux avec les fichiers standardspour utilisation ult{rieure avec le linker.KI Ceci est la premi}re priorit{ avant la d{finition de tout label. Vous JHaurez une erreur BAD REL sinon. Les fichier REL sont incompatibles avec JHle pseudo opcode SAV et avec la commande de sauvega__________________________________________________________!+REL (g{n}re un fichier cod{ RELogeable)~~~@ REL (seules options pour cet opcode)HF Cet opcode indique @ l'assembleur de g{n{rer un fichier relogeable -ent utiliser des fichiers REL.D _________________________________________________________________E! !E! Pseudo opcodes @ utiliser avec des fichiers cod{s relogeables !E!_______fichiers IG@ 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.JH La documentation du linker ne fera pas d'essais suppl{mentaires pour >apprendre @ l'utilisateur commde la table de symboles, la valeur d'un external sera HF$8000 plus le nombre de r{f{rence externe ($0-$FE) et le symbole sera marqu{ d'un "X".BENT (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)B@ Ceci d{fini le label dans la colonne de label comme un label JHd'ENTr{e. Ceci signifie que le label peut etre appel{ en tant que label FDexterne. Cette facilit{ permet aux autreMES (dos 3.3 ou prodos avec le HFpr{fixe). Supposez que l'adresse de d{part pour le program link{ soit CA$1000. Alors vous allez taper: LINK $1000 "NAMES" . (les ECguillemets @ la fin du nom sont optionnels et vous pouvez utiliser B@d'autre< LINK $2000 "/MYPROG/NAMES" (relie les fichiers l@)IG C'est commande {diteur appelle le linker. Par exemple, supposez que IGvous vouliez relier les fichiers objets dont les noms se trouvent dans GEun "fichier de nom @ linker" appel{ NALINK (LINKer des fichiers REL, c'est une commande {diteur)~~~~7 LINK adrs "nomdefichier" (commande dos 3.3)6 LINK adrs "pathname" (commande prodos)D LINK $1000 "NAMES" (relie les fichiers dans NAMES)s un fichier REL n'a pas IGd'influence sur son action. Il est recommand{ de le mettre @ la fin du fichier.KI Vous pouvez voir comment cela marche en essayant de linker le fichier 8PI sur le disk Merlin @ une adresse au dessus de $81C.>ative.IG Si le linker d{tecte que ce n'est pas le cas, le linkage s'arretera JHavec un message: CONSTRAINT ERROR (erreur par contrainte):, suivi de la +valeur de l'expression dans l'opcode ERR.IG Remarquez que la position de cet opcode dan`$4200 (erreur si le code actuel d{passe l'adresse $4200)DB Cet opcode permet au linker de v{rifier que le dernier byte du JHfichier courant ne se trouve pas @ "expresison" ou apr}s. Remarquez que 5l'expression doit etre absolue et non pas relJHpremi}re page disponible et rempli la m{moire avec des z{ros ou avec la JHvaleur sp{cifi{e dans l'expression. Cet opcode peut etre plac{ @ la fin de votre fichier source.ERR (force une ERReur)~~~ ERR `expressionH ERR (va au prochain fichier REL, rempli la m{moire de2 1 jusqu'@ la page suivante)IG Quand cet opcode se trouve dans un fichier REL, le linker charge le DBfichier suivant dans le "fichier de noms @ linker" au d{but de la ~~;(NDSHE: le symbole < ` > repr{sente en fait un antislash) DS ` DS `expressionG DS ` (va au prochain fichier REL, rempli la m{moire deB z{ros jusqu'au prochain changement de page)G DS `1 autre label dans un programme. Il =;peut etre utilis{ pour un branchement, un saut ou comme un sous-programme, etc.DB Les labels ENT seront {tiquet{s dans le listing de la table de symbole avec un "E".DS (definir la sauvegarde)E ET NE PAS ETRE UTILISE=28 LDA POINTER+1 ;COMME UN LABEL DECLARE (EQU) 29 STA PTR+1 30 * etc.KI Remarquez que le label SWAP est associ{ au code de la ligne 26 et que JHle label peut etre utilis{ comme toutple?23 BNE SWAP ;PEUT ETRE UTILISER NORMALEMENT!24 JMP CONTINUE ;925 SWAP ENT ;DOIT ETRE DEFINI DANS LA426 LDA POINTER ;PORTION DE CODE DU >27 STA PTR ;MODULlinker 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 signification322 INC POINTER ;pour notre exems modules REL d'utiliser le GElabel comme s'il faisait part du module REL courant. Si un label est KIfait pour etre utiliser par les modules REL il doit etre d{fini avec les KIopcodes ENT, sinon, les autres modules ne sauront pas qu'il existe et le +s d{limiteurs tels que "'" ou ";"). L'addresse de d{part Csp{cifi{e n'a pas d'effet sur l'espace disponible pour le linker.JH 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)( [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[KI Le fichier de noms @ linker est simplement un fichier texte contenant HFles noms de fichier des modules objets REL que vous voulez relier. Il GEpeumettra IGle type objet @ BIN ($06) mais ceci annulera la commande de sauvegarde 6objet et vous devrez linker les fichiers de nouveau.0 Le Processus de Linkage (dos 3.3 et prodos)0 [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[IG Plusieu effacez simplement le fichier, changez JHle type en allant dans le moniteur et en changeant l'adresse $BE52 pour ECobtenir le bon type, revenez dans l'assembleur et resauvez le code JHobjet. Vous pouvez {galement assembler un fichier vide, ce qui reDsera ce type. Il sera utilis{ par la commande de sauvegarde d'objet HFapr}s que vous ayez reli{ un groupe de fichiers. (le linker ne change KIpas ce type). Si vous faites une erreur et que le fichier est sauv{ sous IGun type que vous ne voulez pas,S" dans l'{diteur.JH Le type de fichier utilis{ par la commande de sauvegarde d'objet est HFtoujours le type de fichier utilis{ dans le dernier assemblage. Ainsi IGc'est BIN @ moins que le dernier assemblage est un opcode TYP alors ce FYDISK/MYPROG/NAMES. (utiliser les pathnames que vous voulez ici, il CAn'est pas n{cessaire d'avoir NAMES dans un sous-r{pertoire ni de IGl'appeler NAMES). Alors, vous pouvez relier @ l'adresse $803 en tapant ENEW puis: LINK $803 "/MYDISK/MYPROG/NAME STR "/OTHERDISK/END",00 BRKDB Il est pr{f{rable d'utiliser des pathnames complets comme dans IGl'exemple, mais ce n'est pas indispensable. Vous devez alors assembler 97ce fichier et sauver le code objet comme, par exemple, HF/Mer. FDAinsi, si vous vouler relier les noms de fichier LNK /MYDISK/START, DB/MYDISK/MID, et /OTHERDISK/END vous devez faire un fichier source contenant ces lignes:# STR "/MYDISK/START",00! STR "/MYDISK/MID",00$ e: STR "pathname",00IG Faites attention @ bien inclure le 00 @ la fin. Ceci est vital. Le FDfichier source entier doit finir par un BRK (c'est-@-dire 00). Ceci IGsignifie au linker qu'il n'y a pas d'autres pathnames dans le fichie) contenant les pathnames des fichiers ECLNK que vous voulez relier. Ce fichier est plus facilement cr{{ en JHassemblant un fichier source avec le format correct, comme suit: chaque Epathname dans le fichier source devrait etre donn{ selon ce mod}lt au mode EXEC apr}s l'ach}vement du processus de linkage.' Fichiers de Noms @ Linker (prodos)' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[HF Le fichier de noms @ linker est simplement un fichier sp{cialement HFformat{ (de n'importe quel typpant NEW 6puis la commande {diteur: LINK $1000 "MYPROG.NAMES".JH Le linker ne sauvera pas le fichier objet qu'il cr{e. A la place, il KIplace les pointeurs du fichier objet pour la commande Objet du mode EXEC GE("O") et vous renvoie directemenver sur disk avec la commande "W" sous le nom FD(par exemple) de MYPROG.NAMES. (Utiliser le nom de fichier que vous ECvoulez ici, il n'est pas n{cessaire de l'appeler NAMES.) Puis vous JHrelierez ces fichiers avec une adresse de d{part de $1000 en tavoulez relier les fichiers objets JHnomm{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,D2JH Puis, vous devez le saut etre ecrit avec l'{diteur Merlin et etre sauv{ sur disk avec la JHcommande EXEC "W". (n'oubliez pas de taper un espace au d{but du nom de HFfichier pour la commande W si vous ne voulez qu'apparaisse un "T." au HFd{but du nom). Ainsi si vous voulez rs messages d'erreur peuvent apparaitre durant le processus =;de linkage (voir la section ERREURS de cette doc pour plus GEd'information). Si une erreur DOS apparait au sujet du chargement du ECfichier, alors vous verrez ce message et le linkage s'arretera. Si B@l'erreur DOS 'FILE TYPE MISMATCH' apparait apr}s que le message DB"Externals:" ait {t{ imprim{ alors cela signifie que la structure IGfichier d'un des fichiers est incorrect et que le linkage ne peut etre fait.JH Le message PR M_A_N_U_A_L1! (( (()) )) ! ((())) ! (( )) ! !1! (( )) ! (( ! (((()))) ! (( !9! (( )) ! (((()))) ! (( )) ! (( !________:!____________!__________! (( )) ! (( ! !:  ____________ __________B! ! !__________ U_S_E_R_'_s6! (( )) ! (((()))) ! ! D! (((( )))) ! (( ! (((()))) !__________ BO=====!====!====!====!====!====!====!====!====!====!====!====!====!====!====!===B O=====<====<====<====<====<====<====<====<====<====<====<====<====<====<====<===Compiler Macros._._______._._.__________J___._._._______._._._______________________________._._._______._._.____ en utilisant le nom de fichier (ou pathname) que JHvous voulez. Vous pouvez {galement retourner dans l'{diteur et utiliser Ila commande GET pour d{placer le code link{ vers la m{moire principale.J_________._._._______._._.__A___S_U_I_V_R_E__._re KId'erreurs totales (r{f{rences externes non r{solues et symboles d'entr{e KIdupliqu{s) sera imprim{. Apr}s avoir press{ une touche vous serez envoy{ IGau mode EXEC et pourrez sauver le fichier objet link{ avec la commande HFde sauvegarde objet,ant le chargement des fichiers, le linker fera une pause 9juste apr}s avoir r{solu la premi}re r{f{rence externe.EC La liste peut etre envoy{e vers une imprimante en utilisant les DBcommandes PRTR ou PR# avant la commande LINK. A la fin, le nombe final sera charg{.EC Ce listing peut etre stopp{ @ tout moment en utilisant la barre DBd'espace. La barre d'espace peut etre {galement utilis{e pour des FDavanc{es pas-@-pas au travers de la liste. Si vous pressez la barre HFd'espace pendnon. Une indication permet {galement FDde voir si une r{f{rence externe correspond @ des symboles d'entr{e JHdupliqu{s. Pour ces deux erreurs, l'adresse du champ (un ou deux bytes) GEaffect{ est imprim{. C'est l'adresse que le champ aura quand le cod00 de longueur). 6Chacune de ses possibilit{s est extr}mement recul{e.DB Apr}s le chargement de tous les fichiers, les externals seront GEr{solus. Chaque label externe utilis{ sera inscrit sur l'{cran et il IGsera indiqu{ s'il a {t{ r{solu ou OGRAM TOO LARGE peut apparaitre pour deux raisons. Soit GEle programme objet est trop grand pour convenir (la taille totale du CAcode objet du fichier link{ ne peut exc{der environ $A100) ou le IGdictionnaire de linkage a d{pass{ l'espace allou{ ($B0 !__________! (( ! (( !: ! (((()))) ! (( !D !__________! (( !__________E >>>>>>>> >>>>>>>> >>>>>>> ! (( ! !E >>> >>> >>> >>> >>> >>> ! (( ! (( )) !E >>> >>> >>> >>> >>> >>> !________! (((( )) !E >>>>>>>> >>>>>>>> >>> >>> ! (( )))) !E >>> >>> >>> >>> >>> PART I ! ! ! !___ ($01 prend la place de [2, 2nd param}tre)D ! !_______ ($00 prend la place de [1, 1er param}tre)3 !____________ (debut d'appel de macro)4alors, la macro sera "{tendue" en code assembleur, stitution est d{termin{ par la place des FDparam}tres dans la liste des param}tres et l'endroit de la variable DBcorrespondante dans la d{finition de la macro. Voici comment SWAP "devrait etre appel{e et remplie: SWAP $00;$01D macro CASWAP vous procurez une liste de param}tres qui "remplissent" les HFvariables [1 et [2. Ce qui se passe r{ellement c'est que l'assembleur ECsubstitue les param}tres que vous avez donn{ aux variables lors de JHl'assemblage. L'ordre de la subccumulateur @ l'endroit [2$ deuxi}me vide6 <<< ;ceci signale la fin de la macroA? Dans cet exemple, les "vides" auxquels on faisait r{f{rence HFpr{cedemment sont les variables [1 et [2. Quand vous appelez laaiss{s quand vous la %d{finissez. Voici un court exemple:4 MAC SWAP ;defini une macro appel{e SWAPA LDA [1 ;charge l'accumulateur avec la variable [1,# premier vide< STA [2 ;stocker l'ane macro est simplement une s{quence de langage assembleur nomm{e B@par un utilisateur, avec des op{randes d'utilit{ g{n{rale. Vous JHd{finissez la macro de fa\on g{n{rale, et quand vous l'utilisez, via un A?appel macro, vous "remplissez les vides" lnde fiert{ du nombre de bytes Ede code source qu'elles peuvent g{n{rer avec un simple appel Macro!! ______________________________"! !"! Comment marche une macro ? !"!______________________________!HF U.ROCKWELL MACROS ((/LIB/ROCKWELLS.S sur le disk Prodos).IG Les macros vous permettent r{ellement d'{crire votre propre langage GEet traduit ce langage en code machine avec seulement quelques lignes KIcode source. Certaines personnes tirent graibrairie T.RWTS +MACROS qui se trouve sur le disk DOS 3.3.JH Les macros peuvent {galement etre utilis{es pour simuler des opcodes HFnon implamt{s (disponible sur le 6502) ou pour simuler les opcodes du :865C02 Rockwell, comme dans le fichier Tr type sont pr{sent{s dans ce manuel et dans le KIfichier T.MACRO LIBRARY (/LIB/MACROS.S sur le disk Prodos). Des exemples ECdu second type, type plus complexe, peuvent etre trouv{s dans T.FP JHMACROS (/LIB/FPMACROS.S sur le disk Prodos) et dans la l\on DBsimple pour {liminer l'entr{e r{p{titive de segments de programme IGutilis{s fr{quemment, ou elles peuvent etre utilis{es pour g{n{rer des Jportions complexe de code que les programmeur peuvent ne pas comprendre!KI Des exemples du premies macros? !!________________________!KI Les macros repr{sentent une m{thode de raccourci en programmation qui B@permet de g{n{rer plusieurs lignes de code @ partir d'une seule ECinstruction, ou appel Macro. Elles peuvent etre utilis{es de fa[[[( __________* _! !_+ !_! MACROS !_!) !__________! ________________________! !! Pourquoi le(( )) !E >>> >>> >>> >>>>>>> ~~~~~~ ! (( )) !E !__________!8 traduit par SHEHERAZADE pour 'son' LO44 pr{f{r{/ [[[[[[[[[[[ [SWAP $00;$011 LDA $00 ($00 @ la place de [1)1 STA $01 ($01 @ la place de [2)JH Il est tr}s important de comprendre que TOUT ce qui est utilis{ dans Dla liste des param}tres sera substitu{ aux variables. Par exemple: SWAP #"A";DATA donnerait le r{sultat suivant: SWAP #"A";DATA LDA #"A" STA DATA5Vous pouvez ajouter de la fantaisie si vous voulez: SWAP #"A";(STRING),Y Lmmune 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 HTple >>> 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 DESTDB Une forme plus come 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 exeme l'erreur. ____________________! !! Macros emboit{es !!____________________!1 On peut emboiter jusqu'@ 15 macros de suite.DB Voici un exemple de macro emboit{e dans laquelle la d{finition HFelle-meg{n{r{s par des erreurs dans les macros CAarr}tent g{n{ralement l'assemblage, @ cause des effets nuisibles FDpossibles. De tels messages indiqueront habituellement le num{ro de KIligne de l'appel de macro plutot que la ligne dans la macro o| se trouvl{e par NOM, PMC ou >>>.IG Les conditionnels DO, IF, ELSE et FIN peuvent etre utilis{ dans une macro.KI Les labels dans les macros sont mis @ jour @ chaque fois que la macro !NOM, PMC ou >>> est rencontr{e.CA Les messages d'erreur qu'un appel valide de Macro: NOM, PMC NOM ou >>> NOM.DB Des r{f{rences pr{c{dentes @ une d{finition de Macro n'est pas HFpossible, et aurait pour r{sultat un message NOT MACRO. Ceci implique Jque la macro doit etre d{finie avant d'etre appe de Macro commence avec la ligne:& Nom MAC (pas d'op{rande)DBavec Nom dans la case de label. Sa d{finition est termin{e par la KIpseudo-op{ration EOM ou <<<. Le label que vous utilisez pour Nom ne peut IGetre employ{ par autre chose comment ECles param}tres requis seraient substitu{s. Avec un peu de temps et -d'efforts vous les utiliserez comme un PRO. _____________________! !! Definir une macro !!_____________________!1Une d{finition ici3 STA #20 ;hoops! impossible!< *** BAD ADDRESS MODE *** ;Merlin vous le fait savoir!DB Afin d'utiliser les macros donn{e avec Merlin, ou d'{crire les HFvotres, {tudiez la macro en question et essayez de visualiser{ ici c'est qu'un mode JHill{gal d'adressage a {t{ tent{. Le second appel de macro serait {tendu 4en quelque chose comme ceci (si c'{tait possible):4 SWAP #10;#20 ;appel la macro SWAP1 LDA #10 ;rien de faux SWAP 10;20 SWAP #10;#20JH Le premier stocke le contenu de la case m{moire 10 (d{cimal) dans la IGcase m{moire 20 (d{cimal). Le second appel de macro stockera le NOMBRE JH10 (d{cimal) dans le NOMBRE 20! Ce qui s'est passormera, par un message d'erreur, si vous vous etes trop emport{. Un JHprobl}me commun rencontr{ est d'oublier la diff{rence entre les NOMBRES KIet les ADRESSES en mode imm{diat. Les deux appels suivant de macros vont faire des choses diff{rentes:DA #"A" STA (STRING),Y?= Comme illustr{, la substitution des param}tres entr{s par DBl'utilisateur avec les variables est enti}rement litt{ral. Il est IGtout-@-fait possible de s'embrouiller de cette fa\on, mais Merlin vous IGinfAB peut etre utilis{e ainsi:> HTAB 20 ;htab @ la colonne 20 d{cimaleet g{n{rera le code suivant:6 LDA #20 ;[2 dans la macro POKEE STA CH ;[1 dans la macro POKE, 1er param}tre3 ;dans la macro HTABIG Les noms de MACRO peuvent etre aussi mis dans la colonne d'opcodes, GEsans utiliser PMC ou >>>, avec les restrictions suivantes: le nom de IGMacro ne peut etreun opcode r{gulier ou un pseudJSR SENDMSG. ASC [1 ASC "Exemple"# BRK BRK <<<1 D'autres exemples d'appel de la macro PRINT: >>> PRINT.!"citation"!' >>> PRINT."Ceci est un exemple" >>> itue le 1er param.> STA FLAG,X ;substitue le 2}me param. Il acceptera aussi:9DEFINITION DE MACRO EXEMPLE DE CODE RESULTANT/ PRINT MAC PRINT."Exemple", JSR SENDMSG ;appel macro@ LDA (PNTR),Y ;substitue le 1er param}tre> STA DEST ;substitue le 2}me param.et,1 >>> MUV.#3;FLAG,X ;appel macro= LDA #3 ;subst MUV MAC LDA [1 STA [2 <<<" >>> MUV.(PNTR),Y;DEST >>> MUV.#3;FLAG,XFavec le codage r{sultant pour les deux appels de macros pr{ce{dents:1 >>> MUV.(PNTR),Y;DEST t n{cessaires, cependant, entre les Aexpressions et il n'y a pas d'espaces suppl{mentaires accord{s.EC Les macros accepteront les datas litt{rales. Alors l'assembleur 0acceptera les types suivants d'appel de macro: DEFINITION DE MACROains autres caract}res @ la place de la IGp{riode (comme dans les exemples) ou des espaces entre le nom de macro FDet les expressions dans un traitement PMC. Vous pouvez utiliser ces caract}res: . / , - (@> Les points virgules sonacro. Une erreur BAD VARIABLE sera GEg{n{r{e si le nombre de valeurs est inf{rieur au nombre de variables IGutilis{es. Aucun message d'erreur ne sera g{n{r{, cependant, si il y a #plus de valeurs que de variables.HF L'assembleur acceptera certdans le traitelment PMC (ou >>>). Dans le listing assembleur, @>les variables sp{ciales seront remplac{es par les expressions correspondantes.CA Le nombre de valeurs doit correspondre au nombre de variables FDutilis{es dans la d{finition de mHen utilisant TEMP comme auxiliaire, puis {change le contenu de $06 avec celui de $1000.DB Si, comme pr{c{demment, certaines des variables sp{ciales sont JHutilis{es dans la d{finition de Macro, alors leurs valeurs doivent etre KIsp{cifi{es LDA [3 LDA TEMP2 STA [2 STA $07 <<< >>> SWAP.$6;$7;TEMP >>> SWAP.$1000;$6;TEMPJH Ce segment de programme {change le contenu de $06 avec celui de $07, JWAP.$6;$7;TEMP ;appel macro SWAP MAC2 LDA [1 LDA $063 STA [3 STA TEMP2 LDA [2 LDA $072 STA [1 STA $063r2;expr3...IGassignera la valeur de expr1 @ la variable [1, celle de expr2 @ [2, et 6ainsi de suite. Un exemple de cette utilisation est:BDEFINITION DE MACRO EXEMPLE DE RESULTAT DE CODAGEETEMP EQU $10 SARIABLES SPECIALES !!_______________________!IG Huit variables, nomm{es de [1 @ [8, sont pr{d{finies et conviennent KIdans les macros. Elles sont utilis{es dans les traitements PMC (ou >>>). L'instruction:) >>> NAME.expr1;expo opcode, tel que LDA, IGSTA, ORG, EXP, etc. De meme, il ne peut commencer par les lettres DEND ou POPD.I Notez que la syntaxe PMC ou >>> n'est pas sujette @ cet restriction. _______________________! !! VPRINT."compris?"FD RESTRICTION: Si de telles chaines contiennent des espaces ou des JHpoints virgules, ils DOIVENT etre limit{s par des guillemets (simple ou FDdouble). De meme des expressions comme >>>WHAT."A" doivent avoir un KId{limiteur final. (ceci est vrai seulement dans les appels macros ou les Ctraitements VAR, mais c'est une bonne pratique dans tous les cas)5Les librairies Macro et les Pseudos Op{rations USESB@ Il y a un nombre de librairies macro sur le disk Merlin. Ces M_A_N_U_A_L1! (( (()) )) ! ((())) ! (( )) ! !1! (( )) ! (( ! (((()))) ! (( !9! (( )) ! (((()))) ! (( )) ! (( !________:!____________!__________! (( )) ! (( ! !:    ____________ __________B! ! !__________ U_S_E_R_'_s6! (( )) ! (((()))) ! ! D! (((( )))) ! (( ! (((()))) !__________ nDO=====!====!====!====!====!====!====!====!====!====!====!====!====!====!====!===2D O=====<====<====<====<====<====<====<====<====<====<====<====<====<====<====<===__________._._._______._._.____e IGdisponible. Voir la documentation sur les pseudo opcodes USES pour une 4discussion sur leur utilisation dans un programme.J_________._._._______._._.__A___S_U_I_V_R_E__._._._______._._.__________J___._._._______._._._____________________cros peuvent etre incluses dans un IGassembleur en incluant simplement un pseudo opcode USES avec le nom de IGlibrairie appropri{. Il n'y a pas de limite au nombre de librairie qui GEpeuvent etre en m{moire en meme temps, except{ dans l'espace m{moir -une macro qui permet des impressions faciles @ 3 partir du langage machineIT.RWTS -permet un acc}s facile aux routines disk RWTS $ du dos 3.3FD Certaines de ces librairies maatiques @ virgule flottante de l'ApplesoftFT.MACROS MACROS.S -macros utilis{es souvent d'utilit{ g{n{raleIT.ROCKWELL ROCKWELL.S -ex{cute les opcodes relatifs au bit {tendu du ( Rockwell 65C02JT.SENDMSG SENDMSG.Steur de disk courant ou "online").< Les librairies macros incluses dans Merlin comprennent:6DOS 3.3 PRODOS fonctions de librairie macro>T.FPMACROS FPMACROS.S -permet un acc}s facile aux routinesJ math{mexistent dans le fichier,( 2/ le fichier est un fichier texte,DB 3/ si c'est une librairie dos 3.3, le nom de fichier doit etre pr{c{d{ de "T.",KI 4/ le fichier doit etre accessible au moment de l'assemblage (il doit 3etre sur le lec KIlibrairies sont des exemples de comment on peut {tablir une librairie de GEmacros habituelles. Les conditions pour qu'un fichier soit consid{r{ !comme une librairie macro sont:CA 1/ seules les d{finitions macros et les d{finitions de labels  !__________! (( ! (( !: ! (((()))) ! (( !D !__________! (( !__________E >>>>>>>> >>>>>>>> >>>>>>> ! (( ! !E >>> >>> >>> >>> >>> >>> ! (( ! (( )) !E >>> >>> >>> >>> >>> >>> !________! (((( )) !E >>>>>>>> >>>>>>>> >>> >>> ! (( )))) !E >>> >>> >>> >>> >>> PART III ! emblage @ moins que LST B@OFF ait {t{ utilis{. Elle est faite par ordre alphab{tique puis HFnum{riquement. La table de symbole peut etre stopp{e @ tout moment en KIpressant Ctrl-C. La stopper de cette fa\on n'affectera pas le code objet .g{n{r{. Ltuellement un espace de 16K =pour le code objet, qui peut etre chang{ avec l'opcode OBJ. _____________________! !! Table de Symboles !!_____________________!JH La table de symboles est imprim{e apr}s l'assoc{der normalement et le r{sultat sera afficher @ l'{cran ou sur CAimprimante. La seule preuve que cela est arriv{, si ce n'est pas GEintentionnel, est que la commande OBJECT CODE SAVE dans le mode EXEC KIn'est pas utilisable dans ce cas. Il y a habi Informations g{n{rales (prodos et dos 3.3) !2!______________________________________________!FD Si pendant l'assemblage, le code objet d{passe la ram utilisable IGalors le code ne sera pas {crit en m{moire, mais l'assembleur semblera ECprj@ l@. Un rechargement peut etre provoqu{ en GEtapant BRUN BOOT ASM qui sera alors une entr{e @ froid, "d{truisant" tout fichier en m{moire.1 ______________________________________________2! !2!a commande GE"ASSEM". Utiliser simplement "ASSEM" partout o| une commande DOS est ECvalable (par exemple, en basic). Un BRUN MERLIN ou un boot de disk HFpourra {galement provoquer une r{entr{e @ chaud ou bien ne rechargera FDpas MERLIN si il est d{te toute liaison d'E/S que vous FDpourriez avoir {tabli par les commandes PR# de l'{diteur. Sortir de GEl'assembleur (assemblage termin{ ou ctrl-C) d{connecte {galement les liaisons E/S.EC R{entrer apr}s une sortie vers le basic se fait par lEstandards et reconnecte le DOS. Ceci revient @ taper PR#0 et IN#0 au FDclavier. Entrer dans l'EDITEUR d{connecte le dos, ainsi vous pouvez IGutiliser des variables telles que INIT sans cons{quences d{sastreuses. ECR{entrer dans le mode EXEC d{connecI Quand vous sortez pour acc{der au basic ou au moniteur, ces pointeurs KIsont sauv{s sur la carte RAM @ $E00A-$E00F. Il sont restaur{s quand vous r{entrez dans Merlin.GE Entrer dans Merlin remplace les variables d'E/S actuelles par les Gfectera automatiquement les adresses $C, $D.1 ______________________________________________2! !2! Informations g{n{rales (dos 3.3 seulement) !2!______________________________________________!K par d{faut @ $AA00 en prodos)% END OF SOURCE dans $E,$FEC Notez que HIMEM ne change pas @ moins qu'une routine USER ou un GEprogramme utilitaire change les adresses $73, $74. Un tel changement 0afRCE au chargement, sans se soucier de son adresse originelle.# Les pointeurs importants sont:A START OF SOURCE dans $A,$B (mis @ $901 par d{faut)H HIMEM dans $C,$D (par d{faut @ $9853 en dos 3.3H [[[1 ___________________________3 _! !_4 !_! INFORMATIONS TECHNIQUES !_!2 !___________________________!KI Le source est plac{ @ STARTOFSOU(( )) !E >>> >>> >>> >>>>>>> ~~~~~~~~ ! (( )) !E !__________!8 traduit par SHEHERAZADE pour 'son' LO44 pr{f{r{/ [[[[[[[[[[[ [a table de symbole resemble @ ceci: MD = D{fintion Macro, M = label d{fini dans une macro6 V = Variable (symbols commen\ant par "[")@ ? = un symbole qui a {t{ d{fini mais ne sert jamais X = symbole externe! E = symbole d'entr{eJH Les labels locaux ne sont pas montr{s dans le listing de la table de symboles.FD Dans le mode EDIT, MERLIN prend le controle total des entr{es et IGsorties. Taper un caract}re de contet SAVE HELLO.F ___________________________________________________________________G! !G! Description des datas pour les configurations Prodos et Dos 3.3 !G!_________________guration (version DOS 3.3) !'!___________________________________!HF Les DATAS dans le programme de boot Applesoft "HELLO" contient les KIinformations de configuration. Pour changer les datas, faites juste LOAD +HELLO, changez les donn{es dans un fichier appel{ PARMS DBqui est charg{ quand l'assembleur tourne. Pour changer les datas, <changez juste le fichier source PARMS.S et r{assemblez le.& ___________________________________'! !'! Confias d'autre zone de la page z{ro disponible.% __________________________________&! !&! Configuration (version Prodos) !&!__________________________________!KI Les donn{es de configuration se trouvent t FDr{serv{es aux routines utilisateur (remarquer que le programme XREF KIutilise ces adresses). La zone $60-$6F de la page z{ro est r{serv{e pour JHles routines utilisateur supl{mentaires et peuvent etre utilis{es comme Fbon vous semble. Il n'y pm{moire principale sert aux routines KId'interface E/S. (on ne peut envoyer un caract}re @ COUT, par exemple, @ GEpartir de la m{moire auxiliaire). Merlin n'utilise pas ces zones. La ECzone $90-$9F de la page z{ro n'est pas utilis{e par Merlin et sone avec Merlin !*!______________________________________!JH Les zones m{moires $300-$3EF dans la m{moire principale et $800-$FFF JHdans la m{moire auxiliaire sont disponibles pour les ajouts USER et les KIroutines USR. La page trois dans la mmand{ de passer en mode 40 colonnes avant de faire cela. B@"CONTROL I 80N" dans le commande d'imprimante r{soud parfois le probl}me.) ______________________________________*! !*! R{partition de m{moiral 24 X 80, le support de ULTRATERM d{pend +de la carte qui se trouve dans le slot 3.HF Il se peut qu'il y ait des probl}mes si vous essayez d'envoyer des KIchoses @ l'imprimante alors que vous etes dans certains modes ULTRATERM. GEIl est recoSC 8 128 X 32IG Retourner au mode EXEC reimplantera l'{tat par d{faut qui se trouve IGdans le programme HELLO du dos 3.3 ou du fichier PARMS du prodos et on -obtient la meme chose de la commande VID 3.KI Except{ pour le format norm80 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 Eiteur, le mode ULTRATERM peut etre modifi{ par la s{quence IGESCAPE 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)4 ESC 1 Hcolonnes, ne fera pas cela dans le mode EDIT mais produit simplement un "Ctrl-A dans la ligne du fichier. _________________________! !! Information Ultraterm !!_________________________!IG Dans l'{drole aura l'effet d{crit dans cette IGdoc et PAS celui d{crit dans votre manuel de la carte 80 colonnes. Par ECexemple, Ctrl-C n'effacera pas l'{cran, mais est le "case toggle". GECtrl-A, qui agit comme un "case toggle" sur la plupart des cartes 80 J__________________________________________________!" DATA # PAR DEFAUT UTILITE@ 1 60 nombre de lignes par page (pour PRTR)D 2 0 lignes @ passer au changement de page (0 = provoque un caract}re "form feed")F 3 80 nombre de caract}res par lignes (pour PRTR)K 4 $80 doit etre 80 si l'imprimante fait son propre CR = en fin de ligne, sinon doit etre 0F 5 _____________________!IG Les fichiers sources de Merlin 64K peuvent etre charg{s directement JHpar Merlin Pro Dos 3.3. Pour utiliser un fichier source Merlin 64k avec KIMerlin Pro Prodos vous devez utiliser l'utilitaire CONVERT qui se trouve Front montr{ dans le catalogue. , Prodos seulement./ ____________________________________________0! !0! Fichiers source Merlin 64K et Merlin Pro !0!_______________________mode Ultraterm est chang{ (voir # byte 19)E 24-44 "$F1" @ noms de type de fichier pour les types de J "$F7" fichier d{fini par l'utilisateur de $F1 @ $F7. E Ces noms se 22 72 colonne @ laquelle le compte de cycle sera I imprim{ lors de l'utilisation de l'opcode CYC.E 23 $EC type de curseur pour Ultraterm. Doit etre H chang{ si le e ! carte.I 21 0 LSTDO par d{faut: 0,1-LSTDO ON, >1-LSTDO OFF. E Le bit 0, si @ 0, provoque une mise au 40 C colonnes quand il y a une commande PRTR.Fur. Donne un curseur r{gulier J si c'est $40 et un curseur bloc si c'est 0. La I carte 80-col Apple doit avoir le curseur bloc K ce marqueur sera modifi{ si vous utilisez cettnibble bas J d{termine le mode par d{faut de l'Ultraterm si F vous l'utilisez. La valeur 5 ou $85 met en 1 place le mode 32 X 80.J 20 $40 marqueur de curse pression sur une touche lors d'une erreur; si @ G 'off', un son retentira pendant 20 secondes 8 puis l'assemblage continuera.J Le bit V @ 1 d{connecte le bip. Le marqueur erreur/bip et param}tres de d{part % Ultraterm.F Le bit de poids fort, si sur 'on', forceraK l'assembleur @ faire une pause en attendant une K ut de l'{diteur et de H l'assembleur, remarquer que ces valeurs sont > relatives au cot{ gauche de l'{cranH 18 8 nombre de bytes/ligne apr}s la premi}re ligneG 19 5 able de symboleI 14 $AF "/" caract}re recherch{ lors d'une entr{e "UPDATE D SOURCE" dans l'assembleur. Si c'est 0 la 0 question sera {vit{e.B 15,16,17 14,20,31 les tabs par d{faetre {gal @ @ l'adresse de d{part du fichier sourceD 12 $DE "^" le caract}re de l'{diteur de la wild cardI 13 4 nombre de champs par ligne dans le listing de . la tTRE $83 EN PRODOS.H 6,7 $901 adresse de d{part du fichier source, ne doit 1 pas etre moins de $9012 8,9 $AA00 NE DOIT PAS ETRE CHANGEG 10,11 $901 fin de pointeur de source. Doit $83 marqueur 80 colonne. Doit etre $80+3 si la K carte 80 colonnes est en slot 3 (ou carte Apple G 80 col) doit etre choisi au moment du boot. < Sinon 0. DOIT EDsur le disk utilisateur Prodos. Certains changements dans le source FDpeuvent etre n{cessaires @ cause des pseudos opcodes manquants dans IGMerlin Pro. Si votre programme utilise HIMEM: ou SYM, ils peuvent etre KId{truits. Si votre programme utilis