]> git.sur5r.net Git - cc65/blob - doc/ca65.sgml
278a81d1bef9ca1ce780203e7e7d12ba11e7e065
[cc65] / doc / ca65.sgml
1 <!doctype linuxdoc system>      <!-- -*- text-mode -*- -->
2
3 <article>
4 <title>ca65 Users Guide
5 <author><url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">
6 <date>2015-08-01
7
8 <abstract>
9 ca65 is a powerful macro assembler for the 6502, 65C02, and 65816 CPUs. It is
10 used as a companion assembler for the cc65 crosscompiler, but it may also be
11 used as a standalone product.
12 </abstract>
13
14 <!-- Table of contents -->
15 <toc>
16
17 <!-- Begin the document -->
18
19 <sect>Overview<p>
20
21 ca65 is a replacement for the ra65 assembler that was part of the cc65 C
22 compiler, originally developed by John R. Dunning. I had some problems with
23 ra65 and the copyright does not permit some things which I wanted to be
24 possible, so I decided to write a completely new assembler/linker/archiver
25 suite for the cc65 compiler. ca65 is part of this suite.
26
27 Some parts of the assembler (code generation and some routines for symbol
28 table handling) are taken from an older crossassembler named a816 written
29 by me a long time ago.
30
31
32 <sect1>Design criteria<p>
33
34 Here's a list of the design criteria, that I considered important for the
35 development:
36
37 <itemize>
38
39 <item>  The assembler must support macros. Macros are not essential, but they
40         make some things easier, especially when you use the assembler in the
41         backend of a compiler.
42 <item>  The assembler must support the newer 65C02 and 65816 CPUs. I have been
43         thinking about a 65816 backend for the C compiler, and even my old
44         a816 assembler had support for these CPUs, so this wasn't really a
45         problem.
46 <item>  The assembler must produce relocatable code. This is necessary for the
47         compiler support, and it is more convenient.
48 <item>  Conditional assembly must be supported. This is a must for bigger
49         projects written in assembler (like Elite128).
50 <item>  The assembler must support segments, and it must support more than
51         three segments (this is the count, most other assemblers support).
52         Having more than one code segments helps developing code for systems
53         with a divided ROM area (like the C64).
54 <item>  The linker must be able to resolve arbitrary expressions. It should
55         be able to get things like
56 <tscreen><verb>
57         .import S1, S2
58         .export Special
59         Special = 2*S1 + S2/7
60 </verb></tscreen>
61         right.
62 <item>  True lexical nesting for symbols. This is very convenient for larger
63         assembly projects.
64 <item>  "Cheap" local symbols without lexical nesting for those quick, late
65         night hacks.
66 <item>  I liked the idea of "options" as Anre Fachats .o65 format has it, so I
67         introduced the concept into the object file format use by the new cc65
68         binutils.
69 <item>  The assembler will be a one pass assembler. There was no real need for
70         this decision, but I've written several multipass assemblers, and it
71         started to get boring. A one pass assembler needs much more elaborated
72         data structures, and because of that it's much more fun:-)
73 <item>  Non-GPLed code that may be used in any project without restrictions or
74         fear of "GPL infecting" other code.
75 </itemize>
76 <p>
77
78
79 <sect>Usage<p>
80
81
82 <sect1>Command line option overview<p>
83
84 The assembler accepts the following options:
85
86 <tscreen><verb>
87 ---------------------------------------------------------------------------
88 Usage: ca65 [options] file
89 Short options:
90   -D name[=value]               Define a symbol
91   -I dir                        Set an include directory search path
92   -U                            Mark unresolved symbols as import
93   -V                            Print the assembler version
94   -W n                          Set warning level n
95   -d                            Debug mode
96   -g                            Add debug info to object file
97   -h                            Help (this text)
98   -i                            Ignore case of symbols
99   -l name                       Create a listing file if assembly was ok
100   -mm model                     Set the memory model
101   -o name                       Name the output file
102   -s                            Enable smart mode
103   -t sys                        Set the target system
104   -v                            Increase verbosity
105
106 Long options:
107   --auto-import                 Mark unresolved symbols as import
108   --bin-include-dir dir         Set a search path for binary includes
109   --cpu type                    Set cpu type
110   --create-dep name             Create a make dependency file
111   --create-full-dep name        Create a full make dependency file
112   --debug                       Debug mode
113   --debug-info                  Add debug info to object file
114   --feature name                Set an emulation feature
115   --help                        Help (this text)
116   --ignore-case                 Ignore case of symbols
117   --include-dir dir             Set an include directory search path
118   --large-alignment             Don't warn about large alignments
119   --listing name                Create a listing file if assembly was ok
120   --list-bytes n                Maximum number of bytes per listing line
121   --memory-model model          Set the memory model
122   --pagelength n                Set the page length for the listing
123   --relax-checks                Relax some checks (see docs)
124   --smart                       Enable smart mode
125   --target sys                  Set the target system
126   --verbose                     Increase verbosity
127   --version                     Print the assembler version
128 ---------------------------------------------------------------------------
129 </verb></tscreen>
130
131
132 <sect1>Command line options in detail<p>
133
134 Here is a description of all the command line options:
135
136 <descrip>
137
138   <label id="option--bin-include-dir">
139   <tag><tt>--bin-include-dir dir</tt></tag>
140
141   Name a directory which is searched for binary include files. The option
142   may be used more than once to specify more than one directory to search. The
143   current directory is always searched first before considering any
144   additional directories. See also the section about <ref id="search-paths"
145   name="search paths">.
146
147
148   <label id="option--cpu">
149   <tag><tt>--cpu type</tt></tag>
150
151   Set the default for the CPU type. The option takes a parameter, which
152   may be one of
153
154         6502, 65SC02, 65C02, 65816, sweet16, HuC6280
155
156
157   <label id="option-create-dep">
158   <tag><tt>--create-dep name</tt></tag>
159
160   Tells the assembler to generate a file containing the dependency list for
161   the assembled module in makefile syntax. The output is written to a file
162   with the given name. The output does not include files passed via debug
163   information to the assembler.
164
165
166   <label id="option-create-full-dep">
167   <tag><tt>--create-full-dep name</tt></tag>
168
169   Tells the assembler to generate a file containing the dependency list for
170   the assembled module in makefile syntax. The output is written to a file
171   with the given name. The output does include files passed via debug
172   information to the assembler.
173
174
175   <tag><tt>-d, --debug</tt></tag>
176
177   Enables debug mode, something that should not be needed for mere
178   mortals:-)
179
180
181   <label id="option--feature">
182   <tag><tt>--feature name</tt></tag>
183
184   Enable an emulation feature. This is identical as using <tt/.FEATURE/
185   in the source with two exceptions: Feature names must be lower case, and
186   each feature must be specified by using an extra <tt/--feature/ option,
187   comma separated lists are not allowed.
188
189   See the discussion of the <tt><ref id=".FEATURE" name=".FEATURE"></tt>
190   command for a list of emulation features.
191
192
193   <label id="option-g">
194   <tag><tt>-g, --debug-info</tt></tag>
195
196   When this option (or the equivalent control command <tt/.DEBUGINFO/) is
197   used, the assembler will add a section to the object file that contains
198   all symbols (including local ones) together with the symbol values and
199   source file positions. The linker will put these additional symbols into
200   the VICE label file, so even local symbols can be seen in the VICE
201   monitor.
202
203
204   <label id="option-h">
205   <tag><tt>-h, --help</tt></tag>
206
207   Print the short option summary shown above.
208
209
210   <label id="option-i">
211   <tag><tt>-i, --ignore-case</tt></tag>
212
213   This option makes the assembler case insensitive on identifiers and labels.
214   This option will override the default, but may itself be overridden by the
215   <tt><ref id=".CASE" name=".CASE"></tt> control command.
216
217
218   <label id="option-l">
219   <tag><tt>-l name, --listing name</tt></tag>
220
221   Generate an assembler listing with the given name. A listing file will
222   never be generated in case of assembly errors.
223
224
225   <label id="option--large-alignment">
226   <tag><tt>--large-alignment</tt></tag>
227
228   Disable warnings about a large combined alignment. See the discussion of the
229   <tt><ref id=".ALIGN" name=".ALIGN"></tt> directive for futher information.
230
231
232   <label id="option--list-bytes">
233   <tag><tt>--list-bytes n</tt></tag>
234
235   Set the maximum number of bytes printed in the listing for one line of
236   input. See the <tt><ref id=".LISTBYTES" name=".LISTBYTES"></tt> directive
237   for more information. The value zero can be used to encode an unlimited
238   number of printed bytes.
239
240
241   <label id="option-mm">
242   <tag><tt>-mm model, --memory-model model</tt></tag>
243
244   Define the default memory model. Possible model specifiers are near, far and
245   huge.
246
247
248   <label id="option-o">
249   <tag><tt>-o name</tt></tag>
250
251   The default output name is the name of the input file with the extension
252   replaced by ".o". If you don't like that, you may give another name with
253   the -o option. The output file will be placed in the same directory as
254   the source file, or, if -o is given, the full path in this name is used.
255
256
257   <label id="option--pagelength">
258   <tag><tt>--pagelength n</tt></tag>
259
260   sets the length of a listing page in lines. See the <tt><ref
261   id=".PAGELENGTH" name=".PAGELENGTH"></tt> directive for more information.
262
263
264   <label id="option--relax-checks">
265   <tag><tt>--relax-checks</tt></tag>
266
267   Relax some checks done by the assembler. This will allow code that is an
268   error in most cases and flagged as such by the assembler, but can be valid
269   in special situations.
270
271   Examples are:
272 <itemize>
273 <item>Short branches between two different segments.
274 <item>Byte sized address loads where the address is not a zeropage address.
275 </itemize>
276
277
278   <label id="option-s">
279   <tag><tt>-s, --smart-mode</tt></tag>
280
281   In smart mode (enabled by -s or the <tt><ref id=".SMART" name=".SMART"></tt>
282   pseudo instruction) the assembler will track usage of the <tt/REP/ and
283   <tt/SEP/ instructions in 65816 mode and update the operand sizes
284   accordingly. If the operand of such an instruction cannot be evaluated by
285   the assembler (for example, because the operand is an imported symbol), a
286   warning is issued.
287
288   Beware: Since the assembler cannot trace the execution flow this may
289   lead to false results in some cases. If in doubt, use the .ixx and .axx
290   instructions to tell the assembler about the current settings. Smart
291   mode is off by default.
292
293
294   <label id="option-t">
295   <tag><tt>-t sys, --target sys</tt></tag>
296
297   Set the target system. This will enable translation of character strings and
298   character constants into the character set of the target platform. The
299   default for the target system is "none", which means that no translation
300   will take place. The assembler supports the same target systems as the
301   compiler, see there for a list.
302
303   Depending on the target, the default CPU type is also set. This can be
304   overriden by using the <tt/<ref id="option--cpu" name="--cpu">/ option.
305
306
307   <label id="option-v">
308   <tag><tt>-v, --verbose</tt></tag>
309
310   Increase the assembler verbosity. Usually only needed for debugging
311   purposes. You may use this option more than one time for even more
312   verbose output.
313
314
315   <label id="option-D">
316   <tag><tt>-D</tt></tag>
317
318   This option allows you to define symbols on the command line. Without a
319   value, the symbol is defined with the value zero. When giving a value,
320   you may use the '&dollar;' prefix for hexadecimal symbols. Please note
321   that for some operating systems, '&dollar;' has a special meaning, so
322   you may have to quote the expression.
323
324
325   <label id="option-I">
326   <tag><tt>-I dir, --include-dir dir</tt></tag>
327
328   Name a directory which is searched for include files. The option may be
329   used more than once to specify more than one directory to search. The
330   current directory is always searched first before considering any
331   additional directories. See also the section about <ref id="search-paths"
332   name="search paths">.
333
334
335   <label id="option-U">
336   <tag><tt>-U, --auto-import</tt></tag>
337
338   Mark symbols that are not defined in the sources as imported symbols. This
339   should be used with care since it delays error messages about typos and such
340   until the linker is run. The compiler uses the equivalent of this switch
341   (<tt><ref id=".AUTOIMPORT" name=".AUTOIMPORT"></tt>) to enable auto imported
342   symbols for the runtime library. However, the compiler is supposed to
343   generate code that runs through the assembler without problems, something
344   which is not always true for assembler programmers.
345
346
347   <label id="option-V">
348   <tag><tt>-V, --version</tt></tag>
349
350   Print the version number of the assembler. If you send any suggestions
351   or bugfixes, please include the version number.
352
353
354   <label id="option-W">
355   <tag><tt>-Wn</tt></tag>
356
357   Set the warning level for the assembler. Using -W2 the assembler will
358   even warn about such things like unused imported symbols. The default
359   warning level is 1, and it would probably be silly to set it to
360   something lower.
361
362 </descrip>
363 <p>
364
365
366
367 <sect>Search paths<label id="search-paths"><p>
368
369 Normal include files are searched in the following places:
370
371 <enum>
372 <item>The current file's directory.
373 <item>Any directory added with the <tt/<ref id="option-I" name="-I">/ option
374 on the command line.
375 <item>The value of the environment variable <tt/CA65_INC/ if it is defined.
376 <item>A subdirectory named <tt/asminc/ of the directory defined in the
377       environment variable <tt/CC65_HOME/, if it is defined.
378 <item>An optionally compiled-in directory.
379 </enum>
380
381 Binary include files are searched in the following places:
382
383 <enum>
384 <item>The current file's directory.
385 <item>Any directory added with the <tt/<ref id="option--bin-include-dir"
386 name="--bin-include-dir">/ option on the command line.
387 </enum>
388
389
390
391 <sect>Input format<p>
392
393 <sect1>Assembler syntax<p>
394
395 The assembler accepts the standard 6502/65816 assembler syntax. One line may
396 contain a label (which is identified by a colon), and, in addition to the
397 label, an assembler mnemonic, a macro, or a control command (see section <ref
398 id="control-commands" name="Control Commands"> for supported control
399 commands). Alternatively, the line may contain a symbol definition using
400 the '=' token. Everything after a semicolon is handled as a comment (that is,
401 it is ignored).
402
403 Here are some examples for valid input lines:
404
405 <tscreen><verb>
406         Label:                          ; A label and a comment
407                 lda     #$20            ; A 6502 instruction plus comment
408         L1:     ldx     #$20            ; Same with label
409         L2:     .byte   "Hello world"   ; Label plus control command
410                 mymac   $20             ; Macro expansion
411                 MySym = 3*L1            ; Symbol definition
412         MaSym   = Label                 ; Another symbol
413 </verb></tscreen>
414
415 The assembler accepts
416
417 <itemize>
418 <item>all valid 6502 mnemonics when in 6502 mode (the default or after the
419       <tt><ref id=".P02" name=".P02"></tt> command was given).
420 <item>all valid 6502 mnemonics plus a set of illegal instructions when in
421       <ref id="6502X-mode" name="6502X mode">.
422 <item>all valid 65SC02 mnemonics when in 65SC02 mode (after the
423       <tt><ref id=".PSC02" name=".PSC02"></tt> command was given).
424 <item>all valid 65C02 mnemonics when in 65C02 mode (after the
425       <tt><ref id=".PC02" name=".PC02"></tt> command was given).
426 <item>all valid 65618 mnemonics when in 65816 mode (after the
427       <tt><ref id=".P816" name=".P816"></tt> command was given).
428 </itemize>
429
430
431 <sect1>65816 mode<p>
432
433 In 65816 mode, several aliases are accepted, in addition to the official
434 mnemonics:
435
436 <tscreen><verb>
437 CPA is an alias for CMP
438 DEA is an alias for DEC A
439 INA is an alias for INC A
440 SWA is an alias for XBA
441 TAD is an alias for TCD
442 TAS is an alias for TCS
443 TDA is an alias for TDC
444 TSA is an alias for TSC
445 </verb></tscreen>
446
447
448 <sect1>6502X mode<label id="6502X-mode"><p>
449
450 6502X mode is an extension to the normal 6502 mode. In this mode, several
451 mnemonics for illegal instructions of the NMOS 6502 CPUs are accepted. Since
452 these instructions are illegal, there are no official mnemonics for them. The
453 unofficial ones are taken from <url
454 url="http://www.oxyron.de/html/opcodes02.html">. Please note that only the
455 ones marked as "stable" are supported. The following table uses information
456 from the mentioned web page, for more information, see there.
457
458 <itemize>
459 <item><tt>ALR: A:=(A and #{imm})/2;</tt>
460 <item><tt>ANC: A:=A and #{imm};</tt> Generates opcode &dollar;0B.
461 <item><tt>ARR: A:=(A and #{imm})/2;</tt>
462 <item><tt>AXS: X:=A and X-#{imm};</tt>
463 <item><tt>DCP: {adr}:={adr}-1; A-{adr};</tt>
464 <item><tt>ISC: {adr}:={adr}+1; A:=A-{adr};</tt>
465 <item><tt>LAS: A,X,S:={adr} and S;</tt>
466 <item><tt>LAX: A,X:={adr};</tt>
467 <item><tt>RLA: {adr}:={adr}rol; A:=A and {adr};</tt>
468 <item><tt>RRA: {adr}:={adr}ror; A:=A adc {adr};</tt>
469 <item><tt>SAX: {adr}:=A and X;</tt>
470 <item><tt>SLO: {adr}:={adr}*2; A:=A or {adr};</tt>
471 <item><tt>SRE: {adr}:={adr}/2; A:=A xor {adr};</tt>
472 </itemize>
473
474
475
476 <sect1>sweet16 mode<label id="sweet16-mode"><p>
477
478 SWEET 16 is an interpreter for a pseudo 16 bit CPU written by Steve Wozniak
479 for the Apple ][ machines. It is available in the Apple ][ ROM. ca65 can
480 generate code for this pseudo CPU when switched into sweet16 mode. The
481 following is special in sweet16 mode:
482
483 <itemize>
484
485 <item>The '@' character denotes indirect addressing and is no longer available
486 for cheap local labels. If you need cheap local labels, you will have to
487 switch to another lead character using the <tt/<ref id=".LOCALCHAR"
488 name=".LOCALCHAR">/ command.
489
490 <item>Registers are specified using <tt/R0/ .. <tt/R15/. In sweet16 mode,
491 these identifiers are reserved words.
492
493 </itemize>
494
495 Please note that the assembler does neither supply the interpreter needed for
496 SWEET 16 code, nor the zero page locations needed for the SWEET 16 registers,
497 nor does it call the interpreter. All this must be done by your program. Apple
498 ][ programmers do probably know how to use sweet16 mode.
499
500 For more information about SWEET 16, see
501 <url url="http://www.6502.org/source/interpreters/sweet16.htm">.
502
503
504 <sect1>Number format<p>
505
506 For literal values, the assembler accepts the widely used number formats: A
507 preceding '&dollar;' or a trailing 'h' denotes a hex value, a preceding '%'
508 denotes a binary value, and a bare number is interpreted as a decimal. There
509 are currently no octal values and no floats.
510
511
512 <sect1>Conditional assembly<p>
513
514 Please note that when using the conditional directives (<tt/.IF/ and friends),
515 the input must consist of valid assembler tokens, even in <tt/.IF/ branches
516 that are not assembled. The reason for this behaviour is that the assembler
517 must still be able to detect the ending tokens (like <tt/.ENDIF/), so
518 conversion of the input stream into tokens still takes place. As a consequence
519 conditional assembly directives may <bf/not/ be used to prevent normal text
520 (used as a comment or similar) from being assembled. <p>
521
522
523 <sect>Expressions<p>
524
525
526 <sect1>Expression evaluation<p>
527
528 All expressions are evaluated with (at least) 32 bit precision. An
529 expression may contain constant values and any combination of internal and
530 external symbols. Expressions that cannot be evaluated at assembly time
531 are stored inside the object file for evaluation by the linker.
532 Expressions referencing imported symbols must always be evaluated by the
533 linker.
534
535
536 <sect1>Size of an expression result<p>
537
538 Sometimes, the assembler must know about the size of the value that is the
539 result of an expression. This is usually the case, if a decision has to be
540 made, to generate a zero page or an absolute memory references. In this
541 case, the assembler has to make some assumptions about the result of an
542 expression:
543
544 <itemize>
545 <item>  If the result of an expression is constant, the actual value is
546         checked to see if it's a byte sized expression or not.
547 <item>  If the expression is explicitly casted to a byte sized expression by
548         one of the '&gt;', '&lt;' or '^' operators, it is a byte expression.
549 <item>  If this is not the case, and the expression contains a symbol,
550         explicitly declared as zero page symbol (by one of the .importzp or
551         .exportzp instructions), then the whole expression is assumed to be
552         byte sized.
553 <item>  If the expression contains symbols that are not defined, and these
554         symbols are local symbols, the enclosing scopes are searched for a
555         symbol with the same name. If one exists and this symbol is defined,
556         its attributes are used to determine the result size.
557 <item>  In all other cases the expression is assumed to be word sized.
558 </itemize>
559
560 Note: If the assembler is not able to evaluate the expression at assembly
561 time, the linker will evaluate it and check for range errors as soon as
562 the result is known.
563
564
565 <sect1>Boolean expressions<p>
566
567 In the context of a boolean expression, any non zero value is evaluated as
568 true, any other value to false. The result of a boolean expression is 1 if
569 it's true, and zero if it's false. There are boolean operators with extreme
570 low precedence with version 2.x (where x &gt; 0). The <tt/.AND/ and <tt/.OR/
571 operators are shortcut operators. That is, if the result of the expression is
572 already known, after evaluating the left hand side, the right hand side is
573 not evaluated.
574
575
576 <sect1>Constant expressions<p>
577
578 Sometimes an expression must evaluate to a constant without looking at any
579 further input. One such example is the <tt/<ref id=".IF" name=".IF">/ command
580 that decides if parts of the code are assembled or not. An expression used in
581 the <tt/.IF/ command cannot reference a symbol defined later, because the
582 decision about the <tt/.IF/ must be made at the point when it is read. If the
583 expression used in such a context contains only constant numerical values,
584 there is no problem. When unresolvable symbols are involved it may get harder
585 for the assembler to determine if the expression is actually constant, and it
586 is even possible to create expressions that aren't recognized as constant.
587 Simplifying the expressions will often help.
588
589 In cases where the result of the expression is not needed immediately, the
590 assembler will delay evaluation until all input is read, at which point all
591 symbols are known. So using arbitrary complex constant expressions is no
592 problem in most cases.
593
594
595
596 <sect1>Available operators<label id="operators"><p>
597
598 <table>
599 <tabular ca="clc">
600 <bf/Operator/| <bf/Description/| <bf/Precedence/@<hline>
601 | Built-in string functions| 0@
602 ||~@
603 | Built-in pseudo-variables| 1@
604 | Built-in pseudo-functions| 1@
605 +| Unary positive| 1@
606 -| Unary negative| 1@
607 &tilde;<newline>
608 .BITNOT| Unary bitwise not| 1@
609 &lt;<newline>
610 .LOBYTE| Unary low-byte operator| 1@
611 &gt;<newline>
612 .HIBYTE| Unary high-byte operator| 1@
613 ^<newline>
614 .BANKBYTE| Unary bank-byte operator| 1@
615 ||~@
616 *| Multiplication| 2@
617 /| Division| 2@
618 .MOD| Modulo operator| 2@
619 &amp;<newline>
620 .BITAND| Bitwise and| 2@
621 ^<newline>
622 .BITXOR| Binary bitwise xor| 2@
623 &lt;&lt;<newline>
624 .SHL| Shift-left operator| 2@
625 &gt;&gt;<newline>
626 .SHR| Shift-right operator| 2@
627 ||~@
628 +| Binary addition| 3@
629 -| Binary subtraction| 3@
630 &verbar;<newline>
631 .BITOR| Bitwise or| 3@
632 ||~@
633 = | Compare operator (equal)| 4@
634 &lt;&gt;| Compare operator (not equal)| 4@
635 &lt;| Compare operator (less)| 4@
636 &gt;| Compare operator (greater)| 4@
637 &lt;=| Compare operator (less or equal)| 4@
638 &gt;=| Compare operator (greater or equal)| 4@
639 ||~@
640 &amp;&amp;<newline>
641 .AND| Boolean and| 5@
642 .XOR| Boolean xor| 5@
643 ||~@
644 &verbar;&verbar;<newline>
645 .OR| Boolean or| 6@
646 ||~@
647 !<newline>
648 .NOT| Boolean not| 7@<hline>
649 </tabular>
650 <caption>Available operators, sorted by precedence
651 </table>
652
653 To force a specific order of evaluation, parentheses may be used, as usual.
654
655
656
657 <sect>Symbols and labels<p>
658
659 A symbol or label is an identifier that starts with a letter and is followed
660 by letters and digits. Depending on some features enabled (see
661 <tt><ref id="at_in_identifiers" name="at_in_identifiers"></tt>,
662 <tt><ref id="dollar_in_identifiers" name="dollar_in_identifiers"></tt> and
663 <tt><ref id="leading_dot_in_identifiers" name="leading_dot_in_identifiers"></tt>)
664 other characters may be present. Use of identifiers consisting of a single
665 character will not work in all cases, because some of these identifiers are
666 reserved keywords (for example "A" is not a valid identifier for a label,
667 because it is the keyword for the accumulator).
668
669 The assembler allows you to use symbols instead of naked values to make
670 the source more readable. There are a lot of different ways to define and
671 use symbols and labels, giving a lot of flexibility.
672
673 <sect1>Numeric constants<p>
674
675 Numeric constants are defined using the equal sign or the label assignment
676 operator. After doing
677
678 <tscreen><verb>
679         two = 2
680 </verb></tscreen>
681
682 may use the symbol "two" in every place where a number is expected, and it is
683 evaluated to the value 2 in this context. The label assignment operator is
684 almost identical, but causes the symbol to be marked as a label, so it may be
685 handled differently in a debugger:
686
687 <tscreen><verb>
688         io := $d000
689 </verb></tscreen>
690
691 The right side can of course be an expression:
692
693 <tscreen><verb>
694         four = two * two
695 </verb></tscreen>
696
697
698 <label id="variables">
699 <sect1>Numeric variables<p>
700
701 Within macros and other control structures (<tt><ref id=".REPEAT"
702 name=".REPEAT"></tt>, ...) it is sometimes useful to have some sort of
703 variable. This can be achieved by the <tt>.SET</tt> operator. It creates a
704 symbol that may get assigned a different value later:
705
706 <tscreen><verb>
707         four .set 4
708         lda     #four           ; Loads 4 into A
709         four .set 3
710         lda     #four           ; Loads 3 into A
711 </verb></tscreen>
712
713 Since the value of the symbol can change later, it must be possible to
714 evaluate it when used (no delayed evaluation as with normal symbols). So the
715 expression used as the value must be constant.
716
717 Following is an example for a macro that generates a different label each time
718 it is used. It uses the <tt><ref id=".SPRINTF" name=".SPRINTF"></tt> function
719 and a numeric variable named <tt>lcount</tt>.
720
721 <tscreen><verb>
722         .lcount .set 0          ; Initialize the counter
723
724         .macro  genlab
725                 .ident (.sprintf ("L%04X", lcount)):
726                 lcount .set lcount + 1
727         .endmacro
728 </verb></tscreen>
729
730
731 <sect1>Standard labels<p>
732
733 A label is defined by writing the name of the label at the start of the line
734 (before any instruction mnemonic, macro or pseudo directive), followed by a
735 colon. This will declare a symbol with the given name and the value of the
736 current program counter.
737
738
739 <sect1>Local labels and symbols<p>
740
741 Using the <tt><ref id=".PROC" name=".PROC"></tt> directive, it is possible to
742 create regions of code where the names of labels and symbols are local to this
743 region. They are not known outside of this region and cannot be accessed from
744 there. Such regions may be nested like PROCEDUREs in Pascal.
745
746 See the description of the <tt><ref id=".PROC" name=".PROC"></tt>
747 directive for more information.
748
749
750 <sect1>Cheap local labels<p>
751
752 Cheap local labels are defined like standard labels, but the name of the
753 label must begin with a special symbol (usually '@', but this can be
754 changed by the <tt><ref id=".LOCALCHAR" name=".LOCALCHAR"></tt>
755 directive).
756
757 Cheap local labels are visible only between two non cheap labels. As soon as a
758 standard symbol is encountered (this may also be a local symbol if inside a
759 region defined with the <tt><ref id=".PROC" name=".PROC"></tt> directive), the
760 cheap local symbol goes out of scope.
761
762 You may use cheap local labels as an easy way to reuse common label
763 names like "Loop". Here is an example:
764
765 <tscreen><verb>
766         Clear:  lda    #$00             ; Global label
767                 ldy    #$20
768         @Loop:  sta    Mem,y            ; Local label
769                 dey
770                 bne    @Loop            ; Ok
771                 rts
772         Sub:    ...                     ; New global label
773                 bne    @Loop            ; ERROR: Unknown identifier!
774 </verb></tscreen>
775
776 <sect1>Unnamed labels<p>
777
778 If you really want to write messy code, there are also unnamed labels. These
779 labels do not have a name (you guessed that already, didn't you?). A colon is
780 used to mark the absence of the name.
781
782 Unnamed labels may be accessed by using the colon plus several minus or plus
783 characters as a label designator. Using the '-' characters will create a back
784 reference (use the n'th label backwards), using '+' will create a forward
785 reference (use the n'th label in forward direction). An example will help to
786 understand this:
787
788 <tscreen><verb>
789         :       lda     (ptr1),y        ; #1
790                 cmp     (ptr2),y
791                 bne     :+              ; -> #2
792                 tax
793                 beq     :+++            ; -> #4
794                 iny
795                 bne     :-              ; -> #1
796                 inc     ptr1+1
797                 inc     ptr2+1
798                 bne     :-              ; -> #1
799
800         :       bcs     :+              ; #2 -> #3
801                 ldx     #$FF
802                 rts
803
804         :       ldx     #$01            ; #3
805         :       rts                     ; #4
806 </verb></tscreen>
807
808 As you can see from the example, unnamed labels will make even short
809 sections of code hard to understand, because you have to count labels
810 to find branch targets (this is the reason why I for my part do
811 prefer the "cheap" local labels). Nevertheless, unnamed labels are
812 convenient in some situations, so it's your decision.
813
814 <em/Note:/ <ref id="scopes" name="Scopes"> organize named symbols, not
815 unnamed ones, so scopes don't have an effect on unnamed labels.
816
817
818
819 <sect1>Using macros to define labels and constants<p>
820
821 While there are drawbacks with this approach, it may be handy in a few rare
822 situations. Using <tt><ref id=".DEFINE" name=".DEFINE"></tt>, it is possible
823 to define symbols or constants that may be used elsewhere. One of the
824 advantages is that you can use it to define string constants (this is not
825 possible with the other symbol types).
826
827 Please note: <tt/.DEFINE/ style macros do token replacements on a low level,
828 so the names do not adhere to scoping, diagnostics may be misleading, there
829 are no symbols to look up in the map file, and there is no debug info.
830 Especially the first problem in the list can lead to very nasty programming
831 errors. Because of these problems, the general advice is, <bf/NOT/ do use
832 <tt/.DEFINE/ if you don't have to.
833
834 Example:
835
836 <tscreen><verb>
837         .DEFINE two     2
838         .DEFINE version "SOS V2.3"
839
840         four = two * two        ; Ok
841         .byte   version         ; Ok
842
843         .PROC                   ; Start local scope
844         two = 3                 ; Will give "2 = 3" - invalid!
845         .ENDPROC
846 </verb></tscreen>
847
848
849 <sect1>Symbols and <tt>.DEBUGINFO</tt><p>
850
851 If <tt><ref id=".DEBUGINFO" name=".DEBUGINFO"></tt> is enabled (or <ref
852 id="option-g" name="-g"> is given on the command line), global, local and
853 cheap local labels are written to the object file and will be available in the
854 symbol file via the linker. Unnamed labels are not written to the object file,
855 because they don't have a name which would allow to access them.
856
857
858
859 <sect>Scopes<label id="scopes"><p>
860
861 ca65 implements several sorts of scopes for symbols.
862
863 <sect1>Global scope<p>
864
865 All (non cheap local) symbols that are declared outside of any nested scopes
866 are in global scope.
867
868
869 <sect1>Cheap locals<p>
870
871 A special scope is the scope for cheap local symbols. It lasts from one non
872 local symbol to the next one, without any provisions made by the programmer.
873 All other scopes differ in usage but use the same concept internally.
874
875
876 <sect1>Generic nested scopes<p>
877
878 A nested scoped for generic use is started with <tt/<ref id=".SCOPE"
879 name=".SCOPE">/ and closed with <tt/<ref id=".ENDSCOPE" name=".ENDSCOPE">/.
880 The scope can have a name, in which case it is accessible from the outside by
881 using <ref id="scopesyntax" name="explicit scopes">. If the scope does not
882 have a name, all symbols created within the scope are local to the scope, and
883 aren't accessible from the outside.
884
885 A nested scope can access symbols from the local or from enclosing scopes by
886 name without using explicit scope names. In some cases there may be
887 ambiguities, for example if there is a reference to a local symbol that is not
888 yet defined, but a symbol with the same name exists in outer scopes:
889
890 <tscreen><verb>
891         .scope  outer
892                 foo     = 2
893                 .scope  inner
894                         lda     #foo
895                         foo     = 3
896                 .endscope
897         .endscope
898 </verb></tscreen>
899
900 In the example above, the <tt/lda/ instruction will load the value 3 into the
901 accumulator, because <tt/foo/ is redefined in the scope. However:
902
903 <tscreen><verb>
904         .scope  outer
905                 foo     = $1234
906                 .scope  inner
907                         lda     foo,x
908                         foo     = $12
909                 .endscope
910         .endscope
911 </verb></tscreen>
912
913 Here, <tt/lda/ will still load from <tt/$12,x/, but since it is unknown to the
914 assembler that <tt/foo/ is a zeropage symbol when translating the instruction,
915 absolute mode is used instead. In fact, the assembler will not use absolute
916 mode by default, but it will search through the enclosing scopes for a symbol
917 with the given name. If one is found, the address size of this symbol is used.
918 This may lead to errors:
919
920 <tscreen><verb>
921         .scope  outer
922                 foo     = $12
923                 .scope  inner
924                         lda     foo,x
925                         foo     = $1234
926                 .endscope
927         .endscope
928 </verb></tscreen>
929
930 In this case, when the assembler sees the symbol <tt/foo/ in the <tt/lda/
931 instruction, it will search for an already defined symbol <tt/foo/. It will
932 find <tt/foo/ in scope <tt/outer/, and a close look reveals that it is a
933 zeropage symbol. So the assembler will use zeropage addressing mode. If
934 <tt/foo/ is redefined later in scope <tt/inner/, the assembler tries to change
935 the address in the <tt/lda/ instruction already translated, but since the new
936 value needs absolute addressing mode, this fails, and an error message "Range
937 error" is output.
938
939 Of course the most simple solution for the problem is to move the definition
940 of <tt/foo/ in scope <tt/inner/ upwards, so it precedes its use. There may be
941 rare cases when this cannot be done. In these cases, you can use one of the
942 address size override operators:
943
944 <tscreen><verb>
945         .scope  outer
946                 foo     = $12
947                 .scope  inner
948                         lda     a:foo,x
949                         foo     = $1234
950                 .endscope
951         .endscope
952 </verb></tscreen>
953
954 This will cause the <tt/lda/ instruction to be translated using absolute
955 addressing mode, which means changing the symbol reference later does not
956 cause any errors.
957
958
959 <sect1>Nested procedures<p>
960
961 A nested procedure is created by use of <tt/<ref id=".PROC" name=".PROC">/. It
962 differs from a <tt/<ref id=".SCOPE" name=".SCOPE">/ in that it must have a
963 name, and a it will introduce a symbol with this name in the enclosing scope.
964 So
965
966 <tscreen><verb>
967         .proc   foo
968                 ...
969         .endproc
970 </verb></tscreen>
971
972 is actually the same as
973
974 <tscreen><verb>
975         foo:
976         .scope  foo
977                 ...
978         .endscope
979 </verb></tscreen>
980
981 This is the reason why a procedure must have a name. If you want a scope
982 without a name, use <tt/<ref id=".SCOPE" name=".SCOPE">/.
983
984 <em/Note:/ As you can see from the example above, scopes and symbols live in
985 different namespaces. There can be a symbol named <tt/foo/ and a scope named
986 <tt/foo/ without any conflicts (but see the section titled <ref
987 id="scopesearch" name="&quot;Scope search order&quot;">).
988
989
990 <sect1>Structs, unions and enums<p>
991
992 Structs, unions and enums are explained in a <ref id="structs" name="separate
993 section">, I do only cover them here, because if they are declared with a
994 name, they open a nested scope, similar to <tt/<ref id=".SCOPE"
995 name=".SCOPE">/. However, when no name is specified, the behaviour is
996 different: In this case, no new scope will be opened, symbols declared within
997 a struct, union, or enum declaration will then be added to the enclosing scope
998 instead.
999
1000
1001 <sect1>Explicit scope specification<label id="scopesyntax"><p>
1002
1003 Accessing symbols from other scopes is possible by using an explicit scope
1004 specification, provided that the scope where the symbol lives in has a name.
1005 The namespace token (<tt/::/) is used to access other scopes:
1006
1007 <tscreen><verb>
1008         .scope  foo
1009         bar:    .word   0
1010         .endscope
1011
1012                 ...
1013                 lda     foo::bar        ; Access foo in scope bar
1014 </verb></tscreen>
1015
1016 The only way to deny access to a scope from the outside is to declare a scope
1017 without a name (using the <tt/<ref id=".SCOPE" name=".SCOPE">/ command).
1018
1019 A special syntax is used to specify the global scope: If a symbol or scope is
1020 preceded by the namespace token, the global scope is searched:
1021
1022 <tscreen><verb>
1023         bar     = 3
1024
1025         .scope  foo
1026                 bar     = 2
1027                 lda     #::bar  ; Access the global bar (which is 3)
1028         .endscope
1029 </verb></tscreen>
1030
1031
1032 <sect1>Scope search order<label id="scopesearch"><p>
1033
1034 The assembler searches for a scope in a similar way as for a symbol. First, it
1035 looks in the current scope, and then it walks up the enclosing scopes until
1036 the scope is found.
1037
1038 However, one important thing to note when using explicit scope syntax is, that
1039 a symbol may be accessed before it is defined, but a scope may <bf/not/ be
1040 used without a preceding definition. This means that in the following
1041 example:
1042
1043 <tscreen><verb>
1044         .scope  foo
1045                 bar     = 3
1046         .endscope
1047
1048         .scope  outer
1049                 lda     #foo::bar  ; Will load 3, not 2!
1050                 .scope  foo
1051                         bar     = 2
1052                 .endscope
1053         .endscope
1054 </verb></tscreen>
1055
1056 the reference to the scope <tt/foo/ will use the global scope, and not the
1057 local one, because the local one is not visible at the point where it is
1058 referenced.
1059
1060 Things get more complex if a complete chain of scopes is specified:
1061
1062 <tscreen><verb>
1063         .scope  foo
1064                 .scope  outer
1065                         .scope  inner
1066                                 bar = 1
1067                         .endscope
1068                 .endscope
1069                 .scope  another
1070                         .scope  nested
1071                                 lda     #outer::inner::bar      ; 1
1072                         .endscope
1073                 .endscope
1074         .endscope
1075
1076         .scope  outer
1077                 .scope  inner
1078                         bar = 2
1079                 .endscope
1080         .endscope
1081 </verb></tscreen>
1082
1083 When <tt/outer::inner::bar/ is referenced in the <tt/lda/ instruction, the
1084 assembler will first search in the local scope for a scope named <tt/outer/.
1085 Since none is found, the enclosing scope (<tt/another/) is checked. There is
1086 still no scope named <tt/outer/, so scope <tt/foo/ is checked, and finally
1087 scope <tt/outer/ is found. Within this scope, <tt/inner/ is searched, and in
1088 this scope, the assembler looks for a symbol named <tt/bar/.
1089
1090 Please note that once the anchor scope is found, all following scopes
1091 (<tt/inner/ in this case) are expected to be found exactly in this scope. The
1092 assembler will search the scope tree only for the first scope (if it is not
1093 anchored in the root scope). Starting from there on, there is no flexibility,
1094 so if the scope named <tt/outer/ found by the assembler does not contain a
1095 scope named <tt/inner/, this would be an error, even if such a pair does exist
1096 (one level up in global scope).
1097
1098 Ambiguities that may be introduced by this search algorithm may be removed by
1099 anchoring the scope specification in the global scope. In the example above,
1100 if you want to access the "other" symbol <tt/bar/, you would have to write:
1101
1102 <tscreen><verb>
1103         .scope  foo
1104                 .scope  outer
1105                         .scope  inner
1106                                 bar = 1
1107                         .endscope
1108                 .endscope
1109                 .scope  another
1110                         .scope  nested
1111                                 lda     #::outer::inner::bar    ; 2
1112                         .endscope
1113                 .endscope
1114         .endscope
1115
1116         .scope  outer
1117                 .scope  inner
1118                         bar = 2
1119                 .endscope
1120         .endscope
1121 </verb></tscreen>
1122
1123
1124 <sect>Address sizes and memory models<label id="address-sizes"><p>
1125
1126 <sect1>Address sizes<p>
1127
1128 ca65 assigns each segment and each symbol an address size. This is true, even
1129 if the symbol is not used as an address. You may also think of a value range
1130 of the symbol instead of an address size.
1131
1132 Possible address sizes are:
1133
1134 <itemize>
1135 <item>Zeropage or direct (8 bits)
1136 <item>Absolute (16 bits)
1137 <item>Far (24 bits)
1138 <item>Long (32 bits)
1139 </itemize>
1140
1141 Since the assembler uses default address sizes for the segments and symbols,
1142 it is usually not necessary to override the default behaviour. In cases, where
1143 it is necessary, the following keywords may be used to specify address sizes:
1144
1145 <itemize>
1146 <item>DIRECT, ZEROPAGE or ZP for zeropage addressing (8 bits).
1147 <item>ABSOLUTE, ABS or NEAR for absolute addressing (16 bits).
1148 <item>FAR for far addressing (24 bits).
1149 <item>LONG or DWORD for long addressing (32 bits).
1150 </itemize>
1151
1152
1153 <sect1>Address sizes of segments<p>
1154
1155 The assembler assigns an address size to each segment. Since the
1156 representation of a label within this segment is "segment start + offset",
1157 labels will inherit the address size of the segment they are declared in.
1158
1159 The address size of a segment may be changed, by using an optional address
1160 size modifier. See the <tt/<ref id=".SEGMENT" name="segment directive">/ for
1161 an explanation on how this is done.
1162
1163
1164 <sect1>Address sizes of symbols<p>
1165
1166
1167
1168
1169 <sect1>Memory models<p>
1170
1171 The default address size of a segment depends on the memory model used. Since
1172 labels inherit the address size from the segment they are declared in,
1173 changing the memory model is an easy way to change the address size of many
1174 symbols at once.
1175
1176
1177
1178
1179 <sect>Pseudo variables<label id="pseudo-variables"><p>
1180
1181 Pseudo variables are readable in all cases, and in some special cases also
1182 writable.
1183
1184 <sect1><tt>*</tt><p>
1185
1186   Reading this pseudo variable will return the program counter at the start
1187   of the current input line.
1188
1189   Assignment to this variable is possible when <tt/<ref id=".FEATURE"
1190   name=".FEATURE pc_assignment">/ is used. Note: You should not use
1191   assignments to <tt/*/, use <tt/<ref id=".ORG" name=".ORG">/ instead.
1192
1193
1194 <sect1><tt>.ASIZE</tt><label id=".ASIZE"><p>
1195
1196   Reading this pseudo variable will return the current size of the
1197   Accumulator in bits.
1198
1199   For the 65816 instruction set .ASIZE will return either 8 or 16, depending
1200   on the current size of the operand in immediate accu addressing mode.
1201
1202   For all other CPU instruction sets, .ASIZE will always return 8.
1203
1204   Example:
1205
1206   <tscreen><verb>
1207         ; Reverse Subtract with Accumulator
1208         ; A = memory - A
1209         .macro rsb param
1210                 .if .asize = 8
1211                         eor     #$ff
1212                 .else
1213                         eor     #$ffff
1214                 .endif
1215                 sec
1216                 adc     param
1217         .endmacro
1218   </verb></tscreen>
1219
1220   See also: <tt><ref id=".ISIZE" name=".ISIZE"></tt>
1221
1222
1223 <sect1><tt>.CPU</tt><label id=".CPU"><p>
1224
1225   Reading this pseudo variable will give a constant integer value that
1226   tells which CPU is currently enabled. It can also tell which instruction
1227   set the CPU is able to translate. The value read from the pseudo variable
1228   should be further examined by using one of the constants defined by the
1229   "cpu" macro package (see <tt/<ref id=".MACPACK" name=".MACPACK">/).
1230
1231   It may be used to replace the .IFPxx pseudo instructions or to construct
1232   even more complex expressions.
1233
1234   Example:
1235
1236   <tscreen><verb>
1237         .macpack        cpu
1238         .if     (.cpu .bitand CPU_ISET_65816)
1239                 phx
1240                 phy
1241         .else
1242                 txa
1243                 pha
1244                 tya
1245                 pha
1246         .endif
1247   </verb></tscreen>
1248
1249
1250 <sect1><tt>.ISIZE</tt><label id=".ISIZE"><p>
1251
1252   Reading this pseudo variable will return the current size of the Index
1253   register in bits.
1254
1255   For the 65816 instruction set .ISIZE will return either 8 or 16, depending
1256   on the current size of the operand in immediate index addressing mode.
1257
1258   For all other CPU instruction sets, .ISIZE will always return 8.
1259
1260   See also: <tt><ref id=".ASIZE" name=".ASIZE"></tt>
1261
1262
1263 <sect1><tt>.PARAMCOUNT</tt><label id=".PARAMCOUNT"><p>
1264
1265   This builtin pseudo variable is only available in macros. It is replaced by
1266   the actual number of parameters that were given in the macro invocation.
1267
1268   Example:
1269
1270   <tscreen><verb>
1271         .macro  foo     arg1, arg2, arg3
1272         .if     .paramcount <> 3
1273         .error  "Too few parameters for macro foo"
1274         .endif
1275         ...
1276         .endmacro
1277   </verb></tscreen>
1278
1279   See section <ref id="macros" name="Macros">.
1280
1281
1282 <sect1><tt>.TIME</tt><label id=".TIME"><p>
1283
1284   Reading this pseudo variable will give a constant integer value that
1285   represents the current time in POSIX standard (as seconds since the
1286   Epoch).
1287
1288   It may be used to encode the time of translation somewhere in the created
1289   code.
1290
1291   Example:
1292
1293   <tscreen><verb>
1294         .dword  .time   ; Place time here
1295   </verb></tscreen>
1296
1297
1298 <sect1><tt>.VERSION</tt><label id=".VERSION"><p>
1299
1300   Reading this pseudo variable will give the assembler version according to
1301   the following formula:
1302
1303         VER_MAJOR*$100 + VER_MINOR*$10
1304
1305   It may be used to encode the assembler version or check the assembler for
1306   special features not available with older versions.
1307
1308   Example:
1309
1310   Version 2.14 of the assembler will return $2E0 as numerical constant when
1311   reading the pseudo variable <tt/.VERSION/.
1312
1313
1314
1315 <sect>Pseudo functions<label id="pseudo-functions"><p>
1316
1317 Pseudo functions expect their arguments in parenthesis, and they have a result,
1318 either a string or an expression.
1319
1320
1321 <sect1><tt>.ADDRSIZE</tt><label id=".ADDRSIZE"><p>
1322
1323   The <tt/.ADDRSIZE/ function is used to return the interal address size 
1324   associated with a symbol. This can be helpful in macros when knowing the address 
1325   size of symbol can help with custom instructions.
1326
1327   Example:
1328
1329   <tscreen><verb>
1330         .macro myLDA foo
1331                 .if .ADDRSIZE(foo) = 1
1332                         ;do custom command based on zeropage addressing:
1333                         .byte 0A5h, foo
1334                 .elseif .ADDRSIZE(foo) = 2
1335                         ;do custom command based on absolute addressing:
1336                         .byte 0ADh
1337                         .word foo
1338                 .elseif .ADDRSIZE(foo) = 0
1339                         ; no address size defined for this symbol:
1340                         .out .sprintf("Error, address size unknown for symbol %s", .string(foo))
1341                 .endif
1342         .endmacro
1343   </verb></tscreen>
1344
1345   This command is new and must be enabled with the <tt/.FEATURE addrsize/ command.
1346
1347   See: <tt><ref id=".FEATURE" name=".FEATURE"></tt>
1348
1349
1350 <sect1><tt>.BANK</tt><label id=".BANK"><p>
1351
1352   The <tt/.BANK/ function is used to support systems with banked memory. The
1353   argument is an expression with exactly one segment reference - usually a
1354   label. The function result is the value of the <tt/bank/ attribute assigned
1355   to the run memory area of the segment. Please see the linker documentation
1356   for more information about memory areas and their attributes.
1357
1358   The value of <tt/.BANK/ can be used to switch memory so that a memory bank
1359   containing specific data is available.
1360
1361   The <tt/bank/ attribute is a 32 bit integer and so is the result of the
1362   <tt/.BANK/ function. You will have to use <tt><ref id=".LOBYTE"
1363   name=".LOBYTE"></tt> or similar functions to address just part of it.
1364
1365   Please note that <tt/.BANK/ will always get evaluated in the link stage, so
1366   an expression containing <tt/.BANK/ can never be used where a constant known
1367   result is expected (for example with <tt/.RES/).
1368
1369   Example:
1370
1371   <tscreen><verb>
1372         .segment "BANK1"
1373         .proc   banked_func_1
1374                 ...
1375         .endproc
1376
1377         .segment "BANK2"
1378         .proc   banked_func_2
1379                 ...
1380         .endproc
1381
1382         .proc   bank_table
1383                 .addr   banked_func_1
1384                 .byte   <.BANK (banked_func_1)
1385
1386                 .addr   banked_func_2
1387                 .byte   <.BANK (banked_func_2)
1388         .endproc
1389   </verb></tscreen>
1390
1391
1392
1393 <sect1><tt>.BANKBYTE</tt><label id=".BANKBYTE"><p>
1394
1395   The function returns the bank byte (that is, bits 16-23) of its argument.
1396   It works identical to the '^' operator.
1397
1398   See: <tt><ref id=".HIBYTE" name=".HIBYTE"></tt>,
1399        <tt><ref id=".LOBYTE" name=".LOBYTE"></tt>
1400
1401
1402 <sect1><tt>.BLANK</tt><label id=".BLANK"><p>
1403
1404   Builtin function. The function evaluates its argument in braces and yields
1405   "false" if the argument is non blank (there is an argument), and "true" if
1406   there is no argument.  The token list that makes up the function argument
1407   may optionally be enclosed in curly braces. This allows the inclusion of
1408   tokens that would otherwise terminate the list (the closing right
1409   parenthesis). The curly braces are not considered part of the list, a list
1410   just consisting of curly braces is considered to be empty.
1411
1412   As an example, the <tt/.IFBLANK/ statement may be replaced by
1413
1414   <tscreen><verb>
1415         .if     .blank({arg})
1416   </verb></tscreen>
1417
1418
1419
1420 <sect1><tt>.CONCAT</tt><label id=".CONCAT"><p>
1421
1422   Builtin string function. The function allows to concatenate a list of string
1423   constants separated by commas. The result is a string constant that is the
1424   concatenation of all arguments. This function is most useful in macros and
1425   when used together with the <tt/.STRING/ builtin function. The function may
1426   be used in any case where a string constant is expected.
1427
1428   Example:
1429
1430   <tscreen><verb>
1431         .include        .concat ("myheader", ".", "inc")
1432   </verb></tscreen>
1433
1434   This is the same as the command
1435
1436   <tscreen><verb>
1437         .include        "myheader.inc"
1438   </verb></tscreen>
1439
1440
1441 <sect1><tt>.CONST</tt><label id=".CONST"><p>
1442
1443   Builtin function. The function evaluates its argument in braces and
1444   yields "true" if the argument is a constant expression (that is, an
1445   expression that yields a constant value at assembly time) and "false"
1446   otherwise. As an example, the .IFCONST statement may be replaced by
1447
1448   <tscreen><verb>
1449         .if     .const(a + 3)
1450   </verb></tscreen>
1451
1452
1453 <sect1><tt>.HIBYTE</tt><label id=".HIBYTE"><p>
1454
1455   The function returns the high byte (that is, bits 8-15) of its argument.
1456   It works identical to the '>' operator.
1457
1458   See: <tt><ref id=".LOBYTE" name=".LOBYTE"></tt>,
1459        <tt><ref id=".BANKBYTE" name=".BANKBYTE"></tt>
1460
1461
1462 <sect1><tt>.HIWORD</tt><label id=".HIWORD"><p>
1463
1464   The function returns the high word (that is, bits 16-31) of its argument.
1465
1466   See: <tt><ref id=".LOWORD" name=".LOWORD"></tt>
1467
1468
1469 <sect1><tt>.IDENT</tt><label id=".IDENT"><p>
1470
1471   The function expects a string as its argument, and converts this argument
1472   into an identifier. If the string starts with the current <tt/<ref
1473   id=".LOCALCHAR" name=".LOCALCHAR">/, it will be converted into a cheap local
1474   identifier, otherwise it will be converted into a normal identifier.
1475
1476   Example:
1477
1478   <tscreen><verb>
1479         .macro  makelabel       arg1, arg2
1480                 .ident (.concat (arg1, arg2)):
1481         .endmacro
1482
1483                 makelabel       "foo", "bar"
1484
1485                 .word           foobar          ; Valid label
1486   </verb></tscreen>
1487
1488
1489 <sect1><tt>.LEFT</tt><label id=".LEFT"><p>
1490
1491   Builtin function. Extracts the left part of a given token list.
1492
1493   Syntax:
1494
1495   <tscreen><verb>
1496         .LEFT (&lt;int expr&gt;, &lt;token list&gt;)
1497   </verb></tscreen>
1498
1499   The first integer expression gives the number of tokens to extract from
1500   the token list. The second argument is the token list itself. The token
1501   list may optionally be enclosed into curly braces. This allows the
1502   inclusion of tokens that would otherwise terminate the list (the closing
1503   right paren in the given case).
1504
1505   Example:
1506
1507   To check in a macro if the given argument has a '#' as first token
1508   (immediate addressing mode), use something like this:
1509
1510   <tscreen><verb>
1511         .macro  ldax    arg
1512                 ...
1513                 .if (.match (.left (1, {arg}), #))
1514
1515                 ; ldax called with immediate operand
1516                 ...
1517
1518                 .endif
1519                 ...
1520         .endmacro
1521   </verb></tscreen>
1522
1523   See also the <tt><ref id=".MID" name=".MID"></tt> and <tt><ref id=".RIGHT"
1524   name=".RIGHT"></tt> builtin functions.
1525
1526
1527 <sect1><tt>.LOBYTE</tt><label id=".LOBYTE"><p>
1528
1529   The function returns the low byte (that is, bits 0-7) of its argument.
1530   It works identical to the '<' operator.
1531
1532   See: <tt><ref id=".HIBYTE" name=".HIBYTE"></tt>,
1533        <tt><ref id=".BANKBYTE" name=".BANKBYTE"></tt>
1534
1535
1536 <sect1><tt>.LOWORD</tt><label id=".LOWORD"><p>
1537
1538   The function returns the low word (that is, bits 0-15) of its argument.
1539
1540   See: <tt><ref id=".HIWORD" name=".HIWORD"></tt>
1541
1542
1543 <sect1><tt>.MATCH</tt><label id=".MATCH"><p>
1544
1545   Builtin function. Matches two token lists against each other. This is
1546   most useful within macros, since macros are not stored as strings, but
1547   as lists of tokens.
1548
1549   The syntax is
1550
1551   <tscreen><verb>
1552         .MATCH(&lt;token list #1&gt;, &lt;token list #2&gt;)
1553   </verb></tscreen>
1554
1555   Both token list may contain arbitrary tokens with the exception of the
1556   terminator token (comma resp. right parenthesis) and
1557
1558   <itemize>
1559   <item>end-of-line
1560   <item>end-of-file
1561   </itemize>
1562
1563   The token lists may optionally be enclosed into curly braces. This allows
1564   the inclusion of tokens that would otherwise terminate the list (the closing
1565   right paren in the given case). Often a macro parameter is used for any of
1566   the token lists.
1567
1568   Please note that the function does only compare tokens, not token
1569   attributes. So any number is equal to any other number, regardless of the
1570   actual value. The same is true for strings. If you need to compare tokens
1571   <em/and/ token attributes, use the <tt><ref id=".XMATCH"
1572   name=".XMATCH"></tt> function.
1573
1574   Example:
1575
1576   Assume the macro <tt/ASR/, that will shift right the accumulator by one,
1577   while honoring the sign bit. The builtin processor instructions will allow
1578   an optional "A" for accu addressing for instructions like <tt/ROL/ and
1579   <tt/ROR/. We will use the <tt><ref id=".MATCH" name=".MATCH"></tt> function
1580   to check for this and print and error for invalid calls.
1581
1582   <tscreen><verb>
1583         .macro  asr     arg
1584
1585                 .if (.not .blank(arg)) .and (.not .match ({arg}, a))
1586                 .error "Syntax error"
1587                 .endif
1588
1589                 cmp     #$80            ; Bit 7 into carry
1590                 lsr     a               ; Shift carry into bit 7
1591
1592         .endmacro
1593   </verb></tscreen>
1594
1595   The macro will only accept no arguments, or one argument that must be the
1596   reserved keyword "A".
1597
1598   See: <tt><ref id=".XMATCH" name=".XMATCH"></tt>
1599
1600
1601 <sect1><tt>.MAX</tt><label id=".MAX"><p>
1602
1603   Builtin function. The result is the larger of two values.
1604
1605   The syntax is
1606
1607   <tscreen><verb>
1608         .MAX (&lt;value #1&gt;, &lt;value #2&gt;)
1609   </verb></tscreen>
1610
1611   Example:
1612
1613   <tscreen><verb>
1614         ; Reserve space for the larger of two data blocks
1615         savearea:       .max (.sizeof (foo), .sizeof (bar))
1616   </verb></tscreen>
1617
1618   See: <tt><ref id=".MIN" name=".MIN"></tt>
1619
1620
1621 <sect1><tt>.MID</tt><label id=".MID"><p>
1622
1623   Builtin function. Takes a starting index, a count and a token list as
1624   arguments. Will return part of the token list.
1625
1626   Syntax:
1627
1628   <tscreen><verb>
1629         .MID (&lt;int expr&gt;, &lt;int expr&gt;, &lt;token list&gt;)
1630   </verb></tscreen>
1631
1632   The first integer expression gives the starting token in the list (the first
1633   token has index 0). The second integer expression gives the number of tokens
1634   to extract from the token list. The third argument is the token list itself.
1635   The token list may optionally be enclosed into curly braces. This allows the
1636   inclusion of tokens that would otherwise terminate the list (the closing
1637   right paren in the given case).
1638
1639   Example:
1640
1641   To check in a macro if the given argument has a '<tt/#/' as first token
1642   (immediate addressing mode), use something like this:
1643
1644     <tscreen><verb>
1645         .macro  ldax    arg
1646                 ...
1647                 .if (.match (.mid (0, 1, {arg}), #))
1648
1649                 ; ldax called with immediate operand
1650                 ...
1651
1652                 .endif
1653                 ...
1654         .endmacro
1655   </verb></tscreen>
1656
1657   See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".RIGHT"
1658   name=".RIGHT"></tt> builtin functions.
1659
1660
1661 <sect1><tt>.MIN</tt><label id=".MIN"><p>
1662
1663   Builtin function. The result is the smaller of two values.
1664
1665   The syntax is
1666
1667   <tscreen><verb>
1668         .MIN (&lt;value #1&gt;, &lt;value #2&gt;)
1669   </verb></tscreen>
1670
1671   Example:
1672
1673   <tscreen><verb>
1674         ; Reserve space for some data, but 256 bytes minimum
1675         savearea:       .min (.sizeof (foo), 256)
1676   </verb></tscreen>
1677
1678   See: <tt><ref id=".MAX" name=".MAX"></tt>
1679
1680
1681 <sect1><tt>.REF, .REFERENCED</tt><label id=".REFERENCED"><p>
1682
1683   Builtin function. The function expects an identifier as argument in braces.
1684   The argument is evaluated, and the function yields "true" if the identifier
1685   is a symbol that has already been referenced somewhere in the source file up
1686   to the current position. Otherwise the function yields false. As an example,
1687   the <tt><ref id=".IFREF" name=".IFREF"></tt> statement may be replaced by
1688
1689   <tscreen><verb>
1690         .if     .referenced(a)
1691   </verb></tscreen>
1692
1693   See: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
1694
1695
1696 <sect1><tt>.RIGHT</tt><label id=".RIGHT"><p>
1697
1698   Builtin function. Extracts the right part of a given token list.
1699
1700   Syntax:
1701
1702   <tscreen><verb>
1703         .RIGHT (&lt;int expr&gt;, &lt;token list&gt;)
1704   </verb></tscreen>
1705
1706   The first integer expression gives the number of tokens to extract from the
1707   token list. The second argument is the token list itself.  The token list
1708   may optionally be enclosed into curly braces. This allows the inclusion of
1709   tokens that would otherwise terminate the list (the closing right paren in
1710   the given case).
1711
1712   See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".MID"
1713   name=".MID"></tt> builtin functions.
1714
1715
1716 <sect1><tt>.SIZEOF</tt><label id=".SIZEOF"><p>
1717
1718   <tt/.SIZEOF/ is a pseudo function that returns the size of its argument. The
1719   argument can be a struct/union, a struct member, a procedure, or a label. In
1720   case of a procedure or label, its size is defined by the amount of data
1721   placed in the segment where the label is relative to. If a line of code
1722   switches segments (for example in a macro) data placed in other segments
1723   does not count for the size.
1724
1725   Please note that a symbol or scope must exist, before it is used together with
1726   <tt/.SIZEOF/ (this may get relaxed later, but will always be true for scopes).
1727   A scope has preference over a symbol with the same name, so if the last part
1728   of a name represents both, a scope and a symbol, the scope is chosen over the
1729   symbol.
1730
1731   After the following code:
1732
1733   <tscreen><verb>
1734         .struct Point                   ; Struct size = 4
1735                 xcoord  .word
1736                 ycoord  .word
1737         .endstruct
1738
1739         P:      .tag    Point           ; Declare a point
1740         @P:     .tag    Point           ; Declare another point
1741
1742         .code
1743         .proc   Code
1744                 nop
1745                 .proc   Inner
1746                         nop
1747                 .endproc
1748                 nop
1749         .endproc
1750
1751         .proc   Data
1752         .data                           ; Segment switch!!!
1753                 .res    4
1754         .endproc
1755   </verb></tscreen>
1756
1757   <descrip>
1758     <tag><tt/.sizeof(Point)/</tag>
1759     will have the value 4, because this is the size of struct <tt/Point/.
1760
1761     <tag><tt/.sizeof(Point::xcoord)/</tag>
1762     will have the value 2, because this is the size of the member <tt/xcoord/
1763     in struct <tt/Point/.
1764
1765     <tag><tt/.sizeof(P)/</tag>
1766     will have the value 4, this is the size of the data declared on the same
1767     source line as the label <tt/P/, which is in the same segment that <tt/P/
1768     is relative to.
1769
1770     <tag><tt/.sizeof(@P)/</tag>
1771     will have the value 4, see above. The example demonstrates that <tt/.SIZEOF/
1772     does also work for cheap local symbols.
1773
1774     <tag><tt/.sizeof(Code)/</tag>
1775     will have the value 3, since this is amount of data emitted into the code
1776     segment, the segment that was active when <tt/Code/ was entered. Note that
1777     this value includes the amount of data emitted in child scopes (in this
1778     case <tt/Code::Inner/).
1779
1780     <tag><tt/.sizeof(Code::Inner)/</tag>
1781     will have the value 1 as expected.
1782
1783     <tag><tt/.sizeof(Data)/</tag>
1784     will have the value 0. Data is emitted within the scope <tt/Data/, but since
1785     the segment is switched after entry, this data is emitted into another
1786     segment.
1787   </descrip>
1788
1789
1790 <sect1><tt>.STRAT</tt><label id=".STRAT"><p>
1791
1792   Builtin function. The function accepts a string and an index as
1793   arguments and returns the value of the character at the given position
1794   as an integer value. The index is zero based.
1795
1796   Example:
1797
1798   <tscreen><verb>
1799         .macro  M       Arg
1800                 ; Check if the argument string starts with '#'
1801                 .if (.strat (Arg, 0) = '#')
1802                 ...
1803                 .endif
1804         .endmacro
1805   </verb></tscreen>
1806
1807
1808 <sect1><tt>.SPRINTF</tt><label id=".SPRINTF"><p>
1809
1810   Builtin function. It expects a format string as first argument. The number
1811   and type of the following arguments depend on the format string. The format
1812   string is similar to the one of the C <tt/printf/ function. Missing things
1813   are: Length modifiers, variable width.
1814
1815   The result of the function is a string.
1816
1817   Example:
1818
1819   <tscreen><verb>
1820         num     = 3
1821
1822         ; Generate an identifier:
1823         .ident (.sprintf ("%s%03d", "label", num)):
1824   </verb></tscreen>
1825
1826
1827 <sect1><tt>.STRING</tt><label id=".STRING"><p>
1828
1829   Builtin function. The function accepts an argument in braces and converts
1830   this argument into a string constant. The argument may be an identifier, or
1831   a constant numeric value.
1832
1833   Since you can use a string in the first place, the use of the function may
1834   not be obvious. However, it is useful in macros, or more complex setups.
1835
1836   Example:
1837
1838   <tscreen><verb>
1839         ; Emulate other assemblers:
1840         .macro  section name
1841                 .segment        .string(name)
1842         .endmacro
1843   </verb></tscreen>
1844
1845
1846 <sect1><tt>.STRLEN</tt><label id=".STRLEN"><p>
1847
1848   Builtin function. The function accepts a string argument in braces and
1849   evaluates to the length of the string.
1850
1851   Example:
1852
1853   The following macro encodes a string as a pascal style string with
1854   a leading length byte.
1855
1856   <tscreen><verb>
1857         .macro  PString Arg
1858                 .byte   .strlen(Arg), Arg
1859         .endmacro
1860   </verb></tscreen>
1861
1862
1863 <sect1><tt>.TCOUNT</tt><label id=".TCOUNT"><p>
1864
1865   Builtin function. The function accepts a token list in braces. The function
1866   result is the number of tokens given as argument. The token list may
1867   optionally be enclosed into curly braces which are not considered part of
1868   the list and not counted. Enclosement in curly braces allows the inclusion
1869   of tokens that would otherwise terminate the list (the closing right paren
1870   in the given case).
1871
1872   Example:
1873
1874   The <tt/ldax/ macro accepts the '#' token to denote immediate addressing (as
1875   with the normal 6502 instructions). To translate it into two separate 8 bit
1876   load instructions, the '#' token has to get stripped from the argument:
1877
1878   <tscreen><verb>
1879         .macro  ldax    arg
1880                 .if (.match (.mid (0, 1, {arg}), #))
1881                 ; ldax called with immediate operand
1882                 lda     #<(.right (.tcount ({arg})-1, {arg}))
1883                 ldx     #>(.right (.tcount ({arg})-1, {arg}))
1884                 .else
1885                 ...
1886                 .endif
1887         .endmacro
1888   </verb></tscreen>
1889
1890
1891 <sect1><tt>.XMATCH</tt><label id=".XMATCH"><p>
1892
1893   Builtin function. Matches two token lists against each other. This is
1894   most useful within macros, since macros are not stored as strings, but
1895   as lists of tokens.
1896
1897   The syntax is
1898
1899   <tscreen><verb>
1900         .XMATCH(&lt;token list #1&gt;, &lt;token list #2&gt;)
1901   </verb></tscreen>
1902
1903   Both token list may contain arbitrary tokens with the exception of the
1904   terminator token (comma resp. right parenthesis) and
1905
1906   <itemize>
1907   <item>end-of-line
1908   <item>end-of-file
1909   </itemize>
1910
1911   The token lists may optionally be enclosed into curly braces. This allows
1912   the inclusion of tokens that would otherwise terminate the list (the closing
1913   right paren in the given case). Often a macro parameter is used for any of
1914   the token lists.
1915
1916   The function compares tokens <em/and/ token values. If you need a function
1917   that just compares the type of tokens, have a look at the <tt><ref
1918   id=".MATCH" name=".MATCH"></tt> function.
1919
1920   See: <tt><ref id=".MATCH" name=".MATCH"></tt>
1921
1922
1923
1924 <sect>Control commands<label id="control-commands"><p>
1925
1926 Here's a list of all control commands and a description, what they do:
1927
1928
1929 <sect1><tt>.A16</tt><label id=".A16"><p>
1930
1931   Valid only in 65816 mode. Switch the accumulator to 16 bit.
1932
1933   Note: This command will not emit any code, it will tell the assembler to
1934   create 16 bit operands for immediate accumulator addressing mode.
1935
1936   See also: <tt><ref id=".SMART" name=".SMART"></tt>
1937
1938
1939 <sect1><tt>.A8</tt><label id=".A8"><p>
1940
1941   Valid only in 65816 mode. Switch the accumulator to 8 bit.
1942
1943   Note: This command will not emit any code, it will tell the assembler to
1944   create 8 bit operands for immediate accu addressing mode.
1945
1946   See also: <tt><ref id=".SMART" name=".SMART"></tt>
1947
1948
1949 <sect1><tt>.ADDR</tt><label id=".ADDR"><p>
1950
1951   Define word sized data. In 6502 mode, this is an alias for <tt/.WORD/ and
1952   may be used for better readability if the data words are address values. In
1953   65816 mode, the address is forced to be 16 bit wide to fit into the current
1954   segment. See also <tt><ref id=".FARADDR" name=".FARADDR"></tt>. The command
1955   must be followed by a sequence of (not necessarily constant) expressions.
1956
1957   Example:
1958
1959   <tscreen><verb>
1960         .addr   $0D00, $AF13, _Clear
1961   </verb></tscreen>
1962
1963   See: <tt><ref id=".FARADDR" name=".FARADDR"></tt>, <tt><ref id=".WORD"
1964        name=".WORD"></tt>
1965
1966
1967 <sect1><tt>.ALIGN</tt><label id=".ALIGN"><p>
1968
1969   Align data to a given boundary. The command expects a constant integer
1970   argument in the range 1 ... 65536, plus an optional second argument
1971   in byte range. If there is a second argument, it is used as fill value,
1972   otherwise the value defined in the linker configuration file is used
1973   (the default for this value is zero).
1974
1975   <tt/.ALIGN/ will insert fill bytes, and the number of fill bytes depend of
1976   the final address of the segment. <tt/.ALIGN/ cannot insert a variable
1977   number of bytes, since that would break address calculations within the
1978   module. So each <tt/.ALIGN/ expects the segment to be aligned to a multiple
1979   of the alignment, because that allows the number of fill bytes to be
1980   calculated in advance by the assembler. You are therefore required to
1981   specify a matching alignment for the segment in the linker config. The
1982   linker will output a warning if the alignment of the segment is less than
1983   what is necessary to have a correct alignment in the object file.
1984
1985   Example:
1986
1987   <tscreen><verb>
1988         .align  256
1989   </verb></tscreen>
1990
1991   Some unexpected behaviour might occur if there are multiple <tt/.ALIGN/
1992   commands with different arguments. To allow the assembler to calculate the
1993   number of fill bytes in advance, the alignment of the segment must be a
1994   multiple of each of the alignment factors. This may result in unexpectedly
1995   large alignments for the segment within the module.
1996
1997   Example:
1998
1999   <tscreen><verb>
2000         .align  15
2001         .byte   15
2002         .align  18
2003         .byte   18
2004   </verb></tscreen>
2005
2006   For the assembler to be able to align correctly, the segment must be aligned
2007   to the least common multiple of 15 and 18 which is 90. The assembler will
2008   calculate this automatically and will mark the segment with this value.
2009
2010   Unfortunately, the combined alignment may get rather large without the user
2011   knowing about it, wasting space in the final executable. If we add another
2012   alignment to the example above
2013
2014   <tscreen><verb>
2015         .align  15
2016         .byte   15
2017         .align  18
2018         .byte   18
2019         .align  251
2020         .byte   0
2021   </verb></tscreen>
2022
2023   the assembler will force a segment alignment to the least common multiple of
2024   15, 18 and 251 - which is 22590. To protect the user against errors, the
2025   assembler will issue a warning when the combined alignment exceeds 256. The
2026   command line option <tt><ref id="option--large-alignment"
2027   name="--large-alignment"></tt> will disable this warning.
2028
2029   Please note that with alignments that are a power of two (which were the
2030   only alignments possible in older versions of the assembler), the problem is
2031   less severe, because the least common multiple of powers to the same base is
2032   always the larger one.
2033
2034
2035
2036 <sect1><tt>.ASCIIZ</tt><label id=".ASCIIZ"><p>
2037
2038   Define a string with a trailing zero.
2039
2040   Example:
2041
2042   <tscreen><verb>
2043         Msg:    .asciiz "Hello world"
2044   </verb></tscreen>
2045
2046   This will put the string "Hello world" followed by a binary zero into
2047   the current segment. There may be more strings separated by commas, but
2048   the binary zero is only appended once (after the last one).
2049
2050
2051 <sect1><tt>.ASSERT</tt><label id=".ASSERT"><p>
2052
2053   Add an assertion. The command is followed by an expression, an action
2054   specifier, and an optional message that is output in case the assertion
2055   fails. If no message was given, the string "Assertion failed" is used. The
2056   action specifier may be one of <tt/warning/, <tt/error/, <tt/ldwarning/ or
2057   <tt/lderror/. In the former two cases, the assertion is evaluated by the
2058   assembler if possible, and in any case, it's also passed to the linker in
2059   the object file (if one is generated). The linker will then evaluate the
2060   expression when segment placement has been done.
2061
2062   Example:
2063
2064   <tscreen><verb>
2065         .assert         * = $8000, error, "Code not at $8000"
2066   </verb></tscreen>
2067
2068   The example assertion will check that the current location is at $8000,
2069   when the output file is written, and abort with an error if this is not
2070   the case. More complex expressions are possible. The action specifier
2071   <tt/warning/ outputs a warning, while the <tt/error/ specifier outputs
2072   an error message. In the latter case, generation of the output file is
2073   suppressed in both the assembler and linker.
2074
2075
2076 <sect1><tt>.AUTOIMPORT</tt><label id=".AUTOIMPORT"><p>
2077
2078   Is followed by a plus or a minus character. When switched on (using a
2079   +), undefined symbols are automatically marked as import instead of
2080   giving errors. When switched off (which is the default so this does not
2081   make much sense), this does not happen and an error message is
2082   displayed. The state of the autoimport flag is evaluated when the
2083   complete source was translated, before outputting actual code, so it is
2084   <em/not/ possible to switch this feature on or off for separate sections
2085   of code. The last setting is used for all symbols.
2086
2087   You should probably not use this switch because it delays error
2088   messages about undefined symbols until the link stage. The cc65
2089   compiler (which is supposed to produce correct assembler code in all
2090   circumstances, something which is not true for most assembler
2091   programmers) will insert this command to avoid importing each and every
2092   routine from the runtime library.
2093
2094   Example:
2095
2096   <tscreen><verb>
2097         .autoimport     +       ; Switch on auto import
2098   </verb></tscreen>
2099
2100 <sect1><tt>.BANKBYTES</tt><label id=".BANKBYTES"><p>
2101
2102   Define byte sized data by extracting only the bank byte (that is, bits 16-23) from
2103   each expression.  This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
2104   the operator '^' prepended to each expression in its list.
2105
2106   Example:
2107
2108   <tscreen><verb>
2109         .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
2110
2111         TableLookupLo:   .lobytes   MyTable
2112         TableLookupHi:   .hibytes   MyTable
2113         TableLookupBank: .bankbytes MyTable
2114   </verb></tscreen>
2115
2116   which is equivalent to
2117
2118   <tscreen><verb>
2119         TableLookupLo:   .byte &lt;TableItem0, &lt;TableItem1, &lt;TableItem2, &lt;TableItem3
2120         TableLookupHi:   .byte &gt;TableItem0, &gt;TableItem1, &gt;TableItem2, &gt;TableItem3
2121         TableLookupBank: .byte ^TableItem0, ^TableItem1, ^TableItem2, ^TableItem3
2122   </verb></tscreen>
2123
2124   See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
2125             <tt><ref id=".HIBYTES" name=".HIBYTES"></tt>,
2126             <tt><ref id=".LOBYTES" name=".LOBYTES"></tt>
2127
2128
2129 <sect1><tt>.BSS</tt><label id=".BSS"><p>
2130
2131   Switch to the BSS segment. The name of the BSS segment is always "BSS",
2132   so this is a shortcut for
2133
2134   <tscreen><verb>
2135         .segment  "BSS"
2136   </verb></tscreen>
2137
2138   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2139
2140
2141 <sect1><tt>.BYT, .BYTE</tt><label id=".BYTE"><p>
2142
2143   Define byte sized data. Must be followed by a sequence of (byte ranged)
2144   expressions or strings.
2145
2146   Example:
2147
2148   <tscreen><verb>
2149         .byte   "Hello "
2150         .byt    "world", $0D, $00
2151   </verb></tscreen>
2152
2153
2154 <sect1><tt>.CASE</tt><label id=".CASE"><p>
2155
2156   Switch on or off case sensitivity on identifiers. The default is off
2157   (that is, identifiers are case sensitive), but may be changed by the
2158   -i switch on the command line.
2159   The command must be followed by a '+' or '-' character to switch the
2160   option on or off respectively.
2161
2162   Example:
2163
2164   <tscreen><verb>
2165         .case   -               ; Identifiers are not case sensitive
2166   </verb></tscreen>
2167
2168
2169 <sect1><tt>.CHARMAP</tt><label id=".CHARMAP"><p>
2170
2171   Apply a custom mapping for characters. The command is followed by two
2172   numbers. The first one is the index of the source character (range 1..255),
2173   the second one is the mapping (range 0..255). The mapping applies to all
2174   character and string constants when they generate output, and overrides a
2175   mapping table specified with the <tt><ref id="option-t" name="-t"></tt>
2176   command line switch.
2177
2178   Example:
2179
2180   <tscreen><verb>
2181         .charmap        $41, $61        ; Map 'A' to 'a'
2182   </verb></tscreen>
2183
2184
2185 <sect1><tt>.CODE</tt><label id=".CODE"><p>
2186
2187   Switch to the CODE segment. The name of the CODE segment is always
2188   "CODE", so this is a shortcut for
2189
2190   <tscreen><verb>
2191         .segment  "CODE"
2192   </verb></tscreen>
2193
2194   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2195
2196
2197 <sect1><tt>.CONDES</tt><label id=".CONDES"><p>
2198
2199   Export a symbol and mark it in a special way. The linker is able to build
2200   tables of all such symbols. This may be used to automatically create a list
2201   of functions needed to initialize linked library modules.
2202
2203   Note: The linker has a feature to build a table of marked routines, but it
2204   is your code that must call these routines, so just declaring a symbol with
2205   <tt/.CONDES/ does nothing by itself.
2206
2207   All symbols are exported as an absolute (16 bit) symbol. You don't need to
2208   use an additional <tt><ref id=".EXPORT" name=".EXPORT"></tt> statement, this
2209   is implied by <tt/.CONDES/.
2210
2211   <tt/.CONDES/ is followed by the type, which may be <tt/constructor/,
2212   <tt/destructor/ or a numeric value between 0 and 6 (where 0 is the same as
2213   specifying <tt/constructor/ and 1 is equal to specifying <tt/destructor/).
2214   The <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
2215   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
2216   name=".INTERRUPTOR"></tt> commands are actually shortcuts for <tt/.CONDES/
2217   with a type of <tt/constructor/ resp. <tt/destructor/ or <tt/interruptor/.
2218
2219   After the type, an optional priority may be specified. Higher numeric values
2220   mean higher priority. If no priority is given, the default priority of 7 is
2221   used. Be careful when assigning priorities to your own module constructors
2222   so they won't interfere with the ones in the cc65 library.
2223
2224   Example:
2225
2226   <tscreen><verb>
2227         .condes         ModuleInit, constructor
2228         .condes         ModInit, 0, 16
2229   </verb></tscreen>
2230
2231   See the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
2232   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
2233   name=".INTERRUPTOR"></tt> commands and the separate section <ref id="condes"
2234   name="Module constructors/destructors"> explaining the feature in more
2235   detail.
2236
2237
2238 <sect1><tt>.CONSTRUCTOR</tt><label id=".CONSTRUCTOR"><p>
2239
2240   Export a symbol and mark it as a module constructor. This may be used
2241   together with the linker to build a table of constructor subroutines that
2242   are called by the startup code.
2243
2244   Note: The linker has a feature to build a table of marked routines, but it
2245   is your code that must call these routines, so just declaring a symbol as
2246   constructor does nothing by itself.
2247
2248   A constructor is always exported as an absolute (16 bit) symbol. You don't
2249   need to use an additional <tt/.export/ statement, this is implied by
2250   <tt/.constructor/. It may have an optional priority that is separated by a
2251   comma. Higher numeric values mean a higher priority. If no priority is
2252   given, the default priority of 7 is used. Be careful when assigning
2253   priorities to your own module constructors so they won't interfere with the
2254   ones in the cc65 library.
2255
2256   Example:
2257
2258   <tscreen><verb>
2259         .constructor    ModuleInit
2260         .constructor    ModInit, 16
2261   </verb></tscreen>
2262
2263   See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
2264   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> commands and the separate section
2265   <ref id="condes" name="Module constructors/destructors"> explaining the
2266   feature in more detail.
2267
2268
2269 <sect1><tt>.DATA</tt><label id=".DATA"><p>
2270
2271   Switch to the DATA segment. The name of the DATA segment is always
2272   "DATA", so this is a shortcut for
2273
2274   <tscreen><verb>
2275         .segment  "DATA"
2276   </verb></tscreen>
2277
2278   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2279
2280
2281 <sect1><tt>.DBYT</tt><label id=".DBYT"><p>
2282
2283   Define word sized data with the hi and lo bytes swapped (use <tt/.WORD/ to
2284   create word sized data in native 65XX format). Must be followed by a
2285   sequence of (word ranged) expressions.
2286
2287   Example:
2288
2289   <tscreen><verb>
2290         .dbyt   $1234, $4512
2291   </verb></tscreen>
2292
2293   This will emit the bytes
2294
2295   <tscreen><verb>
2296         $12 $34 $45 $12
2297   </verb></tscreen>
2298
2299   into the current segment in that order.
2300
2301
2302 <sect1><tt>.DEBUGINFO</tt><label id=".DEBUGINFO"><p>
2303
2304   Switch on or off debug info generation. The default is off (that is,
2305   the object file will not contain debug infos), but may be changed by the
2306   -g switch on the command line.
2307   The command must be followed by a '+' or '-' character to switch the
2308   option on or off respectively.
2309
2310   Example:
2311
2312   <tscreen><verb>
2313         .debuginfo      +       ; Generate debug info
2314   </verb></tscreen>
2315
2316
2317 <sect1><tt>.DEFINE</tt><label id=".DEFINE"><p>
2318
2319   Start a define style macro definition. The command is followed by an
2320   identifier (the macro name) and optionally by a list of formal arguments
2321   in braces.
2322
2323   Please note that <tt/.DEFINE/ shares most disadvantages with its C
2324   counterpart, so the general advice is, <bf/NOT/ do use <tt/.DEFINE/ if you
2325   don't have to.
2326
2327   See also the <tt><ref id=".UNDEFINE" name=".UNDEFINE"></tt> command and
2328   section <ref id="macros" name="Macros">.
2329
2330
2331 <sect1><tt>.DELMAC, .DELMACRO</tt><label id=".DELMACRO"><p>
2332
2333   Delete a classic macro (defined with <tt><ref id=".MACRO"
2334   name=".MACRO"></tt>) . The command is followed by the name of an
2335   existing macro. Its definition will be deleted together with the name.
2336   If necessary, another macro with this name may be defined later.
2337
2338   See: <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
2339        <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>,
2340        <tt><ref id=".MACRO" name=".MACRO"></tt>
2341
2342   See also section <ref id="macros" name="Macros">.
2343
2344
2345 <sect1><tt>.DEF, .DEFINED</tt><label id=".DEFINED"><p>
2346
2347   Builtin function. The function expects an identifier as argument in braces.
2348   The argument is evaluated, and the function yields "true" if the identifier
2349   is a symbol that is already defined somewhere in the source file up to the
2350   current position. Otherwise the function yields false. As an example, the
2351   <tt><ref id=".IFDEF" name=".IFDEF"></tt> statement may be replaced by
2352
2353   <tscreen><verb>
2354         .if     .defined(a)
2355   </verb></tscreen>
2356
2357
2358 <sect1><tt>.DEFINEDMACRO</tt><label id=".DEFINEDMACRO"><p>
2359
2360   Builtin function. The function expects an identifier as argument in braces.
2361   The argument is evaluated, and the function yields "true" if the identifier 
2362   has already been defined as the name of a macro. Otherwise the function yields 
2363   false. Example:
2364
2365   <tscreen><verb>
2366         .macro add foo
2367                 clc
2368                 adc foo
2369         .endmacro
2370                  
2371         .if     .definedmacro(add)
2372                 add #$01
2373         .else
2374                 clc
2375                 adc #$01
2376         .endif
2377   </verb></tscreen>
2378
2379
2380 <sect1><tt>.DESTRUCTOR</tt><label id=".DESTRUCTOR"><p>
2381
2382   Export a symbol and mark it as a module destructor. This may be used
2383   together with the linker to build a table of destructor subroutines that
2384   are called by the startup code.
2385
2386   Note: The linker has a feature to build a table of marked routines, but it
2387   is your code that must call these routines, so just declaring a symbol as
2388   constructor does nothing by itself.
2389
2390   A destructor is always exported as an absolute (16 bit) symbol. You don't
2391   need to use an additional <tt/.export/ statement, this is implied by
2392   <tt/.destructor/. It may have an optional priority that is separated by a
2393   comma. Higher numerical values mean a higher priority. If no priority is
2394   given, the default priority of 7 is used. Be careful when assigning
2395   priorities to your own module destructors so they won't interfere with the
2396   ones in the cc65 library.
2397
2398   Example:
2399
2400   <tscreen><verb>
2401         .destructor     ModuleDone
2402         .destructor     ModDone, 16
2403   </verb></tscreen>
2404
2405   See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
2406   id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> commands and the separate
2407   section <ref id="condes" name="Module constructors/destructors"> explaining
2408   the feature in more detail.
2409
2410
2411 <sect1><tt>.DWORD</tt><label id=".DWORD"><p>
2412
2413   Define dword sized data (4 bytes) Must be followed by a sequence of
2414   expressions.
2415
2416   Example:
2417
2418   <tscreen><verb>
2419         .dword  $12344512, $12FA489
2420   </verb></tscreen>
2421
2422
2423 <sect1><tt>.ELSE</tt><label id=".ELSE"><p>
2424
2425   Conditional assembly: Reverse the current condition.
2426
2427
2428 <sect1><tt>.ELSEIF</tt><label id=".ELSEIF"><p>
2429
2430   Conditional assembly: Reverse current condition and test a new one.
2431
2432
2433 <sect1><tt>.END</tt><label id=".END"><p>
2434
2435   Forced end of assembly. Assembly stops at this point, even if the command
2436   is read from an include file.
2437
2438
2439 <sect1><tt>.ENDENUM</tt><label id=".ENDENUM"><p>
2440
2441   End a <tt><ref id=".ENUM" name=".ENUM"></tt> declaration.
2442
2443
2444 <sect1><tt>.ENDIF</tt><label id=".ENDIF"><p>
2445
2446   Conditional assembly: Close a <tt><ref id=".IF" name=".IF..."></tt> or
2447   <tt><ref id=".ELSE" name=".ELSE"></tt> branch.
2448
2449
2450 <sect1><tt>.ENDMAC, .ENDMACRO</tt><label id=".ENDMACRO"><p>
2451
2452   Marks the end of a macro definition.
2453
2454   See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
2455        <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>,
2456        <tt><ref id=".MACRO" name=".MACRO"></tt>
2457
2458   See also section <ref id="macros" name="Macros">.
2459
2460
2461 <sect1><tt>.ENDPROC</tt><label id=".ENDPROC"><p>
2462
2463   End of local lexical level (see <tt><ref id=".PROC" name=".PROC"></tt>).
2464
2465
2466 <sect1><tt>.ENDREP, .ENDREPEAT</tt><label id=".ENDREPEAT"><p>
2467
2468   End a <tt><ref id=".REPEAT" name=".REPEAT"></tt> block.
2469
2470
2471 <sect1><tt>.ENDSCOPE</tt><label id=".ENDSCOPE"><p>
2472
2473   End of local lexical level (see <tt/<ref id=".SCOPE" name=".SCOPE">/).
2474
2475
2476 <sect1><tt>.ENDSTRUCT</tt><label id=".ENDSTRUCT"><p>
2477
2478   Ends a struct definition. See the <tt/<ref id=".STRUCT" name=".STRUCT">/
2479   command and the separate section named <ref id="structs" name="&quot;Structs
2480   and unions&quot;">.
2481
2482
2483 <sect1><tt>.ENDUNION</tt><label id=".ENDUNION"><p>
2484
2485   Ends a union definition. See the <tt/<ref id=".UNION" name=".UNION">/
2486   command and the separate section named <ref id="structs" name="&quot;Structs
2487   and unions&quot;">.
2488
2489
2490 <sect1><tt>.ENUM</tt><label id=".ENUM"><p>
2491
2492   Start an enumeration. This directive is very similar to the C <tt/enum/
2493   keyword. If a name is given, a new scope is created for the enumeration,
2494   otherwise the enumeration members are placed in the enclosing scope.
2495
2496   In the enumeration body, symbols are declared. The first symbol has a value
2497   of zero, and each following symbol will get the value of the preceding plus
2498   one. This behaviour may be overridden by an explicit assignment. Two symbols
2499   may have the same value.
2500
2501   Example:
2502
2503   <tscreen><verb>
2504         .enum   errorcodes
2505                 no_error
2506                 file_error
2507                 parse_error
2508         .endenum
2509   </verb></tscreen>
2510
2511   Above example will create a new scope named <tt/errorcodes/ with three
2512   symbols in it that get the values 0, 1 and 2 respectively. Another way
2513   to write this would have been:
2514
2515   <tscreen><verb>
2516         .scope  errorcodes
2517                 no_error        = 0
2518                 file_error      = 1
2519                 parse_error     = 2
2520         .endscope
2521   </verb></tscreen>
2522
2523   Please note that explicit scoping must be used to access the identifiers:
2524
2525   <tscreen><verb>
2526         .word   errorcodes::no_error
2527   </verb></tscreen>
2528
2529   A more complex example:
2530
2531   <tscreen><verb>
2532         .enum
2533                 EUNKNOWN        = -1
2534                 EOK
2535                 EFILE
2536                 EBUSY
2537                 EAGAIN
2538                 EWOULDBLOCK     = EAGAIN
2539         .endenum
2540   </verb></tscreen>
2541
2542   In this example, the enumeration does not have a name, which means that the
2543   members will be visible in the enclosing scope and can be used in this scope
2544   without explicit scoping. The first member (<tt/EUNKNOWN/) has the value -1.
2545   The value for the following members is incremented by one, so <tt/EOK/ would
2546   be zero and so on. <tt/EWOULDBLOCK/ is an alias for <tt/EGAIN/, so it has an
2547   override for the value using an already defined symbol.
2548
2549
2550 <sect1><tt>.ERROR</tt><label id=".ERROR"><p>
2551
2552   Force an assembly error. The assembler will output an error message
2553   preceded by "User error". Assembly is continued but no object file will
2554   generated.
2555
2556   This command may be used to check for initial conditions that must be
2557   set before assembling a source file.
2558
2559   Example:
2560
2561   <tscreen><verb>
2562         .if     foo = 1
2563         ...
2564         .elseif bar = 1
2565         ...
2566         .else
2567         .error  "Must define foo or bar!"
2568         .endif
2569   </verb></tscreen>
2570
2571   See also: <tt><ref id=".FATAL" name=".FATAL"></tt>,
2572             <tt><ref id=".OUT" name=".OUT"></tt>,
2573             <tt><ref id=".WARNING" name=".WARNING"></tt>
2574
2575
2576 <sect1><tt>.EXITMAC, .EXITMACRO</tt><label id=".EXITMACRO"><p>
2577
2578   Abort a macro expansion immediately. This command is often useful in
2579   recursive macros.
2580
2581   See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
2582        <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
2583        <tt><ref id=".MACRO" name=".MACRO"></tt>
2584
2585   See also section <ref id="macros" name="Macros">.
2586
2587
2588 <sect1><tt>.EXPORT</tt><label id=".EXPORT"><p>
2589
2590   Make symbols accessible from other modules. Must be followed by a comma
2591   separated list of symbols to export, with each one optionally followed by an
2592   address specification and (also optional) an assignment. Using an additional
2593   assignment in the export statement allows to define and export a symbol in
2594   one statement. The default is to export the symbol with the address size it
2595   actually has. The assembler will issue a warning, if the symbol is exported
2596   with an address size smaller than the actual address size.
2597
2598   Examples:
2599
2600   <tscreen><verb>
2601         .export foo
2602         .export bar: far
2603         .export foobar: far = foo * bar
2604         .export baz := foobar, zap: far = baz - bar
2605   </verb></tscreen>
2606
2607   As with constant definitions, using <tt/:=/ instead of <tt/=/ marks the
2608   symbols as a label.
2609
2610   See: <tt><ref id=".EXPORTZP" name=".EXPORTZP"></tt>
2611
2612
2613 <sect1><tt>.EXPORTZP</tt><label id=".EXPORTZP"><p>
2614
2615   Make symbols accessible from other modules. Must be followed by a comma
2616   separated list of symbols to export. The exported symbols are explicitly
2617   marked as zero page symbols. An assignment may be included in the
2618   <tt/.EXPORTZP/ statement. This allows to define and export a symbol in one
2619   statement.
2620
2621   Examples:
2622
2623   <tscreen><verb>
2624         .exportzp  foo, bar
2625         .exportzp  baz := &dollar;02
2626   </verb></tscreen>
2627
2628   See: <tt><ref id=".EXPORT" name=".EXPORT"></tt>
2629
2630
2631 <sect1><tt>.FARADDR</tt><label id=".FARADDR"><p>
2632
2633   Define far (24 bit) address data. The command must be followed by a
2634   sequence of (not necessarily constant) expressions.
2635
2636   Example:
2637
2638   <tscreen><verb>
2639         .faraddr        DrawCircle, DrawRectangle, DrawHexagon
2640   </verb></tscreen>
2641
2642   See: <tt><ref id=".ADDR" name=".ADDR"></tt>
2643
2644
2645 <sect1><tt>.FATAL</tt><label id=".FATAL"><p>
2646
2647   Force an assembly error and terminate assembly. The assembler will output an
2648   error message preceded by "User error" and will terminate assembly
2649   immediately.
2650
2651   This command may be used to check for initial conditions that must be
2652   set before assembling a source file.
2653
2654   Example:
2655
2656   <tscreen><verb>
2657         .if     foo = 1
2658         ...
2659         .elseif bar = 1
2660         ...
2661         .else
2662         .fatal  "Must define foo or bar!"
2663         .endif
2664   </verb></tscreen>
2665
2666   See also: <tt><ref id=".ERROR" name=".ERROR"></tt>,
2667             <tt><ref id=".OUT" name=".OUT"></tt>,
2668             <tt><ref id=".WARNING" name=".WARNING"></tt>
2669
2670
2671 <sect1><tt>.FEATURE</tt><label id=".FEATURE"><p>
2672
2673   This directive may be used to enable one or more compatibility features
2674   of the assembler. While the use of <tt/.FEATURE/ should be avoided when
2675   possible, it may be useful when porting sources written for other
2676   assemblers. There is no way to switch a feature off, once you have
2677   enabled it, so using
2678
2679   <tscreen><verb>
2680         .FEATURE        xxx
2681   </verb></tscreen>
2682
2683   will enable the feature until end of assembly is reached.
2684
2685   The following features are available:
2686
2687   <descrip>
2688
2689   <tag><tt>addrsize</tt><label id="addrsize"></tag>
2690
2691     Enables the .ADDRSIZE pseudo function. This function is experimental and not enabled by default.
2692
2693     See also: <tt><ref id=".ADDRSIZE" name=".ADDRSIZE"></tt>
2694
2695   <tag><tt>at_in_identifiers</tt><label id="at_in_identifiers"></tag>
2696
2697     Accept the at character (`@') as a valid character in identifiers. The
2698     at character is not allowed to start an identifier, even with this
2699     feature enabled.
2700
2701   <tag><tt>c_comments</tt><label id="c_comments"></tag>
2702
2703     Allow C like comments using <tt>/*</tt> and <tt>*/</tt> as left and right
2704     comment terminators. Note that C comments may not be nested. There's also a
2705     pitfall when using C like comments: All statements must be terminated by
2706     "end-of-line". Using C like comments, it is possible to hide the newline,
2707     which results in error messages. See the following non working example:
2708
2709     <tscreen><verb>
2710         lda     #$00  /* This comment hides the newline
2711 */      sta     $82
2712     </verb></tscreen>
2713
2714   <tag><tt>dollar_in_identifiers</tt><label id="dollar_in_identifiers"></tag>
2715
2716     Accept the dollar sign (`&dollar;') as a valid character in identifiers. The
2717     dollar character is not allowed to start an identifier, even with this
2718     feature enabled.
2719
2720   <tag><tt>dollar_is_pc</tt><label id="dollar_is_pc"></tag>
2721
2722     The dollar sign may be used as an alias for the star (`*'), which
2723     gives the value of the current PC in expressions.
2724     Note: Assignment to the pseudo variable is not allowed.
2725
2726   <tag><tt>force_range</tt><label id="force_range"></tag>
2727
2728     Force expressions into their valid range for immediate addressing and
2729     storage operators like <tt><ref id=".BYTE" name=".BYTE"></tt> and
2730     <tt><ref id=".WORD" name=".WORD"></tt>. Be very careful with this one,
2731     since it will completely disable error checks.
2732
2733   <tag><tt>labels_without_colons</tt><label id="labels_without_colons"></tag>
2734
2735     Allow labels without a trailing colon. These labels are only accepted,
2736     if they start at the beginning of a line (no leading white space).
2737
2738   <tag><tt>leading_dot_in_identifiers</tt><label id="leading_dot_in_identifiers"></tag>
2739
2740     Accept the dot (`.') as the first character of an identifier. This may be
2741     used for example to create macro names that start with a dot emulating
2742     control directives of other assemblers. Note however, that none of the
2743     reserved keywords built into the assembler, that starts with a dot, may be
2744     overridden. When using this feature, you may also get into trouble if
2745     later versions of the assembler define new keywords starting with a dot.
2746
2747   <tag><tt>loose_char_term</tt><label id="loose_char_term"></tag>
2748
2749     Accept single quotes as well as double quotes as terminators for char
2750     constants.
2751
2752   <tag><tt>loose_string_term</tt><label id="loose_string_term"></tag>
2753
2754     Accept single quotes as well as double quotes as terminators for string
2755     constants.
2756
2757   <tag><tt>missing_char_term</tt><label id="missing_char_term"></tag>
2758
2759     Accept single quoted character constants where the terminating quote is
2760     missing.
2761     <tscreen><verb>
2762         lda     #'a
2763     </verb></tscreen>
2764     <em/Note:/ This does not work in conjunction with <tt/.FEATURE
2765     loose_string_term/, since in this case the input would be ambiguous.
2766
2767   <tag><tt>org_per_seg</tt><label id="org_per_seg"></tag>
2768
2769     This feature makes relocatable/absolute mode local to the current segment.
2770     Using <tt><ref id=".ORG" name=".ORG"></tt> when <tt/org_per_seg/ is in
2771     effect will only enable absolute mode for the current segment. Dito for
2772     <tt><ref id=".RELOC" name=".RELOC"></tt>.
2773
2774   <tag><tt>pc_assignment</tt><label id="pc_assignment"></tag>
2775
2776     Allow assignments to the PC symbol (`*' or `&dollar;' if <tt/dollar_is_pc/
2777     is enabled). Such an assignment is handled identical to the <tt><ref
2778     id=".ORG" name=".ORG"></tt> command (which is usually not needed, so just
2779     removing the lines with the assignments may also be an option when porting
2780     code written for older assemblers).
2781
2782   <tag><tt>ubiquitous_idents</tt><label id="ubiquitous_idents"></tag>
2783
2784     Allow the use of instructions names as names for macros and symbols. This
2785     makes it possible to "overload" instructions by defining a macro with the
2786     same name. This does also make it possible to introduce hard to find errors
2787     in your code, so be careful!
2788
2789   <tag><tt>underline_in_numbers</tt><label id="underline_in_numbers"></tag>
2790
2791     Allow underlines within numeric constants. These may be used for grouping
2792     the digits of numbers for easier reading.
2793     Example:
2794     <tscreen><verb>
2795         .feature        underline_in_numbers
2796         .word           %1100001110100101
2797         .word           %1100_0011_1010_0101    ; Identical but easier to read
2798     </verb></tscreen>
2799
2800   </descrip>
2801
2802   It is also possible to specify features on the command line using the
2803   <tt><ref id="option--feature" name="--feature"></tt> command line option.
2804   This is useful when translating sources written for older assemblers, when
2805   you don't want to change the source code.
2806
2807   As an example, to translate sources written for Andre Fachats xa65
2808   assembler, the features
2809
2810   <verb>
2811         labels_without_colons, pc_assignment, loose_char_term
2812   </verb>
2813
2814   may be helpful. They do not make ca65 completely compatible, so you may not
2815   be able to translate the sources without changes, even when enabling these
2816   features. However, I have found several sources that translate without
2817   problems when enabling these features on the command line.
2818
2819
2820 <sect1><tt>.FILEOPT, .FOPT</tt><label id=".FOPT"><p>
2821
2822   Insert an option string into the object file. There are two forms of
2823   this command, one specifies the option by a keyword, the second
2824   specifies it as a number. Since usage of the second one needs knowledge
2825   of the internal encoding, its use is not recommended and I will only
2826   describe the first form here.
2827
2828   The command is followed by one of the keywords
2829
2830   <tscreen><verb>
2831         author
2832         comment
2833         compiler
2834   </verb></tscreen>
2835
2836   a comma and a string. The option is written into the object file
2837   together with the string value. This is currently unidirectional and
2838   there is no way to actually use these options once they are in the
2839   object file.
2840
2841   Examples:
2842
2843   <tscreen><verb>
2844         .fileopt        comment, "Code stolen from my brother"
2845         .fileopt        compiler, "BASIC 2.0"
2846         .fopt           author, "J. R. User"
2847   </verb></tscreen>
2848
2849
2850 <sect1><tt>.FORCEIMPORT</tt><label id=".FORCEIMPORT"><p>
2851
2852   Import an absolute symbol from another module. The command is followed by a
2853   comma separated list of symbols to import. The command is similar to <tt>
2854   <ref id=".IMPORT" name=".IMPORT"></tt>, but the import reference is always
2855   written to the generated object file, even if the symbol is never referenced
2856   (<tt><ref id=".IMPORT" name=".IMPORT"></tt> will not generate import
2857   references for unused symbols).
2858
2859   Example:
2860
2861   <tscreen><verb>
2862         .forceimport    needthisone, needthistoo
2863   </verb></tscreen>
2864
2865   See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
2866
2867
2868 <sect1><tt>.GLOBAL</tt><label id=".GLOBAL"><p>
2869
2870   Declare symbols as global. Must be followed by a comma separated list of
2871   symbols to declare. Symbols from the list, that are defined somewhere in the
2872   source, are exported, all others are imported. Additional <tt><ref
2873   id=".IMPORT" name=".IMPORT"></tt> or <tt><ref id=".EXPORT"
2874   name=".EXPORT"></tt> commands for the same symbol are allowed.
2875
2876   Example:
2877
2878   <tscreen><verb>
2879         .global foo, bar
2880   </verb></tscreen>
2881
2882
2883 <sect1><tt>.GLOBALZP</tt><label id=".GLOBALZP"><p>
2884
2885   Declare symbols as global. Must be followed by a comma separated list of
2886   symbols to declare. Symbols from the list, that are defined somewhere in the
2887   source, are exported, all others are imported. Additional <tt><ref
2888   id=".IMPORTZP" name=".IMPORTZP"></tt> or <tt><ref id=".EXPORTZP"
2889   name=".EXPORTZP"></tt> commands for the same symbol are allowed. The symbols
2890   in the list are explicitly marked as zero page symbols.
2891
2892   Example:
2893
2894   <tscreen><verb>
2895         .globalzp foo, bar
2896   </verb></tscreen>
2897
2898 <sect1><tt>.HIBYTES</tt><label id=".HIBYTES"><p>
2899
2900   Define byte sized data by extracting only the high byte (that is, bits 8-15) from
2901   each expression.  This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
2902   the operator '>' prepended to each expression in its list.
2903
2904   Example:
2905
2906   <tscreen><verb>
2907         .lobytes         $1234, $2345, $3456, $4567
2908         .hibytes         $fedc, $edcb, $dcba, $cba9
2909   </verb></tscreen>
2910
2911   which is equivalent to
2912
2913   <tscreen><verb>
2914         .byte            $34, $45, $56, $67
2915         .byte            $fe, $ed, $dc, $cb
2916   </verb></tscreen>
2917
2918   Example:
2919
2920   <tscreen><verb>
2921         .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
2922
2923         TableLookupLo:   .lobytes MyTable
2924         TableLookupHi:   .hibytes MyTable
2925   </verb></tscreen>
2926
2927   which is equivalent to
2928
2929   <tscreen><verb>
2930         TableLookupLo:   .byte &lt;TableItem0, &lt;TableItem1, &lt;TableItem2, &lt;TableItem3
2931         TableLookupHi:   .byte &gt;TableItem0, &gt;TableItem1, &gt;TableItem2, &gt;TableItem3
2932   </verb></tscreen>
2933
2934   See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
2935             <tt><ref id=".LOBYTES" name=".LOBYTES"></tt>,
2936             <tt><ref id=".BANKBYTES" name=".BANKBYTES"></tt>
2937
2938
2939 <sect1><tt>.I16</tt><label id=".I16"><p>
2940
2941   Valid only in 65816 mode. Switch the index registers to 16 bit.
2942
2943   Note: This command will not emit any code, it will tell the assembler to
2944   create 16 bit operands for immediate operands.
2945
2946   See also the <tt><ref id=".I8" name=".I8"></tt> and <tt><ref id=".SMART"
2947   name=".SMART"></tt> commands.
2948
2949
2950 <sect1><tt>.I8</tt><label id=".I8"><p>
2951
2952   Valid only in 65816 mode. Switch the index registers to 8 bit.
2953
2954   Note: This command will not emit any code, it will tell the assembler to
2955   create 8 bit operands for immediate operands.
2956
2957   See also the <tt><ref id=".I16" name=".I16"></tt> and <tt><ref id=".SMART"
2958   name=".SMART"></tt> commands.
2959
2960
2961 <sect1><tt>.IF</tt><label id=".IF"><p>
2962
2963   Conditional assembly: Evaluate an expression and switch assembler output
2964   on or off depending on the expression. The expression must be a constant
2965   expression, that is, all operands must be defined.
2966
2967   A expression value of zero evaluates to FALSE, any other value evaluates
2968   to TRUE.
2969
2970
2971 <sect1><tt>.IFBLANK</tt><label id=".IFBLANK"><p>
2972
2973   Conditional assembly: Check if there are any remaining tokens in this line,
2974   and evaluate to FALSE if this is the case, and to TRUE otherwise. If the
2975   condition is not true, further lines are not assembled until an <tt><ref
2976   id=".ELSE" name=".ESLE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
2977   <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
2978
2979   This command is often used to check if a macro parameter was given. Since an
2980   empty macro parameter will evaluate to nothing, the condition will evaluate
2981   to TRUE if an empty parameter was given.
2982
2983   Example:
2984
2985   <tscreen><verb>
2986         .macro     arg1, arg2
2987         .ifblank   arg2
2988                    lda     #arg1
2989         .else
2990                    lda     #arg2
2991         .endif
2992         .endmacro
2993   </verb></tscreen>
2994
2995   See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
2996
2997
2998 <sect1><tt>.IFCONST</tt><label id=".IFCONST"><p>
2999
3000   Conditional assembly: Evaluate an expression and switch assembler output
3001   on or off depending on the constness of the expression.
3002
3003   A const expression evaluates to to TRUE, a non const expression (one
3004   containing an imported or currently undefined symbol) evaluates to
3005   FALSE.
3006
3007   See also: <tt><ref id=".CONST" name=".CONST"></tt>
3008
3009
3010 <sect1><tt>.IFDEF</tt><label id=".IFDEF"><p>
3011
3012   Conditional assembly: Check if a symbol is defined. Must be followed by
3013   a symbol name. The condition is true if the the given symbol is already
3014   defined, and false otherwise.
3015
3016   See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
3017
3018
3019 <sect1><tt>.IFNBLANK</tt><label id=".IFNBLANK"><p>
3020
3021   Conditional assembly: Check if there are any remaining tokens in this line,
3022   and evaluate to TRUE if this is the case, and to FALSE otherwise. If the
3023   condition is not true, further lines are not assembled until an <tt><ref
3024   id=".ELSE" name=".ELSE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
3025   <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
3026
3027   This command is often used to check if a macro parameter was given.
3028   Since an empty macro parameter will evaluate to nothing, the condition
3029   will evaluate to FALSE if an empty parameter was given.
3030
3031   Example:
3032
3033   <tscreen><verb>
3034         .macro     arg1, arg2
3035                    lda     #arg1
3036         .ifnblank  arg2
3037                    lda     #arg2
3038         .endif
3039         .endmacro
3040   </verb></tscreen>
3041
3042   See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
3043
3044
3045 <sect1><tt>.IFNDEF</tt><label id=".IFNDEF"><p>
3046
3047   Conditional assembly: Check if a symbol is defined. Must be followed by
3048   a symbol name. The condition is true if the the given symbol is not
3049   defined, and false otherwise.
3050
3051   See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
3052
3053
3054 <sect1><tt>.IFNREF</tt><label id=".IFNREF"><p>
3055
3056   Conditional assembly: Check if a symbol is referenced. Must be followed
3057   by a symbol name. The condition is true if if the the given symbol was
3058   not referenced before, and false otherwise.
3059
3060   See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
3061
3062
3063 <sect1><tt>.IFP02</tt><label id=".IFP02"><p>
3064
3065   Conditional assembly: Check if the assembler is currently in 6502 mode
3066   (see <tt><ref id=".P02" name=".P02"></tt> command).
3067
3068
3069 <sect1><tt>.IFP816</tt><label id=".IFP816"><p>
3070
3071   Conditional assembly: Check if the assembler is currently in 65816 mode
3072   (see <tt><ref id=".P816" name=".P816"></tt> command).
3073
3074
3075 <sect1><tt>.IFPC02</tt><label id=".IFPC02"><p>
3076
3077   Conditional assembly: Check if the assembler is currently in 65C02 mode
3078   (see <tt><ref id=".PC02" name=".PC02"></tt> command).
3079
3080
3081 <sect1><tt>.IFPSC02</tt><label id=".IFPSC02"><p>
3082
3083   Conditional assembly: Check if the assembler is currently in 65SC02 mode
3084   (see <tt><ref id=".PSC02" name=".PSC02"></tt> command).
3085
3086
3087 <sect1><tt>.IFREF</tt><label id=".IFREF"><p>
3088
3089   Conditional assembly: Check if a symbol is referenced. Must be followed
3090   by a symbol name. The condition is true if if the the given symbol was
3091   referenced before, and false otherwise.
3092
3093   This command may be used to build subroutine libraries in include files
3094   (you may use separate object modules for this purpose too).
3095
3096   Example:
3097
3098   <tscreen><verb>
3099         .ifref  ToHex                   ; If someone used this subroutine
3100         ToHex:  tay                     ; Define subroutine
3101                 lda     HexTab,y
3102                 rts
3103         .endif
3104   </verb></tscreen>
3105
3106   See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
3107
3108
3109 <sect1><tt>.IMPORT</tt><label id=".IMPORT"><p>
3110
3111   Import a symbol from another module. The command is followed by a comma
3112   separated list of symbols to import, with each one optionally followed by
3113   an address specification.
3114
3115   Example:
3116
3117   <tscreen><verb>
3118         .import foo
3119         .import bar: zeropage
3120   </verb></tscreen>
3121
3122   See: <tt><ref id=".IMPORTZP" name=".IMPORTZP"></tt>
3123
3124
3125 <sect1><tt>.IMPORTZP</tt><label id=".IMPORTZP"><p>
3126
3127   Import a symbol from another module. The command is followed by a comma
3128   separated list of symbols to import. The symbols are explicitly imported
3129   as zero page symbols (that is, symbols with values in byte range).
3130
3131   Example:
3132
3133   <tscreen><verb>
3134         .importzp       foo, bar
3135   </verb></tscreen>
3136
3137   See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
3138
3139
3140 <sect1><tt>.INCBIN</tt><label id=".INCBIN"><p>
3141
3142   Include a file as binary data. The command expects a string argument
3143   that is the name of a file to include literally in the current segment.
3144   In addition to that, a start offset and a size value may be specified,
3145   separated by commas. If no size is specified, all of the file from the
3146   start offset to end-of-file is used. If no start position is specified
3147   either, zero is assumed (which means that the whole file is inserted).
3148
3149   Example:
3150
3151   <tscreen><verb>
3152         ; Include whole file
3153         .incbin         "sprites.dat"
3154
3155         ; Include file starting at offset 256
3156         .incbin         "music.dat", $100
3157
3158         ; Read 100 bytes starting at offset 200
3159         .incbin         "graphics.dat", 200, 100
3160   </verb></tscreen>
3161
3162
3163 <sect1><tt>.INCLUDE</tt><label id=".INCLUDE"><p>
3164
3165   Include another file. Include files may be nested up to a depth of 16.
3166
3167   Example:
3168
3169   <tscreen><verb>
3170         .include        "subs.inc"
3171   </verb></tscreen>
3172
3173
3174 <sect1><tt>.INTERRUPTOR</tt><label id=".INTERRUPTOR"><p>
3175
3176   Export a symbol and mark it as an interruptor. This may be used together
3177   with the linker to build a table of interruptor subroutines that are called
3178   in an interrupt.
3179
3180   Note: The linker has a feature to build a table of marked routines, but it
3181   is your code that must call these routines, so just declaring a symbol as
3182   interruptor does nothing by itself.
3183
3184   An interruptor is always exported as an absolute (16 bit) symbol. You don't
3185   need to use an additional <tt/.export/ statement, this is implied by
3186   <tt/.interruptor/. It may have an optional priority that is separated by a
3187   comma. Higher numeric values mean a higher priority. If no priority is
3188   given, the default priority of 7 is used. Be careful when assigning
3189   priorities to your own module constructors so they won't interfere with the
3190   ones in the cc65 library.
3191
3192   Example:
3193
3194   <tscreen><verb>
3195         .interruptor    IrqHandler
3196         .interruptor    Handler, 16
3197   </verb></tscreen>
3198
3199   See the <tt><ref id=".CONDES" name=".CONDES"></tt> command and the separate
3200   section <ref id="condes" name="Module constructors/destructors"> explaining
3201   the feature in more detail.
3202
3203
3204 <sect1><tt>.ISMNEM, .ISMNEMONIC</tt><label id=".ISMNEMONIC"><p>
3205
3206   Builtin function. The function expects an identifier as argument in braces.
3207   The argument is evaluated, and the function yields "true" if the identifier
3208   is defined as an instruction mnemonic that is recognized by the assembler.
3209   Example:
3210
3211   <tscreen><verb>
3212         .if     .not .ismnemonic(ina)
3213                 .macro ina
3214                         clc
3215                         adc #$01
3216                 .endmacro
3217         .endif
3218   </verb></tscreen>
3219
3220
3221 <sect1><tt>.LINECONT</tt><label id=".LINECONT"><p>
3222
3223   Switch on or off line continuations using the backslash character
3224   before a newline. The option is off by default.
3225   Note: Line continuations do not work in a comment. A backslash at the
3226   end of a comment is treated as part of the comment and does not trigger
3227   line continuation.
3228   The command must be followed by a '+' or '-' character to switch the
3229   option on or off respectively.
3230
3231   Example:
3232
3233   <tscreen><verb>
3234         .linecont       +               ; Allow line continuations
3235
3236         lda     \
3237                 #$20                    ; This is legal now
3238   </verb></tscreen>
3239
3240
3241 <sect1><tt>.LIST</tt><label id=".LIST"><p>
3242
3243   Enable output to the listing. The command must be followed by a boolean
3244   switch ("on", "off", "+" or "-") and will enable or disable listing
3245   output.
3246   The option has no effect if the listing is not enabled by the command line
3247   switch -l. If -l is used, an internal counter is set to 1. Lines are output
3248   to the listing file, if the counter is greater than zero, and suppressed if
3249   the counter is zero. Each use of <tt/.LIST/ will increment or decrement the
3250   counter.
3251
3252   Example:
3253
3254   <tscreen><verb>
3255         .list   on              ; Enable listing output
3256   </verb></tscreen>
3257
3258
3259 <sect1><tt>.LISTBYTES</tt><label id=".LISTBYTES"><p>
3260
3261   Set, how many bytes are shown in the listing for one source line. The
3262   default is 12, so the listing will show only the first 12 bytes for any
3263   source line that generates more than 12 bytes of code or data.
3264   The directive needs an argument, which is either "unlimited", or an
3265   integer constant in the range 4..255.
3266
3267   Examples:
3268
3269   <tscreen><verb>
3270         .listbytes      unlimited       ; List all bytes
3271         .listbytes      12              ; List the first 12 bytes
3272         .incbin         "data.bin"      ; Include large binary file
3273   </verb></tscreen>
3274
3275
3276 <sect1><tt>.LOBYTES</tt><label id=".LOBYTES"><p>
3277
3278   Define byte sized data by extracting only the low byte (that is, bits 0-7) from
3279   each expression.  This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
3280   the operator '<' prepended to each expression in its list.
3281
3282   Example:
3283
3284   <tscreen><verb>
3285         .lobytes         $1234, $2345, $3456, $4567
3286         .hibytes         $fedc, $edcb, $dcba, $cba9
3287   </verb></tscreen>
3288
3289   which is equivalent to
3290
3291   <tscreen><verb>
3292         .byte            $34, $45, $56, $67
3293         .byte            $fe, $ed, $dc, $cb
3294   </verb></tscreen>
3295
3296   Example:
3297
3298   <tscreen><verb>
3299         .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
3300
3301         TableLookupLo:   .lobytes MyTable
3302         TableLookupHi:   .hibytes MyTable
3303   </verb></tscreen>
3304
3305   which is equivalent to
3306
3307   <tscreen><verb>
3308         TableLookupLo:   .byte &lt;TableItem0, &lt;TableItem1, &lt;TableItem2, &lt;TableItem3
3309         TableLookupHi:   .byte &gt;TableItem0, &gt;TableItem1, &gt;TableItem2, &gt;TableItem3
3310   </verb></tscreen>
3311
3312   See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
3313             <tt><ref id=".HIBYTES" name=".HIBYTES"></tt>,
3314             <tt><ref id=".BANKBYTES" name=".BANKBYTES"></tt>
3315
3316
3317 <sect1><tt>.LOCAL</tt><label id=".LOCAL"><p>
3318
3319   This command may only be used inside a macro definition. It declares a
3320   list of identifiers as local to the macro expansion.
3321
3322   A problem when using macros are labels: Since they don't change their name,
3323   you get a "duplicate symbol" error if the macro is expanded the second time.
3324   Labels declared with <tt><ref id=".LOCAL" name=".LOCAL"></tt> have their
3325   name mapped to an internal unique name (<tt/___ABCD__/) with each macro
3326   invocation.
3327
3328   Some other assemblers start a new lexical block inside a macro expansion.
3329   This has some drawbacks however, since that will not allow <em/any/ symbol
3330   to be visible outside a macro, a feature that is sometimes useful. The
3331   <tt><ref id=".LOCAL" name=".LOCAL"></tt> command is in my eyes a better way
3332   to address the problem.
3333
3334   You get an error when using <tt><ref id=".LOCAL" name=".LOCAL"></tt> outside
3335   a macro.
3336
3337
3338 <sect1><tt>.LOCALCHAR</tt><label id=".LOCALCHAR"><p>
3339
3340   Defines the character that start "cheap" local labels. You may use one
3341   of '@' and '?' as start character. The default is '@'.
3342
3343   Cheap local labels are labels that are visible only between two non
3344   cheap labels. This way you can reuse identifiers like "<tt/loop/" without
3345   using explicit lexical nesting.
3346
3347   Example:
3348
3349   <tscreen><verb>
3350         .localchar      '?'
3351
3352         Clear:  lda     #$00            ; Global label
3353         ?Loop:  sta     Mem,y           ; Local label
3354                 dey
3355                 bne     ?Loop           ; Ok
3356                 rts
3357         Sub:    ...                     ; New global label
3358                 bne     ?Loop           ; ERROR: Unknown identifier!
3359   </verb></tscreen>
3360
3361
3362 <sect1><tt>.MACPACK</tt><label id=".MACPACK"><p>
3363
3364   Insert a predefined macro package. The command is followed by an
3365   identifier specifying the macro package to insert. Available macro
3366   packages are:
3367
3368   <tscreen><verb>
3369         atari           Defines the scrcode macro.
3370         cbm             Defines the scrcode macro.
3371         cpu             Defines constants for the .CPU variable.
3372         generic         Defines generic macroes like add, sub, and blt.
3373         longbranch      Defines conditional long-jump macroes.
3374   </verb></tscreen>
3375
3376   Including a macro package twice, or including a macro package that
3377   redefines already existing macros will lead to an error.
3378
3379   Example:
3380
3381   <tscreen><verb>
3382         .macpack        longbranch      ; Include macro package
3383
3384                 cmp     #$20            ; Set condition codes
3385                 jne     Label           ; Jump long on condition
3386   </verb></tscreen>
3387
3388   Macro packages are explained in more detail in section <ref
3389   id="macropackages" name="Macro packages">.
3390
3391
3392 <sect1><tt>.MAC, .MACRO</tt><label id=".MACRO"><p>
3393
3394   Start a classic macro definition. The command is followed by an identifier
3395   (the macro name) and optionally by a comma separated list of identifiers
3396   that are macro parameters. A macro definition is terminated by <tt><ref
3397   id=".ENDMACRO" name=".ENDMACRO"></tt>.
3398
3399   Example:
3400
3401   <tscreen><verb>
3402         .macro  ldax    arg             ; Define macro ldax
3403                 lda     arg
3404                 ldx     arg+1
3405   </verb></tscreen>
3406
3407   See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
3408        <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
3409        <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>
3410
3411   See also section <ref id="macros" name="Macros">.
3412
3413
3414 <sect1><tt>.ORG</tt><label id=".ORG"><p>
3415
3416   Start a section of absolute code. The command is followed by a constant
3417   expression that gives the new PC counter location for which the code is
3418   assembled. Use <tt><ref id=".RELOC" name=".RELOC"></tt> to switch back to
3419   relocatable code.
3420
3421   By default, absolute/relocatable mode is global (valid even when switching
3422   segments). Using <tt>.FEATURE <ref id="org_per_seg" name="org_per_seg"></tt>
3423   it can be made segment local.
3424
3425   Please note that you <em/do not need/ <tt/.ORG/ in most cases. Placing
3426   code at a specific address is the job of the linker, not the assembler, so
3427   there is usually no reason to assemble code to a specific address.
3428
3429   Example:
3430
3431   <tscreen><verb>
3432         .org    $7FF            ; Emit code starting at $7FF
3433   </verb></tscreen>
3434
3435
3436 <sect1><tt>.OUT</tt><label id=".OUT"><p>
3437
3438   Output a string to the console without producing an error. This command
3439   is similar to <tt/.ERROR/, however, it does not force an assembler error
3440   that prevents the creation of an object file.
3441
3442   Example:
3443
3444   <tscreen><verb>
3445         .out    "This code was written by the codebuster(tm)"
3446   </verb></tscreen>
3447
3448   See also: <tt><ref id=".ERROR" name=".ERROR"></tt>,
3449             <tt><ref id=".FATAL" name=".FATAL"></tt>,
3450             <tt><ref id=".WARNING" name=".WARNING"></tt>
3451
3452
3453 <sect1><tt>.P02</tt><label id=".P02"><p>
3454
3455   Enable the 6502 instruction set, disable 65SC02, 65C02 and 65816
3456   instructions. This is the default if not overridden by the
3457   <tt><ref id="option--cpu" name="--cpu"></tt> command line option.
3458
3459   See: <tt><ref id=".PC02" name=".PC02"></tt>, <tt><ref id=".PSC02"
3460   name=".PSC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3461
3462
3463 <sect1><tt>.P816</tt><label id=".P816"><p>
3464
3465   Enable the 65816 instruction set. This is a superset of the 65SC02 and
3466   6502 instruction sets.
3467
3468   See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PSC02"
3469   name=".PSC02"></tt> and <tt><ref id=".PC02" name=".PC02"></tt>
3470
3471
3472 <sect1><tt>.PAGELEN, .PAGELENGTH</tt><label id=".PAGELENGTH"><p>
3473
3474   Set the page length for the listing. Must be followed by an integer
3475   constant. The value may be "unlimited", or in the range 32 to 127. The
3476   statement has no effect if no listing is generated. The default value is -1
3477   (unlimited) but may be overridden by the <tt/--pagelength/ command line
3478   option. Beware: Since ca65 is a one pass assembler, the listing is generated
3479   after assembly is complete, you cannot use multiple line lengths with one
3480   source. Instead, the value set with the last <tt/.PAGELENGTH/ is used.
3481
3482   Examples:
3483
3484   <tscreen><verb>
3485         .pagelength     66              ; Use 66 lines per listing page
3486
3487         .pagelength     unlimited       ; Unlimited page length
3488   </verb></tscreen>
3489
3490
3491 <sect1><tt>.PC02</tt><label id=".PC02"><p>
3492
3493   Enable the 65C02 instructions set. This instruction set includes all
3494   6502 and 65SC02 instructions.
3495
3496   See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PSC02"
3497   name=".PSC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3498
3499
3500 <sect1><tt>.POPCPU</tt><label id=".POPCPU"><p>
3501
3502   Pop the last CPU setting from the stack, and activate it.
3503
3504   This command will switch back to the CPU that was last pushed onto the CPU
3505   stack using the <tt><ref id=".PUSHCPU" name=".PUSHCPU"></tt> command, and
3506   remove this entry from the stack.
3507
3508   The assembler will print an error message if the CPU stack is empty when
3509   this command is issued.
3510
3511   See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".PUSHCPU"
3512   name=".PUSHCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
3513
3514
3515 <sect1><tt>.POPSEG</tt><label id=".POPSEG"><p>
3516
3517   Pop the last pushed segment from the stack, and set it.
3518
3519   This command will switch back to the segment that was last pushed onto the
3520   segment stack using the <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
3521   command, and remove this entry from the stack.
3522
3523   The assembler will print an error message if the segment stack is empty
3524   when this command is issued.
3525
3526   See: <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
3527
3528
3529 <sect1><tt>.PROC</tt><label id=".PROC"><p>
3530
3531   Start a nested lexical level with the given name and adds a symbol with this
3532   name to the enclosing scope. All new symbols from now on are in the local
3533   lexical level and are accessible from outside only via <ref id="scopesyntax"
3534   name="explicit scope specification">. Symbols defined outside this local
3535   level may be accessed as long as their names are not used for new symbols
3536   inside the level. Symbols names in other lexical levels do not clash, so you
3537   may use the same names for identifiers. The lexical level ends when the
3538   <tt><ref id=".ENDPROC" name=".ENDPROC"></tt> command is read. Lexical levels
3539   may be nested up to a depth of 16 (this is an artificial limit to protect
3540   against errors in the source).
3541
3542   Note: Macro names are always in the global level and in a separate name
3543   space. There is no special reason for this, it's just that I've never
3544   had any need for local macro definitions.
3545
3546   Example:
3547
3548   <tscreen><verb>
3549         .proc   Clear           ; Define Clear subroutine, start new level
3550                 lda     #$00
3551         L1:     sta     Mem,y   ; L1 is local and does not cause a
3552                                 ; duplicate symbol error if used in other
3553                                 ; places
3554                 dey
3555                 bne     L1      ; Reference local symbol
3556                 rts
3557         .endproc                ; Leave lexical level
3558   </verb></tscreen>
3559
3560   See: <tt/<ref id=".ENDPROC" name=".ENDPROC">/ and <tt/<ref id=".SCOPE"
3561   name=".SCOPE">/
3562
3563
3564 <sect1><tt>.PSC02</tt><label id=".PSC02"><p>
3565
3566   Enable the 65SC02 instructions set. This instruction set includes all
3567   6502 instructions.
3568
3569   See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PC02"
3570   name=".PC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3571
3572
3573 <sect1><tt>.PUSHCPU</tt><label id=".PUSHCPU"><p>
3574
3575   Push the currently active CPU onto a stack. The stack has a size of 8
3576   entries.
3577
3578   <tt/.PUSHCPU/ allows together with <tt><ref id=".POPCPU"
3579   name=".POPCPU"></tt> to switch to another CPU and to restore the old CPU
3580   later, without knowledge of the current CPU setting.
3581
3582   The assembler will print an error message if the CPU stack is already full,
3583   when this command is issued.
3584
3585   See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".POPCPU"
3586   name=".POPCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
3587
3588
3589 <sect1><tt>.PUSHSEG</tt><label id=".PUSHSEG"><p>
3590
3591   Push the currently active segment onto a stack. The entries on the stack
3592   include the name of the segment and the segment type. The stack has a size
3593   of 16 entries.
3594
3595   <tt/.PUSHSEG/ allows together with <tt><ref id=".POPSEG" name=".POPSEG"></tt>
3596   to switch to another segment and to restore the old segment later, without
3597   even knowing the name and type of the current segment.
3598
3599   The assembler will print an error message if the segment stack is already
3600   full, when this command is issued.
3601
3602   See: <tt><ref id=".POPSEG" name=".POPSEG"></tt>
3603
3604
3605 <sect1><tt>.RELOC</tt><label id=".RELOC"><p>
3606
3607   Switch back to relocatable mode. See the <tt><ref id=".ORG"
3608   name=".ORG"></tt> command.
3609
3610
3611 <sect1><tt>.REPEAT</tt><label id=".REPEAT"><p>
3612
3613   Repeat all commands between <tt/.REPEAT/ and <tt><ref id=".ENDREPEAT"
3614   name=".ENDREPEAT"></tt> constant number of times. The command is followed by
3615   a constant expression that tells how many times the commands in the body
3616   should get repeated. Optionally, a comma and an identifier may be specified.
3617   If this identifier is found in the body of the repeat statement, it is
3618   replaced by the current repeat count (starting with zero for the first time
3619   the body is repeated).
3620
3621   <tt/.REPEAT/ statements may be nested. If you use the same repeat count
3622   identifier for a nested <tt/.REPEAT/ statement, the one from the inner
3623   level will be used, not the one from the outer level.
3624
3625   Example:
3626
3627   The following macro will emit a string that is "encrypted" in that all
3628   characters of the string are XORed by the value $55.
3629
3630   <tscreen><verb>
3631         .macro  Crypt   Arg
3632                 .repeat .strlen(Arg), I
3633                 .byte   .strat(Arg, I) ^ $55
3634                 .endrep
3635         .endmacro
3636   </verb></tscreen>
3637
3638   See: <tt><ref id=".ENDREPEAT" name=".ENDREPEAT"></tt>
3639
3640
3641 <sect1><tt>.RES</tt><label id=".RES"><p>
3642
3643   Reserve storage. The command is followed by one or two constant
3644   expressions. The first one is mandatory and defines, how many bytes of
3645   storage should be defined. The second, optional expression must by a
3646   constant byte value that will be used as value of the data. If there
3647   is no fill value given, the linker will use the value defined in the
3648   linker configuration file (default: zero).
3649
3650   Example:
3651
3652   <tscreen><verb>
3653         ; Reserve 12 bytes of memory with value $AA
3654         .res    12, $AA
3655   </verb></tscreen>
3656
3657
3658 <sect1><tt>.RODATA</tt><label id=".RODATA"><p>
3659
3660   Switch to the RODATA segment. The name of the RODATA segment is always
3661   "RODATA", so this is a shortcut for
3662
3663   <tscreen><verb>
3664         .segment  "RODATA"
3665   </verb></tscreen>
3666
3667   The RODATA segment is a segment that is used by the compiler for
3668   readonly data like string constants.
3669
3670   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
3671
3672
3673 <sect1><tt>.SCOPE</tt><label id=".SCOPE"><p>
3674
3675   Start a nested lexical level with the given name. All new symbols from now
3676   on are in the local lexical level and are accessible from outside only via
3677   <ref id="scopesyntax" name="explicit scope specification">. Symbols defined
3678   outside this local level may be accessed as long as their names are not used
3679   for new symbols inside the level. Symbols names in other lexical levels do
3680   not clash, so you may use the same names for identifiers. The lexical level
3681   ends when the <tt><ref id=".ENDSCOPE" name=".ENDSCOPE"></tt> command is
3682   read. Lexical levels may be nested up to a depth of 16 (this is an
3683   artificial limit to protect against errors in the source).
3684
3685   Note: Macro names are always in the global level and in a separate name
3686   space. There is no special reason for this, it's just that I've never
3687   had any need for local macro definitions.
3688
3689   Example:
3690
3691   <tscreen><verb>
3692         .scope  Error                   ; Start new scope named Error
3693                 None = 0                ; No error
3694                 File = 1                ; File error
3695                 Parse = 2               ; Parse error
3696         .endscope                       ; Close lexical level
3697
3698                 ...
3699                 lda #Error::File        ; Use symbol from scope Error
3700   </verb></tscreen>
3701
3702   See: <tt/<ref id=".ENDSCOPE" name=".ENDSCOPE">/ and <tt/<ref id=".PROC"
3703   name=".PROC">/
3704
3705
3706 <sect1><tt>.SEGMENT</tt><label id=".SEGMENT"><p>
3707
3708   Switch to another segment. Code and data is always emitted into a
3709   segment, that is, a named section of data. The default segment is
3710   "CODE". There may be up to 254 different segments per object file
3711   (and up to 65534 per executable). There are shortcut commands for
3712   the most common segments ("ZEROPAGE", "CODE", "RODATA", "DATA", and "BSS").
3713
3714   The command is followed by a string containing the segment name (there are
3715   some constraints for the name - as a rule of thumb use only those segment
3716   names that would also be valid identifiers). There may also be an optional
3717   address size separated by a colon. See the section covering <tt/<ref
3718   id="address-sizes" name="address sizes">/ for more information.
3719
3720   The default address size for a segment depends on the memory model specified
3721   on the command line. The default is "absolute", which means that you don't
3722   have to use an address size modifier in most cases.
3723
3724   "absolute" means that the is a segment with 16 bit (absolute) addressing.
3725   That is, the segment will reside somewhere in core memory outside the zero
3726   page. "zeropage" (8 bit) means that the segment will be placed in the zero
3727   page and direct (short) addressing is possible for data in this segment.
3728
3729   Beware: Only labels in a segment with the zeropage attribute are marked
3730   as reachable by short addressing. The `*' (PC counter) operator will
3731   work as in other segments and will create absolute variable values.
3732
3733   Please note that a segment cannot have two different address sizes. A
3734   segment specified as zeropage cannot be declared as being absolute later.
3735
3736   Examples:
3737
3738   <tscreen><verb>
3739         .segment "ROM2"                 ; Switch to ROM2 segment
3740         .segment "ZP2": zeropage        ; New direct segment
3741         .segment "ZP2"                  ; Ok, will use last attribute
3742         .segment "ZP2": absolute        ; Error, redecl mismatch
3743   </verb></tscreen>
3744
3745   See: <tt><ref id=".BSS" name=".BSS"></tt>, <tt><ref id=".CODE"
3746   name=".CODE"></tt>, <tt><ref id=".DATA" name=".DATA"></tt>, <tt><ref
3747   id=".RODATA" name=".RODATA"></tt>, and <tt><ref id=".ZEROPAGE"
3748   name=".ZEROPAGE"></tt>
3749
3750
3751 <sect1><tt>.SET</tt><label id=".SET"><p>
3752
3753   <tt/.SET/ is used to assign a value to a variable. See <ref id="variables"
3754   name="Numeric variables"> for a full description.
3755
3756
3757 <sect1><tt>.SETCPU</tt><label id=".SETCPU"><p>
3758
3759   Switch the CPU instruction set. The command is followed by a string that
3760   specifies the CPU. Possible values are those that can also be supplied to
3761   the <tt><ref id="option--cpu" name="--cpu"></tt> command line option,
3762   namely: 6502, 6502X, 65SC02, 65C02, 65816 and HuC6280.
3763
3764   See: <tt><ref id=".CPU" name=".CPU"></tt>,
3765        <tt><ref id=".IFP02" name=".IFP02"></tt>,
3766        <tt><ref id=".IFP816" name=".IFP816"></tt>,
3767        <tt><ref id=".IFPC02" name=".IFPC02"></tt>,
3768        <tt><ref id=".IFPSC02" name=".IFPSC02"></tt>,
3769        <tt><ref id=".P02" name=".P02"></tt>,
3770        <tt><ref id=".P816" name=".P816"></tt>,
3771        <tt><ref id=".PC02" name=".PC02"></tt>,
3772        <tt><ref id=".PSC02" name=".PSC02"></tt>
3773
3774
3775 <sect1><tt>.SMART</tt><label id=".SMART"><p>
3776
3777   Switch on or off smart mode. The command must be followed by a '+' or '-'
3778   character to switch the option on or off respectively. The default is off
3779   (that is, the assembler doesn't try to be smart), but this default may be
3780   changed by the -s switch on the command line.
3781
3782   In smart mode the assembler will do the following:
3783
3784   <itemize>
3785   <item>Track usage of the <tt/REP/ and <tt/SEP/ instructions in 65816 mode
3786         and update the operand sizes accordingly. If the operand of such an
3787         instruction cannot be evaluated by the assembler (for example, because
3788         the operand is an imported symbol), a warning is issued. Beware: Since
3789         the assembler cannot trace the execution flow this may lead to false
3790         results in some cases. If in doubt, use the <tt/.Inn/ and <tt/.Ann/
3791         instructions to tell the assembler about the current settings.
3792   <item>In 65816 mode, replace a <tt/RTS/ instruction by <tt/RTL/ if it is
3793         used within a procedure declared as <tt/far/, or if the procedure has
3794         no explicit address specification, but it is <tt/far/ because of the
3795         memory model used.
3796   </itemize>
3797
3798   Example:
3799
3800   <tscreen><verb>
3801         .smart                          ; Be smart
3802         .smart  -                       ; Stop being smart
3803   </verb></tscreen>
3804
3805   See: <tt><ref id=".A16" name=".A16"></tt>,
3806        <tt><ref id=".A8" name=".A8"></tt>,
3807        <tt><ref id=".I16" name=".I16"></tt>,
3808        <tt><ref id=".I8" name=".I8"></tt>
3809
3810
3811 <sect1><tt>.STRUCT</tt><label id=".STRUCT"><p>
3812
3813   Starts a struct definition. Structs are covered in a separate section named
3814   <ref id="structs" name="&quot;Structs and unions&quot;">.
3815
3816   See also: <tt><ref id=".ENDSTRUCT" name=".ENDSTRUCT"></tt>,
3817             <tt><ref id=".ENDUNION" name=".ENDUNION"></tt>,
3818             <tt><ref id=".UNION" name=".UNION"></tt>
3819
3820
3821 <sect1><tt>.TAG</tt><label id=".TAG"><p>
3822
3823   Allocate space for a struct or union.
3824
3825   Example:
3826
3827   <tscreen><verb>
3828         .struct Point
3829                 xcoord  .word
3830                 ycoord  .word
3831         .endstruct
3832
3833         .bss
3834                 .tag    Point           ; Allocate 4 bytes
3835   </verb></tscreen>
3836
3837
3838 <sect1><tt>.UNDEF, .UNDEFINE</tt><label id=".UNDEFINE"><p>
3839
3840   Delete a define style macro definition. The command is followed by an
3841   identifier which specifies the name of the macro to delete. Macro
3842   replacement is switched of when reading the token following the command
3843   (otherwise the macro name would be replaced by its replacement list).
3844
3845   See also the <tt><ref id=".DEFINE" name=".DEFINE"></tt> command and
3846   section <ref id="macros" name="Macros">.
3847
3848
3849 <sect1><tt>.UNION</tt><label id=".UNION"><p>
3850
3851   Starts a union definition. Unions are covered in a separate section named
3852   <ref id="structs" name="&quot;Structs and unions&quot;">.
3853
3854   See also: <tt><ref id=".ENDSTRUCT" name=".ENDSTRUCT"></tt>,
3855             <tt><ref id=".ENDUNION" name=".ENDUNION"></tt>,
3856             <tt><ref id=".STRUCT" name=".STRUCT"></tt>
3857
3858
3859 <sect1><tt>.WARNING</tt><label id=".WARNING"><p>
3860
3861   Force an assembly warning. The assembler will output a warning message
3862   preceded by "User warning". This warning will always be output, even if
3863   other warnings are disabled with the <tt><ref id="option-W" name="-W0"></tt>
3864   command line option.
3865
3866   This command may be used to output possible problems when assembling
3867   the source file.
3868
3869   Example:
3870
3871   <tscreen><verb>
3872         .macro  jne     target
3873                 .local L1
3874                 .ifndef target
3875                 .warning "Forward jump in jne, cannot optimize!"
3876                 beq     L1
3877                 jmp     target
3878         L1:
3879                 .else
3880                 ...
3881                 .endif
3882         .endmacro
3883   </verb></tscreen>
3884
3885   See also: <tt><ref id=".ERROR" name=".ERROR"></tt>,
3886             <tt><ref id=".FATAL" name=".FATAL"></tt>,
3887             <tt><ref id=".OUT" name=".OUT"></tt>
3888
3889
3890 <sect1><tt>.WORD</tt><label id=".WORD"><p>
3891
3892   Define word sized data. Must be followed by a sequence of (word ranged,
3893   but not necessarily constant) expressions.
3894
3895   Example:
3896
3897   <tscreen><verb>
3898         .word   $0D00, $AF13, _Clear
3899   </verb></tscreen>
3900
3901
3902 <sect1><tt>.ZEROPAGE</tt><label id=".ZEROPAGE"><p>
3903
3904   Switch to the ZEROPAGE segment and mark it as direct (zeropage) segment.
3905   The name of the ZEROPAGE segment is always "ZEROPAGE", so this is a
3906   shortcut for
3907
3908   <tscreen><verb>
3909         .segment  "ZEROPAGE": zeropage
3910   </verb></tscreen>
3911
3912   Because of the "zeropage" attribute, labels declared in this segment are
3913   addressed using direct addressing mode if possible. You <em/must/ instruct
3914   the linker to place this segment somewhere in the address range 0..$FF
3915   otherwise you will get errors.
3916
3917   See: <tt><ref id=".SEGMENT" name=".SEGMENT"></tt>
3918
3919
3920
3921 <sect>Macros<label id="macros"><p>
3922
3923
3924 <sect1>Introduction<p>
3925
3926 Macros may be thought of as "parametrized super instructions". Macros are
3927 sequences of tokens that have a name. If that name is used in the source
3928 file, the macro is "expanded", that is, it is replaced by the tokens that
3929 were specified when the macro was defined.
3930
3931
3932 <sect1>Macros without parameters<p>
3933
3934 In its simplest form, a macro does not have parameters. Here's an
3935 example:
3936
3937 <tscreen><verb>
3938         .macro  asr             ; Arithmetic shift right
3939                 cmp     #$80    ; Put bit 7 into carry
3940                 ror             ; Rotate right with carry
3941         .endmacro
3942 </verb></tscreen>
3943
3944 The macro above consists of two real instructions, that are inserted into
3945 the code, whenever the macro is expanded. Macro expansion is simply done
3946 by using the name, like this:
3947
3948 <tscreen><verb>
3949         lda     $2010
3950         asr
3951         sta     $2010
3952 </verb></tscreen>
3953
3954
3955 <sect1>Parametrized macros<p>
3956
3957 When using macro parameters, macros can be even more useful:
3958
3959 <tscreen><verb>
3960         .macro  inc16   addr
3961                 clc
3962                 lda     addr
3963                 adc     #$01
3964                 sta     addr
3965                 lda     addr+1
3966                 adc     #$00
3967                 sta     addr+1
3968         .endmacro
3969 </verb></tscreen>
3970
3971 When calling the macro, you may give a parameter, and each occurrence of
3972 the name "addr" in the macro definition will be replaced by the given
3973 parameter. So
3974
3975 <tscreen><verb>
3976         inc16   $1000
3977 </verb></tscreen>
3978
3979 will be expanded to
3980
3981 <tscreen><verb>
3982                 clc
3983                 lda     $1000
3984                 adc     #$01
3985                 sta     $1000
3986                 lda     $1000+1
3987                 adc     #$00
3988                 sta     $1000+1
3989 </verb></tscreen>
3990
3991 A macro may have more than one parameter, in this case, the parameters
3992 are separated by commas. You are free to give less parameters than the
3993 macro actually takes in the definition. You may also leave intermediate
3994 parameters empty. Empty parameters are replaced by empty space (that is,
3995 they are removed when the macro is expanded). If you have a look at our
3996 macro definition above, you will see, that replacing the "addr" parameter
3997 by nothing will lead to wrong code in most lines. To help you, writing
3998 macros with a variable parameter list, there are some control commands:
3999
4000 <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> tests the rest of the line and
4001 returns true, if there are any tokens on the remainder of the line. Since
4002 empty parameters are replaced by nothing, this may be used to test if a given
4003 parameter is empty. <tt><ref id=".IFNBLANK" name=".IFNBLANK"></tt> tests the
4004 opposite.
4005
4006 Look at this example:
4007
4008 <tscreen><verb>
4009         .macro  ldaxy   a, x, y
4010         .ifnblank       a
4011                 lda     #a
4012         .endif
4013         .ifnblank       x
4014                 ldx     #x
4015         .endif
4016         .ifnblank       y
4017                 ldy     #y
4018         .endif
4019         .endmacro
4020 </verb></tscreen>
4021
4022 This macro may be called as follows:
4023
4024 <tscreen><verb>
4025         ldaxy   1, 2, 3         ; Load all three registers
4026
4027         ldaxy   1, , 3          ; Load only a and y
4028
4029         ldaxy   , , 3           ; Load y only
4030 </verb></tscreen>
4031
4032 There's another helper command for determining, which macro parameters are
4033 valid: <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt> This command is
4034 replaced by the parameter count given, <em/including/ intermediate empty macro
4035 parameters:
4036
4037 <tscreen><verb>
4038         ldaxy   1               ; .PARAMCOUNT = 1
4039         ldaxy   1,,3            ; .PARAMCOUNT = 3
4040         ldaxy   1,2             ; .PARAMCOUNT = 2
4041         ldaxy   1,              ; .PARAMCOUNT = 2
4042         ldaxy   1,2,3           ; .PARAMCOUNT = 3
4043 </verb></tscreen>
4044
4045 Macro parameters may optionally be enclosed into curly braces. This allows the
4046 inclusion of tokens that would otherwise terminate the parameter (the comma in
4047 case of a macro parameter).
4048
4049 <tscreen><verb>
4050         .macro  foo     arg1, arg2
4051                 ...
4052         .endmacro
4053
4054                 foo     ($00,x)         ; Two parameters passed
4055                 foo     {($00,x)}       ; One parameter passed
4056 </verb></tscreen>
4057
4058 In the first case, the macro is called with two parameters: '<tt/(&dollar;00/'
4059 and 'x)'. The comma is not passed to the macro, since it is part of the
4060 calling sequence, not the parameters.
4061
4062 In the second case, '(&dollar;00,x)' is passed to the macro, this time
4063 including the comma.
4064
4065
4066 <sect1>Detecting parameter types<p>
4067
4068 Sometimes it is nice to write a macro that acts differently depending on the
4069 type of the argument supplied. An example would be a macro that loads a 16 bit
4070 value from either an immediate operand, or from memory. The <tt/<ref
4071 id=".MATCH" name=".MATCH">/ and <tt/<ref id=".XMATCH" name=".XMATCH">/
4072 functions will allow you to do exactly this:
4073
4074 <tscreen><verb>
4075         .macro  ldax    arg
4076                 .if (.match (.left (1, {arg}), #))
4077                     ; immediate mode
4078                     lda     #<(.right (.tcount ({arg})-1, {arg}))
4079                     ldx     #>(.right (.tcount ({arg})-1, {arg}))
4080                 .else
4081                     ; assume absolute or zero page
4082                     lda     arg
4083                     ldx     1+(arg)
4084                 .endif
4085         .endmacro
4086 </verb></tscreen>
4087
4088 Using the <tt/<ref id=".MATCH" name=".MATCH">/ function, the macro is able to
4089 check if its argument begins with a hash mark. If so, two immediate loads are
4090 emitted, Otherwise a load from an absolute zero page memory location is
4091 assumed. Please note how the curly braces are used to enclose parameters to
4092 pseudo functions handling token lists. This is necessary, because the token
4093 lists may include commas or parens, which would be treated by the assembler
4094 as end-of-list.
4095
4096 The macro can be used as
4097
4098 <tscreen><verb>
4099         foo:    .word   $5678
4100         ...
4101                 ldax    #$1234          ; X=$12, A=$34
4102         ...
4103                 ldax    foo             ; X=$56, A=$78
4104 </verb></tscreen>
4105
4106
4107 <sect1>Recursive macros<p>
4108
4109 Macros may be used recursively:
4110
4111 <tscreen><verb>
4112         .macro  push    r1, r2, r3
4113                 lda     r1
4114                 pha
4115         .if     .paramcount > 1
4116                 push    r2, r3
4117         .endif
4118         .endmacro
4119 </verb></tscreen>
4120
4121 There's also a special macro to help writing recursive macros: <tt><ref
4122 id=".EXITMACRO" name=".EXITMACRO"></tt> This command will stop macro expansion
4123 immediately:
4124
4125 <tscreen><verb>
4126         .macro  push    r1, r2, r3, r4, r5, r6, r7
4127         .ifblank        r1
4128                 ; First parameter is empty
4129                 .exitmacro
4130         .else
4131                 lda     r1
4132                 pha
4133         .endif
4134                 push    r2, r3, r4, r5, r6, r7
4135         .endmacro
4136 </verb></tscreen>
4137
4138 When expanding this macro, the expansion will push all given parameters
4139 until an empty one is encountered. The macro may be called like this:
4140
4141 <tscreen><verb>
4142         push    $20, $21, $32           ; Push 3 ZP locations
4143         push    $21                     ; Push one ZP location
4144 </verb></tscreen>
4145
4146
4147 <sect1>Local symbols inside macros<p>
4148
4149 Now, with recursive macros, <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> and
4150 <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt>, what else do you need?
4151 Have a look at the inc16 macro above. Here is it again:
4152
4153 <tscreen><verb>
4154         .macro  inc16   addr
4155                 clc
4156                 lda     addr
4157                 adc     #$01
4158                 sta     addr
4159                 lda     addr+1
4160                 adc     #$00
4161                 sta     addr+1
4162         .endmacro
4163 </verb></tscreen>
4164
4165 If you have a closer look at the code, you will notice, that it could be
4166 written more efficiently, like this:
4167
4168 <tscreen><verb>
4169         .macro  inc16   addr
4170                 inc     addr
4171                 bne     Skip
4172                 inc     addr+1
4173         Skip:
4174         .endmacro
4175 </verb></tscreen>
4176
4177 But imagine what happens, if you use this macro twice? Since the label "Skip"
4178 has the same name both times, you get a "duplicate symbol" error. Without a
4179 way to circumvent this problem, macros are not as useful, as they could be.
4180 One possible solution is the command <tt><ref id=".LOCAL" name=".LOCAL"></tt>.
4181 It declares one or more symbols as local to the macro expansion. The names of
4182 local variables are replaced by a unique name in each separate macro
4183 expansion. So we can solve the problem above by using <tt/.LOCAL/:
4184
4185 <tscreen><verb>
4186         .macro  inc16   addr
4187                 .local  Skip            ; Make Skip a local symbol
4188                 inc     addr
4189                 bne     Skip
4190                 inc     addr+1
4191         Skip:                           ; Not visible outside
4192         .endmacro
4193 </verb></tscreen>
4194
4195 Another solution is of course to start a new lexical block inside the macro
4196 that hides any labels:
4197
4198 <tscreen><verb>
4199         .macro  inc16   addr
4200         .proc
4201                 inc     addr
4202                 bne     Skip
4203                 inc     addr+1
4204         Skip:
4205         .endproc
4206         .endmacro
4207 </verb></tscreen>
4208
4209
4210 <sect1>C style macros<p>
4211
4212 Starting with version 2.5 of the assembler, there is a second macro type
4213 available: C style macros using the <tt/.DEFINE/ directive. These macros are
4214 similar to the classic macro type described above, but behaviour is sometimes
4215 different:
4216
4217 <itemize>
4218
4219 <item>  Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> may not
4220         span more than a line. You may use line continuation (see <tt><ref
4221         id=".LINECONT" name=".LINECONT"></tt>) to spread the definition over
4222         more than one line for increased readability, but the macro itself
4223         may not contain an end-of-line token.
4224
4225 <item>  Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> share
4226         the name space with classic macros, but they are detected and replaced
4227         at the scanner level. While classic macros may be used in every place,
4228         where a mnemonic or other directive is allowed, <tt><ref id=".DEFINE"
4229         name=".DEFINE"></tt> style macros are allowed anywhere in a line. So
4230         they are more versatile in some situations.
4231
4232 <item>  <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may take
4233         parameters. While classic macros may have empty parameters, this is
4234         not true for <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros.
4235         For this macro type, the number of actual parameters must match
4236         exactly the number of formal parameters.
4237
4238         To make this possible, formal parameters are enclosed in braces when
4239         defining the macro. If there are no parameters, the empty braces may
4240         be omitted.
4241
4242 <item>  Since <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may not
4243         contain end-of-line tokens, there are things that cannot be done. They
4244         may not contain several processor instructions for example. So, while
4245         some things may be done with both macro types, each type has special
4246         usages. The types complement each other.
4247
4248 </itemize>
4249
4250 Let's look at a few examples to make the advantages and disadvantages
4251 clear.
4252
4253 To emulate assemblers that use "<tt/EQU/" instead of "<tt/=/" you may use the
4254 following <tt/.DEFINE/:
4255
4256 <tscreen><verb>
4257         .define EQU     =
4258
4259         foo     EQU     $1234           ; This is accepted now
4260 </verb></tscreen>
4261
4262 You may use the directive to define string constants used elsewhere:
4263
4264 <tscreen><verb>
4265         ; Define the version number
4266         .define VERSION         "12.3a"
4267
4268         ; ... and use it
4269         .asciiz VERSION
4270 </verb></tscreen>
4271
4272 Macros with parameters may also be useful:
4273
4274 <tscreen><verb>
4275         .define DEBUG(message)  .out    message
4276
4277         DEBUG   "Assembling include file #3"
4278 </verb></tscreen>
4279
4280 Note that, while formal parameters have to be placed in braces, this is
4281 not true for the actual parameters. Beware: Since the assembler cannot
4282 detect the end of one parameter, only the first token is used. If you
4283 don't like that, use classic macros instead:
4284
4285 <tscreen><verb>
4286         .macro  DEBUG   message
4287                 .out    message
4288         .endmacro
4289 </verb></tscreen>
4290
4291 (This is an example where a problem can be solved with both macro types).
4292
4293
4294 <sect1>Characters in macros<p>
4295
4296 When using the <ref id="option-t" name="-t"> option, characters are translated
4297 into the target character set of the specific machine. However, this happens
4298 as late as possible. This means that strings are translated if they are part
4299 of a <tt><ref id=".BYTE" name=".BYTE"></tt> or <tt><ref id=".ASCIIZ"
4300 name=".ASCIIZ"></tt> command. Characters are translated as soon as they are
4301 used as part of an expression.
4302
4303 This behaviour is very intuitive outside of macros but may be confusing when
4304 doing more complex macros. If you compare characters against numeric values,
4305 be sure to take the translation into account.
4306
4307
4308 <sect1>Deleting macros<p>
4309
4310 Macros can be deleted. This will not work if the macro that should be deleted
4311 is currently expanded as in the following non working example:
4312
4313 <tscreen><verb>
4314         .macro  notworking
4315                 .delmacro       notworking
4316         .endmacro
4317
4318         notworking              ; Will not work
4319 </verb></tscreen>
4320
4321 The commands to delete classic and define style macros differ. Classic macros
4322 can be deleted by use of <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>, while
4323 for <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros, <tt><ref
4324 id=".UNDEFINE" name=".UNDEFINE"></tt> must be used. Example:
4325
4326 <tscreen><verb>
4327         .define value   1
4328         .macro  mac
4329                 .byte   2
4330         .endmacro
4331
4332                 .byte   value           ; Emit one byte with value 1
4333                 mac                     ; Emit another byte with value 2
4334
4335         .undefine value
4336         .delmacro mac
4337
4338                 .byte   value           ; Error: Unknown identifier
4339                 mac                     ; Error: Missing ":"
4340 </verb></tscreen>
4341
4342 A separate command for <tt>.DEFINE</tt> style macros was necessary, because
4343 the name of such a macro is replaced by its replacement list on a very low
4344 level. To get the actual name, macro replacement has to be switched off when
4345 reading the argument to <tt>.UNDEFINE</tt>. This does also mean that the
4346 argument to <tt>.UNDEFINE</tt> is not allowed to come from another
4347 <tt>.DEFINE</tt>. All this is not necessary for classic macros, so having two
4348 different commands increases flexibility.
4349
4350
4351 <sect>Macro packages<label id="macropackages"><p>
4352
4353 Using the <tt><ref id=".MACPACK" name=".MACPACK"></tt> directive, predefined
4354 macro packages may be included with just one command. Available macro packages
4355 are:
4356
4357
4358 <sect1><tt>.MACPACK generic</tt><p>
4359
4360 This macro package defines macroes that are useful in almost any program.
4361 Currently defined macroes are:
4362
4363 <tscreen><verb>
4364         .macro  add     Arg     ; add without carry
4365                 clc
4366                 adc     Arg
4367         .endmacro
4368
4369         .macro  sub     Arg     ; subtract without borrow
4370                 sec
4371                 sbc     Arg
4372         .endmacro
4373
4374         .macro  bge     Arg     ; branch on greater-than or equal
4375                 bcs     Arg
4376         .endmacro
4377
4378         .macro  blt     Arg     ; branch on less-than
4379                 bcc     Arg
4380         .endmacro
4381
4382         .macro  bgt     Arg     ; branch on greater-than
4383                 .local  L
4384                 beq     L
4385                 bcs     Arg
4386         L:
4387         .endmacro
4388
4389         .macro  ble     Arg     ; branch on less-than or equal
4390                 beq     Arg
4391                 bcc     Arg
4392         .endmacro
4393
4394         .macro  bnz     Arg     ; branch on not zero
4395                 bne     Arg
4396         .endmacro
4397
4398         .macro  bze     Arg     ; branch on zero
4399                 beq     Arg
4400         .endmacro
4401 </verb></tscreen>
4402
4403
4404 <sect1><tt>.MACPACK longbranch</tt><p>
4405
4406 This macro package defines long conditional jumps. They are named like the
4407 short counterpart but with the 'b' replaced by a 'j'. Here is a sample
4408 definition for the "<tt/jeq/" macro, the other macros are built using the same
4409 scheme:
4410
4411 <tscreen><verb>
4412         .macro  jeq     Target
4413                 .if     .def(Target) .and ((*+2)-(Target) <= 127)
4414                 beq     Target
4415                 .else
4416                 bne     *+5
4417                 jmp     Target
4418                 .endif
4419         .endmacro
4420 </verb></tscreen>
4421
4422 All macros expand to a short branch, if the label is already defined (back
4423 jump) and is reachable with a short jump. Otherwise the macro expands to a
4424 conditional branch with the branch condition inverted, followed by an absolute
4425 jump to the actual branch target.
4426
4427 The package defines the following macros:
4428
4429 <tscreen><verb>
4430         jeq, jne, jmi, jpl, jcs, jcc, jvs, jvc
4431 </verb></tscreen>
4432
4433
4434
4435 <sect1><tt>.MACPACK atari</tt><p>
4436
4437 This macro package defines a macro named <tt/scrcode/. It takes a string
4438 as argument and places this string into memory translated into screen codes.
4439
4440
4441 <sect1><tt>.MACPACK cbm</tt><p>
4442
4443 This macro package defines a macro named <tt/scrcode/. It takes a string
4444 as argument and places this string into memory translated into screen codes.
4445
4446
4447 <sect1><tt>.MACPACK cpu</tt><p>
4448
4449 This macro package does not define any macros but constants used to examine
4450 the value read from the <tt/<ref id=".CPU" name=".CPU">/ pseudo variable. For
4451 each supported CPU a constant similar to
4452
4453 <tscreen><verb>
4454     CPU_6502
4455     CPU_65SC02
4456     CPU_65C02
4457     CPU_65816
4458     CPU_SWEET16
4459     CPU_HUC6280
4460 </verb></tscreen>
4461
4462 is defined. These constants may be used to determine the exact type of the
4463 currently enabled CPU. In addition to that, for each CPU instruction set,
4464 another constant is defined:
4465
4466 <tscreen><verb>
4467     CPU_ISET_6502
4468     CPU_ISET_65SC02
4469     CPU_ISET_65C02
4470     CPU_ISET_65816
4471     CPU_ISET_SWEET16
4472     CPU_ISET_HUC6280
4473 </verb></tscreen>
4474
4475 The value read from the <tt/<ref id=".CPU" name=".CPU">/ pseudo variable may
4476 be checked with <tt/<ref id="operators" name=".BITAND">/ to determine if the
4477 currently enabled CPU supports a specific instruction set. For example the
4478 65C02 supports all instructions of the 65SC02 CPU, so it has the
4479 <tt/CPU_ISET_65SC02/ bit set in addition to its native <tt/CPU_ISET_65C02/
4480 bit. Using
4481
4482 <tscreen><verb>
4483         .if (.cpu .bitand CPU_ISET_65SC02)
4484                 lda     (sp)
4485         .else
4486                 ldy     #$00
4487                 lda     (sp),y
4488         .endif
4489 </verb></tscreen>
4490
4491 it is possible to determine if the
4492
4493 <tscreen><verb>
4494                 lda     (sp)
4495 </verb></tscreen>
4496
4497 instruction is supported, which is the case for the 65SC02, 65C02 and 65816
4498 CPUs (the latter two are upwards compatible to the 65SC02).
4499
4500   
4501 <sect1><tt>.MACPACK module</tt><p>
4502
4503 This macro package defines a macro named <tt/module_header/. It takes an
4504 identifier as argument and is used to define the header of a module both
4505 in the dynamic and static variant.
4506
4507
4508
4509 <sect>Predefined constants<label id="predefined-constants"><p>
4510
4511 For better orthogonality, the assembler defines similar symbols as the
4512 compiler, depending on the target system selected:
4513
4514 <itemize>
4515 <item><tt/__APPLE2__/ - Target system is <tt/apple2/ or <tt/apple2enh/
4516 <item><tt/__APPLE2ENH__/ - Target system is <tt/apple2enh/
4517 <item><tt/__ATARI5200__/ - Target system is <tt/atari5200/
4518 <item><tt/__ATARI__/ - Target system is <tt/atari/ or <tt/atarixl/
4519 <item><tt/__ATARIXL__/ - Target system is <tt/atarixl/
4520 <item><tt/__ATMOS__/ - Target system is <tt/atmos/
4521 <item><tt/__BBC__/ - Target system is <tt/bbc/
4522 <item><tt/__C128__/ - Target system is <tt/c128/
4523 <item><tt/__C16__/ - Target system is <tt/c16/ or <tt/plus4/
4524 <item><tt/__C64__/ - Target system is <tt/c64/
4525 <item><tt/__CBM__/ - Target is a Commodore system
4526 <item><tt/__CBM510__/ - Target system is <tt/cbm510/
4527 <item><tt/__CBM610__/ - Target system is <tt/cbm610/
4528 <item><tt/__GEOS__/ - Target is a GEOS system
4529 <item><tt/__GEOS_APPLE__/ - Target system is <tt/geos-apple/
4530 <item><tt/__GEOS_CBM__/ - Target system is <tt/geos-cbm/
4531 <item><tt/__LUNIX__/ - Target system is <tt/lunix/
4532 <item><tt/__LYNX__/ - Target system is <tt/lynx/
4533 <item><tt/__NES__/ - Target system is <tt/nes/
4534 <item><tt/__OSIC1P__/ - Target system is <tt/osic1p/
4535 <item><tt/__PET__/ - Target system is <tt/pet/
4536 <item><tt/__PLUS4__/ - Target system is <tt/plus4/
4537 <item><tt/__SIM6502__/ - Target system is <tt/sim6502/
4538 <item><tt/__SIM65C02__/ - Target system is <tt/sim65c02/
4539 <item><tt/__SUPERVISION__/ - Target system is <tt/supervision/
4540 <item><tt/__VIC20__/ - Target system is <tt/vic20/
4541 </itemize>
4542
4543
4544 <sect>Structs and unions<label id="structs"><p>
4545
4546 <sect1>Structs and unions Overview<p>
4547
4548 Structs and unions are special forms of <ref id="scopes" name="scopes">.  They
4549 are to some degree comparable to their C counterparts. Both have a list of
4550 members. Each member allocates storage and may optionally have a name, which,
4551 in case of a struct, is the offset from the beginning and, in case of a union,
4552 is always zero.
4553
4554
4555 <sect1>Declaration<p>
4556
4557 Here is an example for a very simple struct with two members and a total size
4558 of 4 bytes:
4559
4560 <tscreen><verb>
4561       .struct Point
4562               xcoord  .word
4563               ycoord  .word
4564       .endstruct
4565 </verb></tscreen>
4566
4567 A union shares the total space between all its members, its size is the same
4568 as that of the largest member. The offset of all members relative to the union
4569 is zero.
4570
4571 <tscreen><verb>
4572       .union  Entry
4573               index   .word
4574               ptr     .addr
4575       .endunion
4576 </verb></tscreen>
4577
4578 A struct or union must not necessarily have a name. If it is anonymous, no
4579 local scope is opened, the identifiers used to name the members are placed
4580 into the current scope instead.
4581
4582 A struct may contain unnamed members and definitions of local structs. The
4583 storage allocators may contain a multiplier, as in the example below:
4584
4585 <tscreen><verb>
4586       .struct Circle
4587               .struct Point
4588                       .word   2         ; Allocate two words
4589               .endstruct
4590               Radius  .word
4591       .endstruct
4592 </verb></tscreen>
4593
4594
4595 <sect1>The <tt/.TAG/ keyword<p>
4596
4597 Using the <ref id=".TAG" name=".TAG"> keyword, it is possible to reserve space
4598 for an already defined struct or unions within another struct:
4599
4600 <tscreen><verb>
4601       .struct Point
4602               xcoord  .word
4603               ycoord  .word
4604       .endstruct
4605
4606       .struct Circle
4607               Origin  .tag    Point
4608               Radius  .byte
4609       .endstruct
4610 </verb></tscreen>
4611
4612 Space for a struct or union may be allocated using the <ref id=".TAG"
4613 name=".TAG"> directive.
4614
4615 <tscreen><verb>
4616         C:      .tag    Circle
4617 </verb></tscreen>
4618
4619 Currently, members are just offsets from the start of the struct or union. To
4620 access a field of a struct, the member offset has to be added to the address
4621 of the struct itself:
4622
4623 <tscreen><verb>
4624         lda     C+Circle::Radius        ; Load circle radius into A
4625 </verb></tscreen>
4626
4627 This may change in a future version of the assembler.
4628
4629
4630 <sect1>Limitations<p>
4631
4632 Structs and unions are currently implemented as nested symbol tables (in fact,
4633 they were a by-product of the improved scoping rules). Currently, the
4634 assembler has no idea of types. This means that the <ref id=".TAG"
4635 name=".TAG"> keyword will only allocate space. You won't be able to initialize
4636 variables declared with <ref id=".TAG" name=".TAG">, and adding an embedded
4637 structure to another structure with <ref id=".TAG" name=".TAG"> will not make
4638 this structure accessible by using the '::' operator.
4639
4640
4641
4642 <sect>Module constructors/destructors<label id="condes"><p>
4643
4644 <em>Note:</em> This section applies mostly to C programs, so the explanation
4645 below uses examples from the C libraries. However, the feature may also be
4646 useful for assembler programs.
4647
4648
4649 <sect1>Module constructors/destructors Overview<p>
4650
4651 Using the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
4652 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
4653 name=".INTERRUPTOR"></tt> keywords it is possible to export functions in a
4654 special way. The linker is able to generate tables with all functions of a
4655 specific type. Such a table will <em>only</em> include symbols from object
4656 files that are linked into a specific executable. This may be used to add
4657 initialization and cleanup code for library modules, or a table of interrupt
4658 handler functions.
4659
4660 The C heap functions are an example where module initialization code is used.
4661 All heap functions (<tt>malloc</tt>, <tt>free</tt>, ...) work with a few
4662 variables that contain the start and the end of the heap, pointers to the free
4663 list and so on. Since the end of the heap depends on the size and start of the
4664 stack, it must be initialized at runtime. However, initializing these
4665 variables for programs that do not use the heap are a waste of time and
4666 memory.
4667
4668 So the central module defines a function that contains initialization code and
4669 exports this function using the <tt/.CONSTRUCTOR/ statement. If (and only if)
4670 this module is added to an executable by the linker, the initialization
4671 function will be placed into the table of constructors by the linker. The C
4672 startup code will call all constructors before <tt/main/ and all destructors
4673 after <tt/main/, so without any further work, the heap initialization code is
4674 called once the module is linked in.
4675
4676 While it would be possible to add explicit calls to initialization functions
4677 in the startup code, the new approach has several advantages:
4678
4679 <enum>
4680 <item>
4681 If a module is not included, the initialization code is not linked in and not
4682 called. So you don't pay for things you don't need.
4683
4684 <item>
4685 Adding another library that needs initialization does not mean that the
4686 startup code has to be changed. Before we had module constructors and
4687 destructors, the startup code for all systems had to be adjusted to call the
4688 new initialization code.
4689
4690 <item>
4691 The feature saves memory: Each additional initialization function needs just
4692 two bytes in the table (a pointer to the function).
4693
4694 </enum>
4695
4696
4697 <sect1>Calling order<p>
4698
4699 The symbols are sorted in increasing priority order by the linker when using
4700 one of the builtin linker configurations, so the functions with lower
4701 priorities come first and are followed by those with higher priorities. The C
4702 library runtime subroutine that walks over the function tables calls the
4703 functions starting from the top of the table - which means that functions with
4704 a high priority are called first.
4705
4706 So when using the C runtime, functions are called with high priority functions
4707 first, followed by low priority functions.
4708
4709
4710 <sect1>Pitfalls<p>
4711
4712 When using these special symbols, please take care of the following:
4713
4714 <itemize>
4715
4716 <item>
4717 The linker will only generate function tables, it will not generate code to
4718 call these functions. If you're using the feature in some other than the
4719 existing C environments, you have to write code to call all functions in a
4720 linker generated table yourself. See the <tt/condes/ and <tt/callirq/ modules
4721 in the C runtime for an example on how to do this.
4722
4723 <item>
4724 The linker will only add addresses of functions that are in modules linked to
4725 the executable. This means that you have to be careful where to place the
4726 condes functions. If initialization or an irq handler is needed for a group of
4727 functions, be sure to place the function into a module that is linked in
4728 regardless of which function is called by the user.
4729
4730 <item>
4731 The linker will generate the tables only when requested to do so by the
4732 <tt/FEATURE CONDES/ statement in the linker config file. Each table has to
4733 be requested separately.
4734
4735 <item>
4736 Constructors and destructors may have priorities. These priorities determine
4737 the order of the functions in the table. If your initialization or cleanup code
4738 does depend on other initialization or cleanup code, you have to choose the
4739 priority for the functions accordingly.
4740
4741 <item>
4742 Besides the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
4743 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
4744 name=".INTERRUPTOR"></tt> statements, there is also a more generic command:
4745 <tt><ref id=".CONDES" name=".CONDES"></tt>. This allows to specify an
4746 additional type. Predefined types are 0 (constructor), 1 (destructor) and 2
4747 (interruptor). The linker generates a separate table for each type on request.
4748
4749 </itemize>
4750
4751
4752 <sect>Porting sources from other assemblers<p>
4753
4754 Sometimes it is necessary to port code written for older assemblers to ca65.
4755 In some cases, this can be done without any changes to the source code by
4756 using the emulation features of ca65 (see <tt><ref id=".FEATURE"
4757 name=".FEATURE"></tt>). In other cases, it is necessary to make changes to the
4758 source code.
4759
4760 Probably the biggest difference is the handling of the <tt><ref id=".ORG"
4761 name=".ORG"></tt> directive. ca65 generates relocatable code, and placement is
4762 done by the linker. Most other assemblers generate absolute code, placement is
4763 done within the assembler and there is no external linker.
4764
4765 In general it is not a good idea to write new code using the emulation
4766 features of the assembler, but there may be situations where even this rule is
4767 not valid.
4768
4769 <sect1>TASS<p>
4770
4771 You need to use some of the ca65 emulation features to simulate the behaviour
4772 of such simple assemblers.
4773
4774 <enum>
4775 <item>Prepare your sourcecode like this:
4776
4777 <tscreen><verb>
4778         ; if you want TASS style labels without colons
4779         .feature labels_without_colons
4780
4781         ; if you want TASS style character constants
4782         ; ("a" instead of the default 'a')
4783         .feature loose_char_term
4784
4785                 .word *+2       ; the cbm load address
4786
4787                 [yourcode here]
4788 </verb></tscreen>
4789
4790 notice that the two emulation features are mostly useful for porting
4791 sources originally written in/for TASS, they are not needed for the
4792 actual "simple assembler operation" and are not recommended if you are
4793 writing new code from scratch.
4794
4795 <item>Replace all program counter assignments (which are not possible in ca65
4796 by default, and the respective emulation feature works different from what
4797 you'd expect) by another way to skip to memory locations, for example the
4798 <tt><ref id=".RES" name=".RES"></tt> directive.
4799
4800 <tscreen><verb>
4801         ; *=$2000
4802         .res $2000-*    ; reserve memory up to $2000
4803 </verb></tscreen>
4804
4805 Please note that other than the original TASS, ca65 can never move the program
4806 counter backwards - think of it as if you are assembling to disk with TASS.
4807
4808 <item>Conditional assembly (<tt/.ifeq//<tt/.endif//<tt/.goto/ etc.) must be
4809 rewritten to match ca65 syntax. Most importantly notice that due to the lack
4810 of <tt/.goto/, everything involving loops must be replaced by
4811 <tt><ref id=".REPEAT" name=".REPEAT"></tt>.
4812
4813 <item>To assemble code to a different address than it is executed at, use the
4814 <tt><ref id=".ORG" name=".ORG"></tt> directive instead of
4815 <tt/.offs/-constructs.
4816
4817 <tscreen><verb>
4818         .org $1800
4819
4820         [floppy code here]
4821
4822         .reloc  ; back to normal
4823 </verb></tscreen>
4824
4825 <item>Then assemble like this:
4826
4827 <tscreen><verb>
4828         cl65 --start-addr 0x0ffe -t none myprog.s -o myprog.prg
4829 </verb></tscreen>
4830
4831 Note that you need to use the actual start address minus two, since two bytes
4832 are used for the cbm load address.
4833
4834 </enum>
4835
4836
4837 <sect>Copyright<p>
4838
4839 ca65 (and all cc65 binutils) are (C) Copyright 1998-2003 Ullrich von
4840 Bassewitz. For usage of the binaries and/or sources the following
4841 conditions do apply:
4842
4843 This software is provided 'as-is', without any expressed or implied
4844 warranty.  In no event will the authors be held liable for any damages
4845 arising from the use of this software.
4846
4847 Permission is granted to anyone to use this software for any purpose,
4848 including commercial applications, and to alter it and redistribute it
4849 freely, subject to the following restrictions:
4850
4851 <enum>
4852 <item>  The origin of this software must not be misrepresented; you must not
4853         claim that you wrote the original software. If you use this software
4854         in a product, an acknowledgment in the product documentation would be
4855         appreciated but is not required.
4856 <item>  Altered source versions must be plainly marked as such, and must not
4857         be misrepresented as being the original software.
4858 <item>  This notice may not be removed or altered from any source
4859         distribution.
4860 </enum>
4861
4862
4863
4864 </article>
4865
4866
4867