home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
600-699
/
ff600.lzh
/
NCode
/
NCode.docs
/
Manual.Dutch
< prev
next >
Wrap
Text File
|
1992-02-01
|
21KB
|
639 lines
NCode: THE CONDITIONAL MACRO ASSEMBLER (Copyright Edgar Visser).
1.1 Starten van de assembler.
De aanroep van uit de CLI is als volgt:
NCode <source file>
[-A<argument file>] (parameters uit file lezen)
[-L<listing file>] (default is scherm)
[-O<object file>]
[-P<pagina lengte>] (-P0 schakelt softpages uit)
[-C<cpu code>] (-C0/68000,1/68010,2/68020,3/68030)
Standaard parameters worden vanuit het bestand "NCode.arg"
gelezen. Dit argument bestand kan naar behoeven worden aangepast
met behulp van een eenvoudige tekstverwerker. Tevens is het
mogelijk om meerdere argument bestanden te lezen en te nesten.
Dit biedt uitkomst voor het vastleggen van standaard
instellingen; bijvoorbeeld betreffende de gebruikte CPU.
De listing gaat, tenzij anders gespecificeerd, naar het
beeldscherm. Is de listing geheel of gedeeltelijk uitgeschakeld,
dan worden alleen geconstateerde fouten van het uitgeschakelde
deel uitgevoerd.
De assembler maakt geen object file, tenzij daar expliciet om
gevraagd wordt. Indien het te assembleren bestand geheel zonder
fouten is geassembleerd maakt de assembler (mits -O optie) een
object bestand aan. Indien mogelijk wordt er uitvoerbare code
geproduceerd; deze code behoeft dus niet meer te worden gelinkt.
Bevatte de sourcecode daarentegen externe referenties of
definities dan wordt er een object bestand aangemaakt dat nog
verder door een linker moet worden behandeld.
Door middel van de "-P<pagina lengte>" parameter is het mogelijk
om zonder de sourcecode te wijzigen (m.b.v. het PLEN-directief)
de paginalengte op te geven. De vooringestelde paginalengte is 60
regels. Gaat de listing naar het beeldscherm dan worden er GEEN
soft-pages uitgevoerd, tenzij uitdrukkelijk verzocht in de source
code (het PAGE-directief). De aanmaak van softpages is te
onderdrukken door "-P0" als argument mee te geven. Het "-P"-
argument is bijzonder handig, indien geplaatst in het "NCode.arg"
bestand. Dit voorkomt dat deze steeds weer opnieuw moet worden
meegegeven. Bovendien blijft de pagina lengte hiermee toch
variabel, omdat de argumenten van de command-line de argumenten
uit het argument file mogen overschrijven.
NCode is in staat om code te produceren voor de MC68000, MC68010,
MC68020 en MC68030. Met behulp van het "-C<cpu code>" argument
kan de assembler verteld worden voor welke CPU code moet worden
gemaakt. Omdat dit niet iets is wat regelmatig zal wijzigen is
het verstandig om dit argument in "NCode.arg" vast te leggen.
Wordt er geen "-C" argument gelezen dan wordt uitgegaan van een
MC68000 CPU. Dit directief zorgt ervoor dat niet toegestane
instruktie, instruktie varianten en operanden niet geaccepteerd
worden en als fout uitgevoerd worden.
1.2 Source code syntax.
Een regel source code kan uit vier velden bestaan:
Label veld b.v. START:
Operator veld b.v. MOVE.L
Operand veld b.v. 10(a6),d0
Kommentaar veld b.v. ;teller=max
De velden moeten onderling gescheiden zijn door een of meer tabs
of spaties. Tevens kunnen bepaalde of zelfs alle velden
weggelaten worden.
1.2.1 Labels.
Een label moet altijd op de eerste positie van een nieuwe regel
beginnen om door de assembler als label gezien te worden. Het
label wordt afgesloten door een tab, spatie, dubbele punt,
puntkomma of sterretje. De mogelijkheid om een label af te
sluiten met een dubbele punt is opgenomen voor compatibiliteit
met andere assemblers en is niet verplicht. Een label begint met
een underscore, punt of letter gevolgd door nul of meer
underscore's, punten, letters en cijfers. Er wordt door de
assembler onderscheid gemaakt tussen hoofd- en kleine letters van
het label. Alleen de eerste 31 tekens zijn significant, waarvan
er hoogstens 16 worden afgedrukt in de symbol-tabel-dump.
1.2.2 Kommentaar.
Kommentaar wordt door de assembler overgeslagen. Kommentaar volgt
na een puntkomma op een willekeurige plaats op de regel, of na
een sterretje aan het begin van de regel (de hele regel is dan
kommentaar). Staat er kommentaar na een directief of instruktie,
die geen operand verwacht, dan is een puntkomma overbodig.
Hetzelfde geldt voor eventuele tekst na het operand veld.
1.2.3 Operator.
Een operator kan zowel een instruktie als een assembler directief
zijn. De syntax van de instrukties is volledig naar Motorola
standaard en mag zowel in hoofd- als in kleine letters worden
opgegeven.
Aan een instruktie of pseudopcode, die op meer dan een data
grootte van toepassing kan zijn, mag een zogenaamde size-
specifier meegeven worden. Na de instruktie of pseudop moet dan
een punt volgen waarna de size (een letter) komt. Toegestane
size's zijn:
- B Byte data (8 bits)
- W Word data (16 bits)
- L Long Word data (32 bits) of Long Branch
- S Short Branch
De size mag in hoofd- en kleine letters worden opgegeven.
1.2.4 Operand.
Het operand veld (indien van toepassing) kan een of meer
operanden voor de instruktie of pseudop bevatten. Deze worden
onderling gescheiden door komma's. Het einde van het operand veld
wordt aangeven door een tab, spatie, kommentaar symbool of
newline.
1.3 Expressies.
Een expressie mag uit labels, konstanten, operatoren en haakjes
bestaan en bevindt zich altijd in het operand veld.
1.3.1 Operatoren.
De toegestane operatoren van hoge naar lage prioriteit zijn:
1. Unaire min, Logische NOT (- en ~)
2. Leftshift, Rightshift (<< en >>)
3. Logische AND, OR en XOR (&, ! of |, ^)
4. Vermenigvuldigen, Delen (* en /)
5. Optellen, Aftrekken (+ en -)
Alle operatoren zijn toegestaan voor absolute operanden. Voor
optellen geldt dat ook relatief+absoluut en andersom toegestaan
is (resultaat is relatief). Voor aftrekken geldt dat relatief-
relatief toegestaan is, mits beide relatieven afhankelijk van
dezelfde sectie zijn, waarbij het resultaat absoluut is. Ook is
relatief-absoluut toegestaan, wat een relatief resultaat levert.
1.3.2 Konstanten.
Konstanten mogen als deel van een expressie voorkomen en geven
altijd absolute waarden. Mogelijke vormen van konstanten.
- Decimaal
een rijtje cijfers
b.v. 2452
- Hexadecimaal
$ gevolgd door een rijtje van hexadecimale cijfers
b.v. $67AC
- Octaal
@ gevolgd door een rijtje van octale cijfers
b.v. @36
- Binair
% gevolgd door een rijtje nullen en enen
b.v. %0101000001
- ASCII string
maximaal vier ASCII tekens (een longword) ingesloten door
enkele of dubbele quootjes
b.v. "WTG"
ASCII strings bestaande uit minder dan vier tekens worden links
aangevuld met nullen. Quootjes binnen de string zijn mogelijk
door twee quootjes achter elkaar te schrijven. Een voorbeeld is
'ed''s', dit kan trouwens ook bereikt worden met "ed's".
1.4 Adresserings wijzen.
De syntax van de adresserings wijzen is na Motorola standaard als
weergegeven in onderstaande tabel. In deze tabel staat "Dn" voor
een data register (D0-D7), "An" staat voor een adres register
(A0-A7 of SP), "Xn" staat voor een index register (data of adres
register) optioneel gevolgd door een ".W" of ".L" size-specifier
en (alleen MC68020/30) een "*Scale" scale (waarde 1,2,4 of 8).
Syntax Omschrijving
Dn data register direct
An address register direct
(An) address register indirect
(An)+ address register indirect postincrement
-(An) address register indirect predecrement
d16(An) address register indirect displacement
d8(An,Xn) address register indirect index
* (bd,An,Xn) address register indirect base displacement
* ([bd,An],Xn,od) memory indirect postindexed
* ([bd,An,Xn],od) memory indirect preindexed
xxx.W of (xxx).W absoluut short
xxx.L of (xxx).L absoluut long
d16(PC) program counter indirect displacement
d8(PC,Xn) program counter indirect index
* (bd,PC,Xn) program counter indirect base displacement
* ([bd,PC],Xn,od) PC memory indirect postindexed
* ([bd,PC,Xn],od) PC memory indirect preindexed
#<data> immediate
USP,CCR,VBR, etc. speciale adresserings wijzen
De met een sterretje in de kantlijn gemarkeerde adresserings
wijzen zijn alleen toegestaan voor de MC68020 en MC68030. Van al
deze gemarkeerde adresserings wijzen kan elk deel van de operand
weggelaten (suppressed) worden, dit deel wordt dan niet
meegenomen in de berekening van het effektieve adres van de
operand. Bij de PC-modi is het mogelijk om een expliciet
suppressed PC aan te geven om te voorkomen dat de assembler het
voor een suppressed adres register ziet. Dit wordt gedaan door
"ZPC" te plaatsen waar de PC moet worden suppressed. Voorbeelden
zijn: ([A5],lab), ([A2,D4.W*4]), (basdp,ZPC,A3*8) of zelfs ([]).
1.5 Instruktie varianten.
Verschillende instrukties (bijvoorbeeld ADD en MOVE) hebben een
afwijkende syntax voor het adresseren van verschillende typen
operanden, zo is er bijvoorbeeld MOVEA voor address register
destination. NCode is in staat om de juiste instruktie varianten
te kiezen bij de operanden. Dit maakt het mogelijk om
bijvoorbeeld CMP (Ax)+,(Ay)+ te schrijven in plaats van CMPM
(Ax)+,(Ay)+.
Tevens kan NCode branch instrukties die geen size-specifier
hebben en terugspringen optimaliseren indien de afstand tot het
inspring punt dit toestaat.
1.6 Assembler directieven.
Assembler directieven zijn instrukties voor de assembler die
aangeven hoe de code moet worden vertaald, wat en of er ge-list
wordt, macro's mogelijk maken, ed. Hieronder volgen de
ondersteunde pseudopcodes met hun werking.
1.6.1 Pseudopcodes.
- SECTION
syntax: [<label>] SECTION <naam>[,CODE|DATA|BSS][,CHIP|FAST]
Deze pseudop meldt aan de assembler dat er een nieuwe sectie
begint (<naam> is nieuw) of het vervolg van een afgebroken
sectie (<naam> is naam van een eerder gestarte sectie).
CODE geeft aan dat sectie uitvoerbare code bevat (default).
DATA geeft aan dat sectie geinitialiseerde data bevat.
BSS geeft aan dat sectie alleen niet geinitialiseerde data
bevat. Het Operating System vraagt automatisch geheugen
aan voor deze sectie.
CHIP geeft aan dat het gevraagde type geheugen (CODE, DATA,
BSS) in het geheugen dat door de grafische- en I/O -
chips gebruikt wordt, moet komen.
FAST geeft aan dat de sectie in het geheugen gedeelte
ontoegankelijk voor de custom chips moet komen.
Wordt geen CHIP of FAST opgegeven dan wordt de keuze van de
geheugen toewijzing aan het Operating System overgelaten.
De assembler geeft het eventueel aanwezige label het sectie
nummer van de nieuwe sectie en als waarde de waarde van de
PC.
De assembler kan maximaal 255 verschillende secties aan,
waarbij de assembler begint met een niet benoemde CODE
sectie.
- END
syntax: [<label>] END
Na dit directief wordt alle source overgeslagen. Een
eventueel label krijgt de waarde van de program counter
voordat het END directief wordt uitgevoerd.
- EQU
syntax: <label> EQU <exp>
De waarde van de expressie (absoluut of relatief) wordt aan
<label> gegeven. Voorwaartse of externe referenties zijn
niet toegestaan.
- SET
syntax: <label> SET <exp>
De waarde van de expressie (absoluut of relatief) wordt aan
<label> gegeven. SET is identiek aan EQU, behalve dat
<label> met SET opnieuw gedefinieerd mag worden.
- EQUR
syntax: <label> EQUR <register>
Deze pseudop maakt het mogelijk een data of adres register
bij naam aan te spreken. Na het "EQUR" kan aan een register
gerefereerd worden door invulling van het label.
<register> is "Dn", "An", "SP" (is A7) of een ander EQUR-
label. Voorwaartse referenties zijn niet toegestaan.
- REG
syntax: <label> REG <register list>
Het REG directief kent een waarde aan het label toe die de
assembler kan vertalen in een 'register list mask ' zoals
gebruikt wordt in de MOVEM instruktie.
<register list> is van de vorm R1[-R2][/R3[-R4]]... waarbij
Rx een data of adres register is (mogelijk EQUR-label) of
een reeds bestaande 'register list mask'.
- DC
syntax: [<label>] DC[.<size>] <list>
Plaats een of meer constanten in de object code. Het aantal
operanden is in principe onbeperkt zolang ze maar gescheiden
worden door komma's. De <size> geeft aan of het hier byte,
words of longwords betreft. Indien geen size opgegeven wordt
dan wordt ".W" als size genomen. Bij byte size is het
mogelijk om een string in het geheugen te plaatsen door deze
string tussen enkele of dubbele quootjes te schrijven. Bij
.W en .L size wordt ervoor gezorgd dat de data op een even
adres begint.
- DS
syntax: [<label>] DS[.<size>] <absexp>
Reserveert geheugen. De hoeveelheid geheugen die de
assembler reserveert is afhankelijk van de <size> (default
.W) en de waarde van de absolute expressie in het operand
veld. De assembler reserveert <absexp> bytes, words of
longwords afhankelijk van de <size>. Word en Longword size's
beginnen altijd op een even adres. Dus "DS.W 0" heeft tot
gevolg dat de program counter op een even adres komt te
staan (zie ook het EVEN en CNOP directief).
- RS
syntax: [<label>] RS[.<size>] <absexp>
Als het DS-directief, maar dan zonder geheugen te
reserveren. Deze pseudop kan gebruikt worden om een lijst
met offsets te definieren. Een eventueel aanwezig label
krijgt de waarde van de offset tot het begin van de lijst
met de offsets. Hoeveel de offset ten opzichte van de vorige
offset toeneemt is afhankelijk van de <size> (default .W) en
de waarde van de absolute expressie in het operand veld.
Vergelijk ook het DS-directief.
- RSSET
syntax: [<label>] RSSET <absexp>
Geeft het begin aan van een lijst met offsets gedefinieerd
door het RS-directief. De eerste offset, gedefinieerd met
het RS-directief, krijgt de waarde als gegeven in de
operand.
- RSRESET
syntax: [<label>] RSRESET
Geeft het begin aan van een lijst met offsets gedefinieerd
door het RS-directief. De eerste offset heeft de absolute
waarde 0.
- LIST
syntax: LIST
Dit directief meldt de assembler dat de regels naar het
listing file geschreven moeten worden. Het directief komt
zelf niet in de listing voor.
- NOLIST
syntax: NOLIST
Schakelt de uitvoer van regels naar het listing file uit.
Alleen regels met geconstateerde fouten worden naar het
listing file gestuurd. Het directief komt zelf niet in de
listing voor.
- MLIST
syntax: MLIST
Bepaalt dat de expansie van macro's ge-list moet worden. De
regelnummers, in de listing, lopen niet door bij een macro
expansie. Het directief komt zelf niet in de listing voor.
- NOMLIST
syntax: NOMLIST
Macro expansies worden niet ge-list, tenzij er fouten in de
expansie ontdekt werden. Het directief komt zelf niet in de
listing voor.
- CLIST
syntax: CLIST
Geeft aan dat wanneer er niet voldaan wordt aan een gestelde
conditie van conditionele assembly de niet vertaalde regels
code toch moeten worden ge-list. Het directief komt zelf
niet in de listing voor.
- NOCLIST
syntax: NOCLIST
Zorgt ervoor dat source code die niet vertaald wordt door
het niet voldoen aan een 'conditional assembly statement'
ook niet worden ge-list. Het directief komt zelf niet in de
listing voor.
- PAGE
syntax: PAGE
Na het "PAGE" directief wordt de listing op een nieuwe
pagina vervolgd. Boven elke nieuwe pagina staat een pagina
nummer, een copyright vermelding, een versie nummer en een
door de gebruiker zelf op te geven kopregel. Het "PAGE"
directief komt niet in de listing voor.
- NOPAGE
syntax: NOPAGE
Schakelt het automatisch aanmaken van softpages met hun
headers uit. Het directief wordt niet ge-list.
- PLEN
syntax: PLEN <absexp>
Hiermee is de paginalengte, in regels, in te stellen. De
paginalengte moet tussen de 20 en 200 regels liggen, en
wordt bepaald door de waarde van de expressie in het operand
veld. De vooringestelde paginalengte is 60 regels.
- TTL
syntax: TTL <string>
Het "TTL" directief geeft aan welke string de assembler in
de header op moet nemen. Deze string begint bij de eerste
niet spatie of tab uit het operand veld en eindigt bij het
einde van de regel. De string mag niet meer dan 60 tekens
lang zijn. Het directief komt zelf niet in de listing voor.
- FAIL
syntax: FAIL
Deze pseudop genereert een foutmelding voor de regel waarop
deze staat. Dit is nuttig voor conditionele assembly met
macro's waarbij bijvoorbeeld getest kan worden op het aantal
actuele parameters.
- EVEN
syntax: [<label>] EVEN
Zorgt ervoor dat de waarde van de program counter even
wordt. Is de PC oneven, dan wordt er een byte met de waarde
nul ingevoegd. Een eventueel aanwezig label krijgt de even
waarde van de PC.
- CNOP
syntax: [<label>] CNOP <absexp>,<absexp>
De eerste expressie geeft de offset, terwijl de tweede
expressie de basis voor de 'alignment' geeft. De code wordt
'aligned' naar de gegeven offset vanaf de eerste
'alignment'. Bijvoorbeeld CNOP 0,4 zorgt ervoor dat de code
begint op een longword alignment.
- MACRO
syntax: <label> MACRO
Het MACRO directief geeft het begin van een macro definitie
aan. Deze definitie begint op de eerste regel na "MACRO" en
loopt tot de regel met het "ENDM" directief. Het
(verplichte) label is de naam van de macro. De macro kan dan
worden geexpandeerd door het plaatsen van de macronaam in
het operator veld eventueel gevolgd door een lijst met
aktuele parameters.
De macro definitie mag systeemindexen en tien verschillende
parameters bevatten. De formele parameters zijn van de vorm
"\X", waarbij X (0-9) het nummer van de aktuele parameter
is. Hierbij is \0 een bijzonder geval; deze parameter bevat
de size-specifier van de macro-aanroep. Er zijn twee soorten
aktuele parameters. Ten eerste de eenvoudige parameters.
Deze worden afgesloten door een komma of blank (tab, spatie
of newline) en kunnen deze afsluiters dus niet bevatten. De
tweede soort parameters zijn de parameters tussen scherpe
haken ('<' en '>'). Deze parameters kunnen wel tabs, komma's
en spaties bevatten. Een systeem index is van de vorm "\@"
en levert bij expansie een string van de vorm "_nnn" waar
nnn aangeeft de hoeveelste expansie dit is van deze macro.
Dit voorkomt dat er labels dubbel gedefinieerd worden bij
meerdere expansies van een macro.
Macro-aanroepen mogen genest worden tot een diepte van 16
aanroepen. Macro's mogen geen macro definities, maar wel
macro aanroepen, bevatten. Indien expansies van macro's in
de listing worden opgenomen lopen de regelnummers niet door.
- NARG
syntax: NARG
Het symbool "NARG" is een speciaal symbool met als waarde
het aantal actuele parameters dat meegegeven is aan de
huidige macro. Buiten macro's heeft dit symbool de waarde 0.
- ENDM
syntax: ENDM
Sluit een macro definitie, gestart met het "MACRO"
directief, af.
- MEXIT
syntax: MEXIT
Met behulp van het "MEXIT" directief kan de expansie van een
macro afgebroken worden. Dit directief komt meestal voor bij
'conditional assembly'.
- XDEF
syntax: XDEF <label>[,<label>]
Een of meer absolute of relatieve labels worden als
'entry-points' naar de huidige module gedefinieerd. Het
refereren vanuit andere module's aan deze labels gebeurt met
behulp van het "XREF" directief.
- XREF
syntax: XREF <label>[,<label>...]
Maakt het mogelijk om aan labels te referen die in een
andere module zijn gedefinieerd. De juiste waarde van de
labels wordt dan later door de linker ingevuld.
- INCDIR
syntax: INCDIR <pad>[,<pad>...]
Hiermee kunnen zoekpaden worden opgegeven die doorzocht
kunnen worden bij een "INCLUDE" directief.
- INCLUDE
syntax: INCLUDE <file naam>
Het "INCLUDE" directief maakt het mogelijk om externe
bestanden op te nemen in de source code. Include bestanden
mogen genest worden tot een diepte van 16 nivo's. Tenzij er
bij de file naam een volledig pad is opgegeven wordt er
eerst in de huidige directory gezocht naar het bestand.
Wordt dit niet gevonden dan wordt er in de met "INCDIR"
opgegeven zoekpaden gezocht naar het bestand.
- IDNT
syntax: IDNT <string>
Aan een module kan een naam gegeven worden. Vindt de linker
twee modulen met een en dezelfde naam dan wordt daar een
sectie van gemaakt.
1.6.2 Conditional assembly.
Bij conditionele assembly kunnen stukken source code wel of niet
geassembleerd worden, afhankelijk van een opgegeven conditie.
Hierbij zijn de niet geassembleerde regels niet van direct belang
voor het programma, daarom is de mogelijkheid opgenomen om zulke
regels wel of niet te listen. De pseudopcode's die dit
bewerkstelligen zijn: 'CLIST' en 'NOCLIST'.
Voor al de bovengenoemde 'listing control directives' geldt dat
ze niet in de listing, tenzij een fout in size of operand,
opgenomen worden.
De reeds genoemde 'conditional assembly directives' zijn steeds
van de volgende vorm:
IFxx <operand>
<source-code>
ENDC
Waarbij IFxx een van de volgende vormen is:
-IFEQ assembleer indien expressie in operand =0
-IFNE assembleer indien expressie in operand <>0
-IFGT assembleer indien expressie in operand >0
-IFGE assembleer indien expressie in operand >=0
-IFLT assembleer indien expressie in operand <0
-IFLE assembleer indien expressie in operand <=0
-IFC assembleer indien de strings in de operanden gelijk zijn
-IFNC assembleer indien de strings in de operanden ongelijk zijn
-IFD assembleer indien symbool in de operand gedefinieerd is
-IFND assembleer indien symbool in de operand ongedefinieerd is
De IFxx condities mogen onbeperkt genest worden, waarbij de
eerste 'ENDC' bij de laatste conditie hoort.