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