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.English < prev    next >
Text File  |  1992-02-01  |  24KB  |  708 lines

  1.  
  2. NCode: THE CONDITIONAL MACRO ASSEMBLER (Copyright Edgar Visser).
  3.  
  4.  
  5. 1.1 Calling the assembler.
  6.  
  7. The command template for the assembler is:
  8.  
  9.   NCode <sourcefile>
  10.         [-A<parameter file>] (params will be read from file)
  11.         [-L<listing file>]   (default is output to screen)
  12.         [-O<object file>]
  13.         [-P<page length>]    (-P0 turns off soft-pages)
  14.         [-C<cpu code>]       (-C0/68000,1/68010,2/68020,3/68030)
  15.  
  16. Standard parameters will be read from the file "NCode.arg". This
  17. parameter file can be adapted to suit your particular needs by
  18. changing it with a simple text editor. It is also possible to
  19. have multiple parameter files, which can be nested to any depth.
  20. This comes in very handy for passing standard parameters to the
  21. assembler; for example concerning the target CPU.
  22.  
  23. The listing will go, unless specified otherwise, to the screen.
  24. If the listing turned is off then only error-reports will be
  25. send to the listing.
  26.  
  27. The assembler does not produce an object file unless you request
  28. it explicitly. If an "-O" argument was given and there were no
  29. errors found an object file will be produced. If possible the
  30. assembler will generate an executable file; this code does not
  31. need to be linked and can be executed directly. But does the
  32. sourcecode contain any external references or external
  33. definitions then the produced object file will still need to be
  34. linked.
  35.  
  36. By using the "-P<page length>" parameter it is possible to give
  37. the page length without having to alter the sourcecode (by using
  38. the PLEN-directive). The default page length is 60 lines. If the
  39. listing is send to the screen there will be NO soft-pages in the
  40. listing, unless explicitly requested for by the PAGE-directive.
  41. It is also possible to suppress soft-pages by calling the
  42. assembler with "-P0" as a parameter. The "-P" parameter is very
  43. useful if placed in the "NCode.arg" file. This makes sure you
  44. don't have to give this parameter every time you call the
  45. assembler. The page length remains variable, because parameters
  46. given on the command line may overwrite arguments given in the
  47. argument file.
  48.  
  49. NCode can produce code for the Motorola MC68000, MC68010, MC68020
  50. and the MC68030 CPU. By using the "-C<cpu code>" argument you can
  51. tell the assembler for what processor to produce code. Because
  52. this is a setting that will probably not change very often, is
  53. wise to put the "-C" argument in "NCode.arg".
  54.  
  55. If no "-C" keyword is given the assembler will generate code for
  56. the MC68000 CPU. The "-C" keyword makes sure that instructions
  57. and operands that are not allowed for the specified cpu will
  58. produce error-reports.
  59.  
  60.  
  61. 1.2  Sourcecode syntax.
  62.  
  63. One line of sourcecode can be divided into four parts:
  64.  
  65. Label field         e.g. START:
  66. Opcode field        e.g. MOVE.L
  67. Operand field       e.g. 10(a6),d0
  68. Comment field       e.g. ;teller=max
  69.  
  70. To separate each field from the next, press the SPACEBAR or TAB
  71. key. This produces a separator character. You may use more than
  72. one separator to separate the fields. Some or all fields may be
  73. omitted.
  74.  
  75.  
  76. 1.2.1 Labels.
  77.  
  78. A label should always start on the first position of a new line
  79. in order to be seen as a label by the assembler. A label may be
  80. followed by a newline, tab, space, colon, semi colon or asterisk.
  81. The possibility to end a label with a colon is for compatibility
  82. with other assemblers and is not needed by the assembler. A label
  83. starts with an underscore, dot or character followed by zero or
  84. more underscores, dots, characters and digits. The assembler
  85. distincts between characters in upper and lower case. Only the
  86. first 31 characters are significant, of which a maximum of 16
  87. characters will be printed in the symbol-table-dump.
  88.  
  89.  
  90. 1.2.2 Comment.
  91.  
  92. Anything after a semi colon, asterisk or the terminating space of
  93. the operand field is ignored. So the assembler treats any
  94. characters you insert after the terminating space as a comment.
  95.  
  96.  
  97. 1.2.3 Opcode.
  98.  
  99. An opcode can be an instruction, assembler directive or macro.
  100. The syntax of the instructions is completely as defined in the
  101. Motorola MC680x0 User's Manual and can be given in upper or lower
  102. case.
  103.  
  104. To enter instructions and directives that can operate on more
  105. than one data size, you use an optional size-specifier (one
  106. character), which is separated from the opcode by a dot. Possible
  107. size-specifiers are:
  108.  
  109.  - B Byte data (8 bits)
  110.  - W Word data (16 bits)
  111.  - L Long Word data (32 bits) or Long Branch
  112.  - S Short Branch
  113.  
  114. The assembler makes no difference between a size-specifier in
  115. upper or lower case.
  116.  
  117.  
  118. 1.2.4 Operand.
  119.  
  120. If present, the operand field contains one or more operands to
  121. the instruction or directive, and must be separated from it by at
  122. least one space or tab. If you have two or more operands in this
  123. field, you must separate them with a comma. The operand field
  124. terminates with a space, tab, comment or newline character.
  125.  
  126.  
  127. 1.3   Expressions.
  128.  
  129. An expression is a combination of symbols, constants, algebraic
  130. operators and parentheses that you can use to specify the operand
  131. field to instructions or directives. You may include relative
  132. symbols in an expression, but they can only be operated on by a
  133. subset of the operators.
  134.  
  135.  
  136. 1.3.1 Operators.
  137.  
  138. The available operators are listed below in order of precedence.
  139.  
  140. 1. Unary Minus, Logical NOT (- and ~)
  141. 2. Leftshift, Rightshift (<< and >>)
  142. 3. Logical AND, OR and XOR (&, ! or |,  ^)
  143. 4. Multiply, Divide (* and /)
  144. 5. Add, Subtract (+ and -)
  145.  
  146. All operators are allowed on absolute operands. But when using
  147. the Add operator (+) only relative+absolute and absolute+relative
  148. is allowed (result is relative). When using the Subtract operator
  149. (-) relative-relative is allowed if both relatives are dependent
  150. of the same section (result is absolute). Relative-absolute is
  151. also allowed, which results in a relative value.
  152.  
  153.  
  154. 1.3.2 Constants
  155.  
  156. Constants can be part of an expression and always have an
  157. absolute value. They take one of the following formats:
  158.  
  159.  - Decimal
  160.    a string of decimal digits
  161.    e.g. 33458
  162.  
  163.  - Hexadecimal
  164.    $ followed by a string of hex digits
  165.    e.g. $89AB
  166.  
  167.  - Octal
  168.    @ followed by a string of octal digits
  169.    e.g. @678
  170.  
  171.  - Binary
  172.    % followed by zeros and ones
  173.    e.g. %10100010
  174.  
  175.  - ASCII Literal
  176.    up to 4 ASCII characters within single or double quotes
  177.    e.g. 'WTG'
  178.  
  179. Strings of less than 4 characters are justified to the right,
  180. using null as the packing character. To obtain a quote character
  181. in the string, you can use two quotes e.g. 'Ed''s' the same can
  182. be achieved by "Ed's".
  183.  
  184.  
  185. 1.4  Addressing modes.
  186.  
  187. The syntax of the addressing modes is in standard Motorola syntax
  188. as given in the following table. "Dn" represents one of the data
  189. registers (D0-D7), "An" represents one of the address registers
  190. (A0-A7 and SP), "Xn" represents an index register (data of
  191. address register) optionally followed by an ".W" or ".L" size-
  192. specifier and (MC68020/30) a "*Scale" scale (value 1,2,4 or 8).
  193.  
  194.   Syntax            Description
  195.  
  196.   Dn                data register direct
  197.   An                address register direct
  198.   (An)              address register indirect
  199.   (An)+             address register indirect postincrement
  200.   -(An)             address register indirect predecrement
  201.   d16(An)           address register indirect displacement
  202.   d8(An,Xn)         address register indirect index
  203. * (bd,An,Xn)        address register indirect base displacement
  204. * ([bd,An],Xn,od)   memory indirect postindexed
  205. * ([bd,An,Xn],od)   memory indirect preindexed
  206.   xxx.W or (xxx).W  absolute short
  207.   xxx.L or (xxx).L  absolute long
  208.   d16(PC)           program counter indirect displacement
  209.   d8(PC,Xn)         program counter indirect index
  210. * (bd,PC,Xn)        program counter indirect base displacement
  211. * ([bd,PC],Xn,od)   PC memory indirect postindexed
  212. * ([bd,PC,Xn],od)   PC memory indirect preindexed
  213.   #<data>           immediate
  214.  
  215. USP,CCR,VBR etc.    special addressing modes
  216.  
  217.  
  218. The with an "*" marked addressing modes are only allowed for the
  219. MC68020 and MC68030. Of these marked addressing modes any part of
  220. the operand may be omitted (suppressed). This suppressed part
  221. will not be taken in account when calculating the effective
  222. address of the operand. At the PC-modes it is possible to
  223. explicitly suppress the PC to make sure that the assembler does
  224. not see it as an suppressed address register. This is done by
  225. typing "ZPC" at the position of the suppressed PC. Examples are:
  226. ([A5],lab), ([A2,D4.W*4]), (basdp,ZPC,A3*8) or even ([]).
  227.  
  228.  
  229. 1.5  Instruction variations.
  230.  
  231. Certain instructions (e.g. ADD en MOVE) have an address variant
  232. for different types of operands, there is for example a MOVEA for
  233. address register as destination. NCode is capable of choosing the
  234. right address variant for the specified operand. This allows you
  235. to write, for example, CMP (Ax)+,(Ay)+ instead of writing CMPM
  236. (Ax)+,(Ay)+.
  237.  
  238. NCode is also capable of converting branches without size-
  239. specifier that do not jump forward to a short branch if the
  240. branch distance allows this.
  241.  
  242.  
  243. 1.6  Assembler directives.
  244.  
  245. Assembler directives are instructions to the assembler. They may
  246. tell the assembler how to translate the code, how and what to
  247. list, start macro definitions, etc. The following table lists the
  248. directives by function.
  249.  
  250.  
  251. 1.6.1 Pseudopcodes.
  252.  
  253.  - SECTION
  254.  
  255. syntax: [<label>] SECTION <name>[,CODE|DATA|BSS][,CHIP|FAST]
  256.  
  257. This directive tells the assembler to restore the counter to
  258. the last location allocated in the named section (or to zero
  259. if used for the first time).
  260.  
  261.    CODE indicates that the section contains relocatable code.
  262.         This is the default.
  263.    DATA indicates that section contains initialized data
  264.         (only).
  265.    BSS  indicates that the section contains uninitialized data.
  266.  
  267.    CHIP indicates that the requested type of memory (CODE,
  268.         DATA, BSS) is to be placed in the memory part
  269.         accessible by the custom chips.
  270.    FAST the section of memory is to be placed in the memory
  271.         inaccessible by the custom chips.
  272.  
  273. The assembler can maintain up to 255 sections. Initially,
  274. the assembler begins with an unnamed CODE section. The
  275. assembler assigns the optional symbol <labels> to the value
  276. of the program counter AFTER it has executed the SECTION
  277. directive. In addition, where a section is unnamed, the
  278. shorthand for that section is the keyword CODE. If CHIP or
  279. FAST memory is not explicitly requested, then the choice
  280. for the type of memory is left to the Operating System.
  281.  
  282.  - END
  283.  
  284. syntax: [<label>] END
  285.  
  286. The END directive tells the assembler that the source is
  287. finished, and the assembler ignores subsequent source
  288. statements. When the assembler encounters the END directive
  289. during the first pass, it begins the second pass. If the
  290. label field is present, then the assembler assigns the value
  291. of the current program counter to the label before it
  292. executes the END-directive.
  293.  
  294.  - EQU
  295.  
  296. syntax: <label> EQU <exp>
  297.  
  298. The EQU directive assigns the value of the expression in the
  299. operand field to the symbol in the label field. The value
  300. assigned is permanent, so you may not define the label
  301. anywhere else in the program. Forward or external references
  302. are not allowed within the expression.
  303.  
  304.  - SET
  305.  
  306. syntax: <label> SET <exp>
  307.  
  308. The SET directive assigns the value of the expression in the
  309. operand field to the symbol in the label field. SET is
  310. identical to EQU, apart from the fact that within SET the
  311. label may be redefined. You can always change SET later on
  312. in the program. You should not insert forward references
  313. within the expression.
  314.  
  315.  - EQUR
  316.  
  317. syntax: <label> EQUR <register>
  318.  
  319. This directive lets you equate one of the processor
  320. registers with a user symbol. Only the Address and Data
  321. registers are valid (An, Dn and SP), so special registers
  322. like SR, CCR, and USP are illegal here. The label assignment
  323. is permanent, so you cannot define the label anywhere else
  324. in the program. The register must not be a forward reference
  325. to another EQUR statement. But you can use labels previously
  326. defined by use of the EQUR directive.
  327.  
  328.  - REG
  329.  
  330. syntax: <label> REG <register list>
  331.  
  332. The REG directive assigns a value to the label, such that
  333. the assembler can translate the label into a register list
  334. mask format used in the MOVEM instruction.
  335.  
  336. <register list> is the form
  337.  
  338.    R1[-R2][/R3[-R4]]...
  339.  
  340. Where Rx is a data or address register (possibly defined by
  341. the EQUR directive) or a previously defined register list.
  342.  
  343.  - DC
  344.  
  345. syntax: [<label>] DC[.<size>] <list>
  346.  
  347. The DC directive defines a constant value in memory. It may
  348. have any number of operands, separated by commas. The
  349. values in the list must be capable of being held in the data
  350. location whose size is given by the size-specifier on the
  351. directive. If you do not give a size specifier, DC assumes 
  352. it is ".W". If the size is ".B", then there is one other
  353. data type that can be used: that of the ASCII string. This
  354. is an arbitrarily long series of ASCII characters, contained
  355. within single or double quotation marks. As with ASCII
  356. literals; if you require a quotation mark in the string,
  357. then you must enter two quotation marks. If the size is ".W"
  358. or ".L", then the assembler aligns the data onto a Word
  359. boundary.
  360.  
  361.  - DS
  362.  
  363. syntax: [<label>] DS[.<size>] <absexp>
  364.  
  365. To reserve memory locations, you use the DS directive. DS,
  366. however, does no initialization. The amount of space the
  367. assembler allocates depends on the data size (the size
  368. specifier of the directive), and the value of the expression
  369. in the operand field. The assembler interprets this as the
  370. number of data items of that size to allocate. As with DC,
  371. if the size specifier is ".W" or ".L", DS aligns the space
  372. to a word boundary. So, DS.W 0 has the effect of aligning
  373. to a word boundary only. If you do not give a size
  374. specifier, DS assumes a default of ".W".
  375.  
  376. See CNOP and EVEN for a more general way of handling
  377. alignment.
  378.  
  379.  - RS
  380.  
  381. syntax: [<label>] RS[.<size>] <absexp>
  382.  
  383. As the DS directive, except that this directive does not
  384. reserve any memory. This pseudop can be used to define a
  385. list of offsets. If a label is present it will be assigned
  386. the offset to the beginning of the list of offsets. How much
  387. a offset increases to from the last offset depends on the
  388. <size> (default ".W") and the value of the absolute
  389. expression in the operand field.
  390.  
  391. See also the DS directive.
  392.  
  393.  - RSSET
  394.  
  395. syntax: [<label>] RSSET <absexp>
  396.  
  397. Starts a list of offsets defined by the RS directive. The
  398. first offset, defined by RS, is assigned the value as given
  399. in <absexp>.
  400.  
  401.  - RSRESET
  402.  
  403. syntax: [<label>] RSRESET
  404.  
  405. Starts a list of offsets defined by the RS directive. The
  406. first offset, is assigned the absolute value zero.
  407.  
  408.  - LIST
  409.  
  410. syntax: LIST
  411.  
  412. The LIST directive tells the assembler to produce the
  413. assembly listing file. Listing continues until it encounters
  414. either an END or a NOLIST directive. The NOLIST directive
  415. has only effect when the assembler is producing a listing
  416. file. The LIST directive does not appear on the output
  417. listing.
  418.  
  419.  - NOLIST
  420.  
  421. syntax: NOLIST
  422.  
  423. The NOLIST directive turns off the production of the
  424. assembly listing file. Listing ceases until the assembler
  425. encounters either an END or a LIST directive. The NOLIST
  426. directive does not appear on the program listing.
  427.  
  428.  - MLIST
  429.  
  430. syntax: MLIST
  431.  
  432. Makes sure that expansions of macros are listed (unless
  433. NOLIST is active). This directive does not appear on the
  434. output listing.
  435.  
  436.  - NOMLIST
  437.  
  438. syntax: NOMLIST
  439.  
  440. Makes sure that expansions of macro are not listed. This
  441. directive does not appear on the output listing.
  442.  
  443.  
  444.  - CLIST
  445.  
  446. syntax: CLIST
  447.  
  448. If a condition of conditional assembly is not taken then the
  449. sourcecode that is not assembled will still be listed. A 'F'
  450. (= False) will be displayed in the listing. This directive
  451. does not appear on the output listing.
  452.  
  453.  - NOCLIST
  454.  
  455. syntax: NOCLIST
  456.  
  457. Makes sure that lines of code, that are not being assembled
  458. because of a false conditional, will not appear in the
  459. listing. This directive does not appear on the output
  460. listing.
  461.  
  462.  - PAGE
  463.  
  464. syntax: PAGE
  465.  
  466. PAGE advances the assembly listing to the top of the next
  467. page. Every page start with page-number, copyright
  468. announcement, version-number, and an user specified header.
  469. The PAGE  directive does not appear on the output listing.
  470.  
  471.  - NOPAGE
  472.  
  473. syntax: NOPAGE
  474.  
  475. The NOPAGE directive turns off the printing of page throws
  476. and title headers to the assembly listing. This directive
  477. does not appear on the output listing.
  478.  
  479.  - PLEN
  480.  
  481. syntax: PLEN <absexp>
  482.  
  483. The PLEN directive sets the page length, in lines, of the
  484. assembly listing file to the value you specified in the
  485. operand field. The value must lie between 20 and 200 and you
  486. can only set it once in the program. The default page length
  487. is 60 lines.
  488.  
  489.  - TTL
  490.  
  491. syntax: TTL <title string>
  492.  
  493. The TTL directive sets the title of the program to the
  494. string you gave in the operand field. This string appears as
  495. the page heading in the assembly listing. The string starts
  496. at the first nonblank character after the TTL, and continues
  497. until the end of line. It must not be longer than 60
  498. characters in length. The TTL directive does not appear on
  499. the program listing.
  500.  
  501.  -  FAIL
  502.  
  503. syntax: FAIL
  504.  
  505. The FAIL directive tells the assembler to flag an error for
  506. this input line. This directive together with conditional
  507. assembly can be used in macro expansions to test the number
  508. of actual parameters given to the macro call.
  509.  
  510.  - EVEN
  511.  
  512. syntax: [<label>] EVEN
  513.  
  514. Forces the next binary code to a word address (even)
  515. boundary (by inserting a 0-byte if necessarily). If the
  516. label field is present, then the assembler assigns the even
  517. value of the program counter to the label.
  518.  
  519.  - CNOP
  520.  
  521. syntax: [<label>] CNOP <number>,<number>
  522.  
  523. This directive is an extension from the Motorola standard
  524. and allows a section if code to be aligned on any boundary.
  525. In particular, it allows any data structure or entry point
  526. to be aligned to a long word boundary. The first expression
  527. represents an offset, while the second expression represents
  528. the alignment required for the base. The code is aligned to
  529. the specified offset from the nearest required alignment
  530. boundary. For instance CNOP 0,4 aligns code to the next long
  531. word boundary.
  532.  
  533.  - MACRO
  534.  
  535. syntax: <label> MACRO
  536.  
  537. MACRO introduces a macro definition. ENDM terminates a macro
  538. definition. You must provide a label, which the assembler
  539. uses as the name of the macro; subsequent uses of that label
  540. as an operand will expand the contents of the macro and
  541. insert it into the sourcecode. A macro can contain any
  542. opcode, most assembler directives, or any previously defined
  543. macro. Line numbers will not increase during macro
  544. expansion. If you use a macro name, you may append a number
  545. of arguments, separated by commas. If the argument contains
  546. a space or tab then you must enclose the entire argument
  547. within '<' and '>' symbols.
  548.  
  549. The assembler stores up and saves the sourcecode that you
  550. enter (after a MACRO directive and before an ENDM directive)
  551. as the contents of the macro. The code can contain normal
  552. sourcecode. In addition, it may contain system indexes and
  553. formal parameters. Formal parameters are the form "\X",
  554. where X (0-9) stands for the number of the actual parameter
  555. at the macro call. The "\0" takes a special place; this
  556. parameter takes the value of the size specifier. If an
  557. argument is omitted, at the macro call, than nothing is
  558. inserted for the formal parameter. A backslash followed by
  559. the symbol '@' tells the assembler to generate the next
  560. system index. This takes the form of "_nnn", where nnn is
  561. the number of times this macro has been expanded. This is
  562. normally used to generate unique labels within a macro.
  563.  
  564. You may not nest macro definitions, that is, you cannot
  565. define a macro within a macro, although you can call a macro
  566. you previously defined. There is a limit to the level of
  567. nesting of macro calls. This limit is set at 16.
  568.  
  569. Macro expansion stops when the assembler encounters the end
  570. of the stored macro text, or when it encounters a MEXIT
  571. directive.
  572.  
  573.  - NARG
  574.  
  575. syntax: NARG
  576.  
  577. The symbol NARG (Number of ARGuments) is a special reserved
  578. symbol and the assembler assigns it the index of the last
  579. argument passed to the macro in the parameter list (even
  580. nulls). Outside of a macro expansion, NARG has the value
  581. zero.
  582.  
  583.  - ENDM
  584.  
  585. syntax: ENDM
  586.  
  587. This terminates a macro definition introduced by a MACRO
  588. directive.
  589.  
  590.  - MEXIT
  591.  
  592. syntax: MEXIT
  593.  
  594. You use this directive to exit from macro expansion mode,
  595. usually in conjunction with the conditional assembly
  596. directives. It allows conditional expansion of macros.
  597.  
  598.  - XDEF
  599.  
  600. syntax: XDEF <label>[,<label>...]
  601.  
  602. One or more absolute or relocatable labels may follow the
  603. XDEF directive. Each label defined by XDEF generates an
  604. external symbol definition. You can make references to the
  605. symbol in other modules (possibly from a highlevel language)
  606. and satisfy the references with a linker. If you use this
  607. directive or XREF, then you cannot directly execute the code
  608. produced by the assembler.
  609.  
  610.  - XREF
  611.  
  612. syntax: XREF <label>[,<label>...]
  613.  
  614. One or more labels that must not have been defined elsewhere
  615. in the program follow the XREF directive. Subsequent uses of
  616. the label tell the assembler to generate an external
  617. reference for that label. You use the label as if it
  618. referred to an absolute or relocatable value depending on
  619. whether the matching XDEF referred to an absolute or
  620. relocatable symbol. The actual value used is filled in, from
  621. another module, by a linker.
  622.  
  623.  - INCDIR
  624.  
  625. syntax: INCDIR <path>[,<path>...]
  626.  
  627. This tells the assembler in what directories to search for
  628. the include files if it cannot find them in the current
  629. directory.
  630.  
  631.  - INCLUDE
  632.  
  633. syntax: INCLUDE <file name>
  634.  
  635. The INCLUDE directive allows the inclusion of external files
  636. into the program source. You set up the file that INCLUDE
  637. inserts with the string description in the operand field.
  638. You can nest INCLUDE directives up to a depth of 16 possibly
  639. inclosing the file name within quotes. INCLUDE is especially
  640. useful when you require a standard set of macro definitions
  641. or EQUs in several programs.
  642.  
  643. It is often convenient to place NOLIST and LIST directives
  644. at the head and tail of files you intend to include.
  645.  
  646.  - IDNT
  647.  
  648. syntax: IDNT <string>
  649.  
  650. A module can be given a name. If the linker finds two
  651. modules with the same name it combines both modules.
  652.  
  653.  
  654. 1.6.2 Conditional assembly.
  655.  
  656. Conditional assembly allows a part of the sourcecode to be
  657. assembled or not, depending on the condition given. Lines of code
  658. that will not be assembled are of no direct importance to the
  659. program. Therefore, the listing of not assembled lines of
  660. sourcecode can be turned off by using the NOCLIST directive. The
  661. CLIST directive turns the listing of these lines back on. The
  662. 'conditional assembly directives' all take the form of:
  663.      IFxx <operand>
  664.        <source code>
  665.      ENDC
  666.  
  667. The following 'conditional assembly directives' are supported:
  668.  
  669.  - IFC
  670.    IFNC
  671.  
  672. syntax: IFC <string>,<string>
  673.         IFNC <string>,<string>
  674.  
  675. The strings must be a series of ASCII characters optionally
  676. enclosed in single or double quotes, for example, 'WTG' or
  677. (the empty string). If the condition is not TRUE, assembly
  678. ceases (that is, it is disabled). Again the conditional
  679. assembly switch remains active until the assembler finds a
  680. matching ENDC statement.
  681.  
  682.  - IFD
  683.    IFND
  684.  
  685. syntax: IFD <symbol name> 
  686.         IFND <symbol name>
  687.  
  688. Depending on whether or not you have already defined the
  689. symbol, the assembler enables or disables assembly until it
  690. finds the matching ENDC.
  691.  
  692.  - IFEQ, IFNE, IFGT, IFGE, IFLT and IFLE
  693.  
  694. syntax: IFxx <absexp>
  695.  
  696. Lines of sourcecode following the condition will be
  697. assembled if <absexp> ==0 (IFEQ), <>0 (IFNE), >0 (IFGT), >=0
  698. (IFGE), <0 (IFLT) or <=0 (IFLE).
  699.  
  700.  - ENDC
  701.  
  702. syntax: ENDC
  703.  
  704. To terminate a conditional assembly, you use the ENDC
  705. directive, set up with any of the ten IFxx directive above.
  706. ENDC matches the most recently encountered condition
  707. directive.
  708.