home *** CD-ROM | disk | FTP | other *** search
-
- 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.
-
-