]> git.sur5r.net Git - cc65/blob - doc/ca65.sgml
4201a5084ee99212c0701916fb8ffe4af8360bbb
[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>19.07.2000, 29.11.2000, 02.10.2001
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   -o name               Name the output file
100   -s                    Enable smart mode
101   -t sys                Set the target system
102   -v                    Increase verbosity
103
104 Long options:
105   --auto-import         Mark unresolved symbols as import
106   --cpu type            Set cpu type
107   --debug-info          Add debug info to object file
108   --feature name        Set an emulation feature
109   --help                Help (this text)
110   --ignore-case         Ignore case of symbols
111   --include-dir dir     Set an include directory search path
112   --listing             Create a listing if assembly was ok
113   --pagelength n        Set the page length for the listing
114   --smart               Enable smart mode
115   --target sys          Set the target system
116   --verbose             Increase verbosity
117   --version             Print the assembler version
118 ---------------------------------------------------------------------------
119 </verb></tscreen>
120
121
122 <sect1>Command line options in detail<p>
123
124 Here is a description of all the command line options:
125
126 <descrip>
127
128   <tag><tt>--cpu type</tt></tag>
129
130   Set the default for the CPU type. The option takes a parameter, which
131   may be one of
132
133         6502, 65C02, 65816 and sunplus
134
135   The latter (sunplus) is not available in the freeware version, because the
136   instruction set of the sunplus CPU is "confidential".
137
138
139   <label id="option--feature">
140   <tag><tt>--feature name</tt></tag>
141
142   Enable an emulation feature. This is identical as using <tt/.FEATURE/
143   in the source with two exceptions: Feature names must be lower case, and
144   each feature must be specified by using an extra <tt/--feature/ option,
145   comma separated lists are not allowed.
146
147   See the discussion of the <tt><ref id=".FEATURE" name=".FEATURE"></tt>
148   command for a list of emulation features.
149
150
151   <label id="option-g">
152   <tag><tt>-g, --debug-info</tt></tag>
153
154   When this option (or the equivalent control command <tt/.DEBUGINFO/) is
155   used, the assembler will add a section to the object file that contains
156   all symbols (including local ones) together with the symbol values and
157   source file positions. The linker will put these additional symbols into
158   the VICE label file, so even local symbols can be seen in the VICE
159   monitor.
160
161
162   <tag><tt>-h, --help</tt></tag>
163
164   Print the short option summary shown above.
165
166
167   <tag><tt>-i, --ignore-case</tt></tag>
168
169   This option makes the assembler case insensitive on identifiers and labels.
170   This option will override the default, but may itself be overriden by the
171   <tt><ref id=".CASE" name=".CASE"></tt> control command.
172
173
174   <tag><tt>-l, --listing</tt></tag>
175
176   Generate an assembler listing. The listing file will always have the
177   name of the main input file with the extension replaced by ".lst". This
178   may change in future versions.
179
180
181   <tag><tt>-o name</tt></tag>
182
183   The default output name is the name of the input file with the extension
184   replaced by ".o". If you don't like that, you may give another name with
185   the -o option. The output file will be placed in the same directory as
186   the source file, or, if -o is given, the full path in this name is used.
187
188
189   <tag><tt>--pagelength n</tt></tag>
190
191   sets the length of a listing page in lines. See the <tt><ref
192   id=".PAGELENGTH" name=".PAGELENGTH"></tt> directive for more information.
193
194
195   <tag><tt>-s, --smart-mode</tt></tag>
196
197   In smart mode (enabled by -s or the <tt><ref id=".SMART" name=".SMART"></tt>
198   pseudo instruction) the assembler will track usage of the <tt/REP/ and
199   <tt/SEP/ instructions in 65816 mode and update the operand sizes
200   accordingly. If the operand of such an instruction cannot be evaluated by
201   the assembler (for example, because the operand is an imported symbol), a
202   warning is issued.
203
204   Beware: Since the assembler cannot trace the execution flow this may
205   lead to false results in some cases. If in doubt, use the .ixx and .axx
206   instructions to tell the assembler about the current settings. Smart
207   mode is off by default.
208
209
210   <label id="option-t">
211   <tag><tt>-t sys, --target sys</tt></tag>
212
213   Set the target system. This will enable translation of character strings
214   and character constants into the character set of the target platform.
215   The default for the target system is "none", which means that no translation
216   will take place. The assembler supports the same target systems as the
217   compiler, see there for a list.
218
219
220   <tag><tt>-v, --verbose</tt></tag>
221
222   Increase the assembler verbosity. Usually only needed for debugging
223   purposes. You may use this option more than one time for even more
224   verbose output.
225
226
227   <tag><tt>-D</tt></tag>
228
229   This option allows you to define symbols on the command line. Without a
230   value, the symbol is defined with the value zero. When giving a value,
231   you may use the '&dollar;' prefix for hexadecimal symbols. Please note
232   that for some operating systems, '&dollar;' has a special meaning, so
233   you may have to quote the expression.
234
235
236   <tag><tt>-I dir, --include-dir dir</tt></tag>
237
238   Name a directory which is searched for include files. The option may be
239   used more than once to specify more than one directory to search. The
240   current directory is always searched first before considering any
241   additional directores.
242
243
244   <tag><tt>-U, --auto-import</tt></tag>
245
246   Mark symbols that are not defined in the sources as imported symbols. This
247   should be used with care since it delays error messages about typos and such
248   until the linker is run. The compiler uses the equivalent of this switch
249   (<tt><ref id=".AUTOIMPORT" name=".AUTOIMPORT"></tt>) to enable auto imported
250   symbols for the runtime library. However, the compiler is supposed to
251   generate code that runs through the assembler without problems, something
252   which is not always true for assembler programmers.
253
254
255   <tag><tt>-V, --version</tt></tag>
256
257   Print the version number of the assembler. If you send any suggestions
258   or bugfixes, please include the version number.
259
260
261   <label id="option-W">
262   <tag><tt>-Wn</tt></tag>
263
264   Set the warning level for the assembler. Using -W2 the assembler will
265   even warn about such things like unused imported symbols. The default
266   warning level is 1, and it would probably be silly to set it to
267   something lower.
268
269 </descrip>
270 <p>
271
272
273 <sect>Input format<p>
274
275 The assembler accepts the standard 6502/65816 assembler syntax. One line may
276 contain a label (which is identified by a colon), and, in addition to the
277 label, an assembler mnemonic, a macro, or a control command (see section <ref
278 id="control-commands" name="Control Commands"> for supported control
279 commands). Alternatively, the line may contain a symbol definition using the
280 '=' token. Everything after a semicolon is handled as a comment (that is, it
281 is ignored).
282
283 Here are some examples for valid input lines:
284
285 <tscreen><verb>
286         Label:                          ; A label and a comment
287                 lda     #$20            ; A 6502 instruction plus comment
288         L1:     ldx     #$20            ; Same with label
289         L2:     .byte   "Hello world"   ; Label plus control command
290                 mymac   $20             ; Macro expansion
291                 MySym = 3*L1            ; Symbol definition
292         MaSym   = Label                 ; Another symbol
293 </verb></tscreen>
294
295 The assembler accepts all valid 6502 mnemonics when in 6502 mode (the
296 default). The assembler accepts all valid 65SC02 mnemonics when in 65SC02 mode
297 (after a <tt><ref id=".PC02" name=".PC02"></tt> command is found). The
298 assembler accepts all valid 65816 mnemonics with a few exceptions after a
299 .P816 command is found. These exceptions are listed below.
300
301 In 65816 mode several aliases are accepted in addition to the official
302 mnemonics:
303
304 <tscreen><verb>
305         BGE is an alias for BCS
306         BLT is an alias for BCC
307         CPA is an alias for CMP
308         DEA is an alias for DEC A
309         INA is an alias for INC A
310         SWA is an alias for XBA
311         TAD is an alias for TCD
312         TAS is an alias for TCS
313         TDA is an alias for TDC
314         TSA is an alias for TSC
315 </verb></tscreen>
316
317 Evaluation of banked expressions in 65816 mode differs slightly from the
318 official syntax:
319
320 Instead of accepting a 24 bit address (something that is difficult for
321 the assembler to determine and would have required one more special
322 .import command), the bank and the absolute address in that bank are
323 separated by a dot:
324
325 <tscreen><verb>
326         jsl     3.$1234         ; Call subroutine at $1234 in bank 3
327 </verb></tscreen>
328
329 For literal values, the assembler accepts the widely used number formats:
330 A preceeding '&dollar;' denotes a hex value, a preceeding '%' denotes a
331 binary value, and a bare number is interpeted as a decimal. There are
332 currently no octal values and no floats.
333 <p>
334
335
336 <sect>Expressions<p>
337
338
339 <sect1>Expression evaluation<p>
340
341 All expressions are evaluated with (at least) 32 bit precision. An
342 expression may contain constant values and any combination of internal and
343 external symbols. Expressions that cannot be evaluated at assembly time
344 are stored inside the object file for evaluation by the linker.
345 Expressions referencing imported symbols must always be evaluated by the
346 linker.
347
348
349 <sect1>Size of an expressions result<p>
350
351 Sometimes, the assembler must know about the size of the value that is the
352 result of an expression. This is usually the case, if a decision has to be
353 made, to generate a zero page or an absolute memory references. In this
354 case, the assembler has to make some assumptions about the result of an
355 expression:
356
357 <itemize>
358 <item>  If the result of an expression is constant, the actual value is
359         checked to see if it's a byte sized expression or not.
360 <item>  If the expression is explicitly casted to a byte sized expression by
361         one of the '&gt;'/'&lt;' operators, it is a byte expression.
362 <item>  If this is not the case, and the expression contains a symbol,
363         explicitly declared as zero page symbol (by one of the .importzp or
364         .exportzp instructions), then the whole expression is assumed to be
365         byte sized.
366 <item>  If the expression contains symbols that are not defined, and these
367         symbols are local symbols, the enclosing scopes are searched for a
368         symbol with the same name. If one exists and this symbol is defined,
369         it's attributes are used to determine the result size.
370 <item>  In all other cases the expression is assumed to be word sized.
371 </itemize>
372
373 Note: If the assembler is not able to evaluate the expression at assembly
374 time, the linker will evaluate it and check for range errors as soon as
375 the result is known.
376
377
378 <sect1>Boolean expressions<p>
379
380 In the context of a boolean expression, any non zero value is evaluated as
381 true, any other value to false. The result of a boolean expression is 1 if
382 it's true, and zero if it's false. There are boolean operators with extrem
383 low precedence with version 2.x (where x &gt; 0). The <tt/.AND/ and <tt/.OR/
384 operators are shortcut operators. That is, if the result of the expression is
385 already known, after evaluating the left hand side, the right hand side is
386 not evaluated.
387
388
389 <sect1>Available operators<p>
390
391 Available operators sorted by precedence:
392
393 <tscreen><verb>
394     Op          Description                             Precedence
395   -------------------------------------------------------------------
396     .CONCAT     Builtin function                        0
397     .LEFT       Builtin function                        0
398     .MID        Builtin function                        0
399     .RIGHT      Builtin function                        0
400     .STRING     Builtin function                        0
401
402     *           Builtin pseudo variable (r/o)           1
403     .BLANK      Builtin function                        1
404     .CONST      Builtin function                        1
405     .CPU        Builtin pseudo variable (r/o)           1
406     .DEFINED    Builtin function                        1
407     .MATCH      Builtin function                        1
408     .TCOUNT     Builtin function                        1
409     .TIME       Builtin function                        1
410     .XMATCH     Builtin function                        1
411     .PARAMCOUNT Builtin pseudo variable (r/o)           1
412     .REFERENCED Builtin function                        1
413     ::          Global namespace override               1
414     +           Unary plus                              1
415     -           Unary minus                             1
416     ~           Unary bitwise not                       1
417     .BITNOT     Unary bitwise not                       1
418     &lt;           Low byte operator                       1
419     &gt;           High byte operator                      1
420
421     *           Multiplication                          2
422     /           Division                                2
423     .MOD        Modulo operation                        2
424     &amp;           Bitwise and                             2
425     .BITAND     Bitwise and                             2
426     ^           Bitwise xor                             2
427     .BITXOR     Bitwise xor                             2
428     &lt;&lt;          Shift left operator                     2
429     .SHL        Shift left operator                     2
430     &gt;&gt;          Shift right operator
431     .SHR        Shift right operator                    2
432
433     +           Binary plus                             3
434     -           Binary minus                            3
435     |           Binary or                               3
436     .BITOR      Binary or                               3
437
438     =           Compare operation (equal)               4
439     &lt;&gt;          Compare operation (not equal)           4
440     &lt;           Compare operation (less)                4
441     &gt;           Compare operation (greater)             4
442     &lt;=          Compare operation (less or equal)       4
443     &gt;=          Compare operation (greater or equal)    4
444
445     &amp;&amp;          Boolean and                             5
446     .AND        Boolean and                             5
447     .XOR        Boolean xor                             5
448
449     ||          Boolean or                              6
450     .OR         Boolean or                              6
451
452     !           Boolean not                             7
453     .NOT        Boolean not                             7
454 </verb></tscreen>
455
456
457 To force a specific order of evaluation, braces may be used as usual.
458
459 Some of the pseudo variables mentioned above need some more explanation:
460
461 <tscreen><verb>
462   *             This symbol is replaced by the value of the program
463                 counter at start of the current instruction. Note, that
464                 '*' yields a rvalue, that means, you cannot assign to it.
465                 Use <tt/.ORG/ to set the program counter in sections with
466                 absolute code.
467 </verb></tscreen>
468 <p>
469
470
471
472 <sect>Symbols and labels<p>
473
474 The assembler allows you to use symbols instead of naked values to make
475 the source more readable. There are a lot of different ways to define and
476 use symbols and labels, giving a lot of flexibility.
477
478
479 <sect1>Numeric constants<p>
480
481 Numeric constants are defined using the equal sign. After doing
482
483 <tscreen><verb>
484       two = 2
485 </verb></tscreen>
486
487 may use the symbol "two" in every place where a number is expected, and it is
488 evaluated to the value 2 in this context. An example would be
489
490 <tscreen><verb>
491       four = two * two
492 </verb></tscreen>
493
494
495 <sect1>Standard labels<p>
496
497 A label is defined by writing the name of the label at the start of the line
498 (before any instruction mnemonic, macro or pseudo directive), followed by a
499 colon. This will declare a symbol with the given name and the value of the
500 current program counter.
501
502
503 <sect1>Local labels and symbols<p>
504
505 Using the <tt><ref id=".PROC" name=".PROC"></tt> directive, it is possible to
506 create regions of code where the names of labels and symbols are local to this
507 region. They are not known outside of this region and cannot be accessed from
508 there. Such regions may be nested like PROCEDUREs in Pascal.
509
510 See the description of the <tt><ref id=".PROC" name=".PROC"></tt>
511 directive for more information.
512
513
514 <sect1>Cheap local labels<p>
515
516 Cheap local labels are defined like standard labels, but the name of the
517 label must begin with a special symbol (usually '@', but this can be
518 changed by the <tt><ref id=".LOCALCHAR" name=".LOCALCHAR"></tt>
519 directive).
520
521 Cheap local labels are visible only between two non cheap labels. As soon as a
522 standard symbol is encountered (this may also be a local symbol if inside a
523 region defined with the <tt><ref id=".PROC" name=".PROC"></tt> directive), the
524 cheap local symbol goes out of scope.
525
526 You may use cheap local labels as an easy way to reuse common label
527 names like "Loop". Here is an example:
528
529 <tscreen><verb>
530         Clear:  lda    #$00             ; Global label
531                 ldy    #$20
532         @Loop:  sta    Mem,y            ; Local label
533                 dey
534                 bne    @Loop            ; Ok
535                 rts
536         Sub:    ...                     ; New global label
537                 bne    @Loop            ; ERROR: Unknown identifier!
538 </verb></tscreen>
539
540 <sect1>Unnamed labels<p>
541
542 If you really want to write messy code, there are also unnamed
543 labels. These labels do not have a name (you guessed that already,
544 didn't you?). A colon is used to mark the absence of the name.
545
546 Unnamed labels may be accessed by using the colon plus several minus
547 or plus characters as a label designator. Using the '-' characters
548 will create a back reference (use the n'th label backwards), using
549 '+' will create a forward reference (use the n'th label in forward
550 direction). An example will help to understand this:
551
552 <tscreen><verb>
553         :       lda     (ptr1),y        ; #1
554                 cmp     (ptr2),y
555                 bne     :+              ; -> #2
556                 tax
557                 beq     :+++            ; -> #4
558                 iny
559                 bne     :-              ; -> #1
560                 inc     ptr1+1
561                 inc     ptr2+1
562                 bne     :-              ; -> #1
563
564         :       bcs     :+              ; #2 -> #3
565                 ldx     #$FF
566                 rts
567
568         :       ldx     #$01            ; #3
569         :       rts                     ; #4
570 </verb></tscreen>
571
572 As you can see from the example, unnamed labels will make even short
573 sections of code hard to understand, because you have to count labels
574 to find branch targets (this is the reason why I for my part do
575 prefer the "cheap" local labels). Nevertheless, unnamed labels are
576 convenient in some situations, so it's your decision.
577
578
579 <sect1>Using macros to define labels and constants<p>
580
581 While there are drawbacks with this approach, it may be handy in some
582 situations. Using <tt><ref id=".DEFINE" name=".DEFINE"></tt>, it is
583 possible to define symbols or constants that may be used elsewhere. Since
584 the macro facility works on a very low level, there is no scoping. On the
585 other side, you may also define string constants this way (this is not
586 possible with the other symbol types).
587
588 Example:
589
590 <tscreen><verb>
591         .DEFINE two     2
592         .DEFINE version "SOS V2.3"
593
594         four = two * two        ; Ok
595         .byte   version         ; Ok
596
597         .PROC                   ; Start local scope
598         two = 3                 ; Will give "2 = 3" - invalid!
599         .ENDPROC
600 </verb></tscreen>
601
602
603 <sect1>Symbols and <tt>.DEBUGINFO</tt><p>
604
605 If <tt><ref id=".DEBUGINFO" name=".DEBUGINFO"></tt> is enabled (or <ref
606 id="option-g" name="-g"> is given on the command line), global, local and
607 cheap local labels are written to the object file and will be available in the
608 symbol file via the linker. Unnamed labels are not written to the object file,
609 because they don't have a name which would allow to access them.
610
611
612
613 <sect>Control commands<label id="control-commands">
614
615 <p>
616 Here's a list of all control commands and a description, what they do:
617
618
619 <sect1><tt>.A16</tt><label id=".A16"><p>
620
621   Valid only in 65816 mode. Switch the accumulator to 16 bit.
622
623   Note: This command will not emit any code, it will tell the assembler to
624   create 16 bit operands for immediate accumulator adressing mode.
625
626   See also: <tt><ref id=".SMART" name=".SMART"></tt>
627
628
629 <sect1><tt>.A8</tt><label id=".A8"><p>
630
631   Valid only in 65816 mode. Switch the accumulator to 8 bit.
632
633   Note: This command will not emit any code, it will tell the assembler to
634   create 8 bit operands for immediate accu adressing mode.
635
636   See also: <tt><ref id=".SMART" name=".SMART"></tt>
637
638
639 <sect1><tt>.ADDR</tt><label id=".ADDR"><p>
640
641   Define word sized data. In 6502 mode, this is an alias for <tt/.WORD/ and
642   may be used for better readability if the data words are address values. In
643   65816 mode, the address is forced to be 16 bit wide to fit into the current
644   segment. See also <tt><ref id=".FARADDR" name=".FARADDR"></tt>. The command
645   must be followed by a sequence of (not necessarily constant) expressions.
646
647   Example:
648
649   <tscreen><verb>
650         .addr   $0D00, $AF13, _Clear
651   </verb></tscreen>
652
653   See: <tt><ref id=".FARADDR" name=".FARADDR"></tt>, <tt><ref id=".WORD"
654        name=".WORD"></tt>
655
656
657 <sect1><tt>.ALIGN</tt><label id=".ALIGN"><p>
658
659   Align data to a given boundary. The command expects a constant integer
660   argument that must be a power of two, plus an optional second argument
661   in byte range. If there is a second argument, it is used as fill value,
662   otherwise the value defined in the linker configuration file is used
663   (the default for this value is zero).
664
665   Since alignment depends on the base address of the module, you must
666   give the same (or a greater) alignment for the segment when linking.
667   The linker will give you a warning, if you don't do that.
668
669   Example:
670
671   <tscreen><verb>
672         .align  256
673   </verb></tscreen>
674
675
676 <sect1><tt>.ASCIIZ</tt><label id=".ASCIIZ"><p>
677
678   Define a string with a trailing zero.
679
680   Example:
681
682   <tscreen><verb>
683         Msg:    .asciiz "Hello world"
684   </verb></tscreen>
685
686   This will put the string "Hello world" followed by a binary zero into
687   the current segment. There may be more strings separated by commas, but
688   the binary zero is only appended once (after the last one).
689
690
691 <sect1><tt>.ASSERT</tt><label id=".ASSERT"><p>
692
693   Add an assertion. The command is followed by an expression, an action
694   specifier and a message that is output in case the assertion fails. The
695   action specifier may be one of <tt/warning/ or <tt/error/. The assertion
696   is passed to the linker and will be evaluated when segment placement has
697   been done.
698
699   Example:
700
701   <tscreen><verb>
702         .assert         * = $8000, error, "Code not at $8000"
703   </verb></tscreen>
704
705   The example assertion will check that the current location is at $8000,
706   when the output file is written, and abort with an error if this is not
707   the case. More complex expressions are possible. The action specifier
708   <tt/warning/ outputs a warning, while the <tt/error/ specifier outputs
709   an error message. In the latter case, generation if the output file is
710   suppressed.
711
712
713 <sect1><tt>.AUTOIMPORT</tt><label id=".AUTOIMPORT"><p>
714
715   Is followed by a plus or a minus character. When switched on (using a
716   +), undefined symbols are automatically marked as import instead of
717   giving errors. When switched off (which is the default so this does not
718   make much sense), this does not happen and an error message is
719   displayed. The state of the autoimport flag is evaluated when the
720   complete source was translated, before outputing actual code, so it is
721   <em/not/ possible to switch this feature on or off for separate sections
722   of code. The last setting is used for all symbols.
723
724   You should probably not use this switch because it delays error
725   messages about undefined symbols until the link stage. The cc65
726   compiler (which is supposed to produce correct assembler code in all
727   circumstances, something which is not true for most assembler
728   programmers) will insert this command to avoid importing each and every
729   routine from the runtime library.
730
731   Example:
732
733   <tscreen><verb>
734         .autoimport     +       ; Switch on auto import
735   </verb></tscreen>
736
737
738 <sect1><tt>.BLANK</tt><label id=".BLANK"><p>
739
740   Builtin function. The function evaluates its argument in braces and
741   yields "false" if the argument is non blank (there is an argument), and
742   "true" if there is no argument. As an example, the <tt/.IFBLANK/ statement
743   may be replaced by
744
745   <tscreen><verb>
746         .if     .blank(arg)
747   </verb></tscreen>
748
749
750 <sect1><tt>.BSS</tt><label id=".BSS"><p>
751
752   Switch to the BSS segment. The name of the BSS segment is always "BSS",
753   so this is a shortcut for
754
755   <tscreen><verb>
756         .segment  "BSS"
757   </verb></tscreen>
758
759   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
760
761
762 <sect1><tt>.BYT, .BYTE</tt><label id=".BYTE"><p>
763
764   Define byte sized data. Must be followed by a sequence of (byte ranged)
765   expressions or strings.
766
767   Example:
768
769   <tscreen><verb>
770         .byte   "Hello "
771         .byt    "world", $0D, $00
772   </verb></tscreen>
773
774
775 <sect1><tt>.CASE</tt><label id=".CASE"><p>
776
777   Switch on or off case sensitivity on identifiers. The default is off
778   (that is, identifiers are case sensitive), but may be changed by the
779   -i switch on the command line.
780   The command must be followed by a '+' or '-' character to switch the
781   option on or off respectively.
782
783   Example:
784
785   <tscreen><verb>
786         .case   -               ; Identifiers are not case sensitive
787   </verb></tscreen>
788
789
790 <sect1><tt>.CHARMAP</tt><label id=".CHARMAP"><p>
791
792   Apply a custom mapping for characters. The command is followed by two
793   numbers in the range 1..255. The first one is the index of the source
794   character, the second one is the mapping. The mapping applies to all
795   character and string constants when they generate output, and overrides
796   a mapping table specified with the <tt><ref id="option-t" name="-t"></tt>
797   command line switch.
798
799   Example:
800
801   <tscreen><verb>
802         .charmap        $41, $61        ; Map 'A' to 'a'
803   </verb></tscreen>
804
805
806 <sect1><tt>.CODE</tt><label id=".CODE"><p>
807
808   Switch to the CODE segment. The name of the CODE segment is always
809   "CODE", so this is a shortcut for
810
811   <tscreen><verb>
812         .segment  "CODE"
813   </verb></tscreen>
814
815   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
816
817
818 <sect1><tt>.CONDES</tt><label id=".CONDES"><p>
819
820   Export a symbol and mark it in a special way. The linker is able to build
821   tables of all such symbols. This may be used to automatically create a list
822   of functions needed to initialize linked library modules.
823
824   Note: The linker has a feature to build a table of marked routines, but it
825   is your code that must call these routines, so just declaring a symbol with
826   <tt/.CONDES/ does nothing by itself.
827
828   All symbols are exported as an absolute (16 bit) symbol. You don't need to
829   use an additional <tt><ref id=".EXPORT" name=".EXPORT"></tt> statement, this
830   is implied by <tt/.CONDES/.
831
832   <tt/.CONDES/ is followed by the type, which may be <tt/constructor/,
833   <tt/destructor/ or a numeric value between 0 and 6 (where 0 is the same as
834   specifiying <tt/constructor/ and 1 is equal to specifying <tt/destructor/).
835   The <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> and <tt><ref
836   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> commands are actually shortcuts
837   for <tt/.CONDES/ with a type of <tt/constructor/ resp. <tt/destructor/.
838
839   After the type, an optional priority may be specified. If no priority is
840   given, the default priority of 7 is used. Be careful when assigning
841   priorities to your own module constructors so they won't interfere with the
842   ones in the cc65 library.
843
844   Example:
845
846   <tscreen><verb>
847         .condes         ModuleInit, constructor
848         .condes         ModInit, 0, 16
849   </verb></tscreen>
850
851   See the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> and <tt><ref
852   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> commands and the separate section
853   <ref id="condes" name="Module constructors/destructors"> explaining the
854   feature in more detail.
855
856
857 <sect1><tt>.CONCAT</tt><label id=".CONCAT"><p>
858
859   Builtin function. The function allows to concatenate a list of string
860   constants separated by commas. The result is a string constant that
861   is the concatentation of all arguments. This function is most useful
862   in macros and when used together with the <tt/.STRING/ builtin function.
863   The function may be used in any case where a string constant is
864   expected.
865
866   Example:
867
868   <tscreen><verb>
869         .include        .concat ("myheader", ".", "inc")
870   </verb></tscreen>
871
872   This is the same as the command
873
874   <tscreen><verb>
875         .include        "myheader.inc"
876   </verb></tscreen>
877
878
879 <sect1><tt>.CONST</tt><label id=".CONST"><p>
880
881   Builtin function. The function evaluates its argument in braces and
882   yields "true" if the argument is a constant expression (that is, an
883   expression that yields a constant value at assembly time) and "false"
884   otherwise. As an example, the .IFCONST statement may be replaced by
885
886   <tscreen><verb>
887         .if     .const(a + 3)
888   </verb></tscreen>
889
890
891 <sect1><tt>.CONSTRUCTOR</tt><label id=".CONSTRUCTOR"><p>
892
893   Export a symbol and mark it as a module constructor. This may be used
894   together with the linker to build a table of constructor subroutines that
895   are called by the startup code.
896
897   Note: The linker has a feature to build a table of marked routines, but it
898   is your code that must call these routines, so just declaring a symbol as
899   constructor does nothing by itself.
900
901   A constructor is always exported as an absolute (16 bit) symbol. You don't
902   need to use an additional <tt/.export/ statement, this is implied by
903   <tt/.constructor/. It may have an optional priority that is separated by a
904   comma. If no priority is given, the default priority of 7 is used. Be
905   careful when assigning priorities to your own module constructors so they
906   won't interfere with the ones in the cc65 library.
907
908   Example:
909
910   <tscreen><verb>
911         .constructor    ModuleInit
912         .constructor    ModInit, 16
913   </verb></tscreen>
914
915   See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
916   id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> commands and the separate section
917   <ref id="condes" name="Module constructors/destructors"> explaining the
918   feature in more detail.
919
920
921 <sect1><tt>.CPU</tt><label id=".CPU"><p>
922
923   Reading this pseudo variable will give a constant integer value that
924   tells which instruction set is currently enabled. Possible values are:
925
926   <tscreen><verb>
927         0 -->   6502
928         1 -->   65SC02
929         2 -->   65SC816
930         3 -->   SunPlus SPC
931   </verb></tscreen>
932
933   It may be used to replace the .IFPxx pseudo instructions or to construct
934   even more complex expressions.
935
936   Example:
937
938   <tscreen><verb>
939         .if     (.cpu = 0) .or (.cpu = 1)
940                 txa
941                 pha
942                 tya
943                 pha
944         .else
945                 phx
946                 phy
947         .endif
948   </verb></tscreen>
949
950
951 <sect1><tt>.DATA</tt><label id=".DATA"><p>
952
953   Switch to the DATA segment. The name of the DATA segment is always
954   "DATA", so this is a shortcut for
955
956   <tscreen><verb>
957         .segment  "DATA"
958   </verb></tscreen>
959
960   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
961
962
963 <sect1><tt>.DBYT</tt><label id=".DBYT"><p>
964
965   Define word sized data with the hi and lo bytes swapped (use <tt/.WORD/ to
966   create word sized data in native 65XX format). Must be followed by a
967   sequence of (word ranged) expressions.
968
969   Example:
970
971   <tscreen><verb>
972         .dbyt   $1234, $4512
973   </verb></tscreen>
974
975   This will emit the bytes
976
977   <tscreen><verb>
978         $12 $34 $45 $12
979   </verb></tscreen>
980
981   into the current segment in that order.
982
983
984 <sect1><tt>.DEBUGINFO</tt><label id=".DEBUGINFO"><p>
985
986   Switch on or off debug info generation. The default is off (that is,
987   the object file will not contain debug infos), but may be changed by the
988   -g switch on the command line.
989   The command must be followed by a '+' or '-' character to switch the
990   option on or off respectively.
991
992   Example:
993
994   <tscreen><verb>
995         .debuginfo      +       ; Generate debug info
996   </verb></tscreen>
997
998
999 <sect1><tt>.DEFINE</tt><label id=".DEFINE"><p>
1000
1001   Start a define style macro definition. The command is followed by an
1002   identifier (the macro name) and optionally by a list of formal arguments
1003   in braces.
1004   See section <ref id="macros" name="Macros">.
1005
1006
1007 <sect1><tt>.DEF, .DEFINED</tt><label id=".DEFINED"><p>
1008
1009   Builtin function. The function expects an identifier as argument in braces.
1010   The argument is evaluated, and the function yields "true" if the identifier
1011   is a symbol that is already defined somewhere in the source file up to the
1012   current position. Otherwise the function yields false. As an example, the
1013   <tt><ref id=".IFDEF" name=".IFDEF"></tt> statement may be replaced by
1014
1015   <tscreen><verb>
1016         .if     .defined(a)
1017   </verb></tscreen>
1018
1019
1020 <sect1><tt>.DESTRUCTOR</tt><label id=".DESTRUCTOR"><p>
1021
1022   Export a symbol and mark it as a module destructor. This may be used
1023   together with the linker to build a table of destructor subroutines that
1024   are called by the startup code.
1025
1026   Note: The linker has a feature to build a table of marked routines, but it
1027   is your code that must call these routines, so just declaring a symbol as
1028   constructor does nothing by itself.
1029
1030   A destructor is always exported as an absolute (16 bit) symbol. You don't
1031   need to use an additional <tt/.export/ statement, this is implied by
1032   <tt/.destructor/. It may have an optional priority that is separated by a
1033   comma. If no priority is given, the default priority of 7 is used. Be
1034   careful when assigning priorities to your own module destructors so they
1035   won't interfere with the ones in the cc65 library.
1036
1037   Example:
1038
1039   <tscreen><verb>
1040         .destructor     ModuleDone
1041         .destructor     ModDone, 16
1042   </verb></tscreen>
1043
1044   See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
1045   id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> commands and the separate
1046   section <ref id="condes" name="Module constructors/destructors"> explaining
1047   the feature in more detail.
1048
1049
1050 <sect1><tt>.DWORD</tt><label id=".DWORD"><p>
1051
1052   Define dword sized data (4 bytes) Must be followed by a sequence of
1053   expressions.
1054
1055   Example:
1056
1057   <tscreen><verb>
1058         .dword  $12344512, $12FA489
1059   </verb></tscreen>
1060
1061
1062 <sect1><tt>.ELSE</tt><label id=".ELSE"><p>
1063
1064   Conditional assembly: Reverse the current condition.
1065
1066
1067 <sect1><tt>.ELSEIF</tt><label id=".ELSEIF"><p>
1068
1069   Conditional assembly: Reverse current condition and test a new one.
1070
1071
1072 <sect1><tt>.END</tt><label id=".END"><p>
1073
1074   Forced end of assembly. Assembly stops at this point, even if the command
1075   is read from an include file.
1076
1077
1078 <sect1><tt>.ENDIF</tt><label id=".ENDIF"><p>
1079
1080   Conditional assembly: Close a <tt><ref id=".IF" name=".IF..."></tt> or
1081   <tt><ref id=".ELSE" name=".ELSE"></tt> branch.
1082
1083
1084 <sect1><tt>.ENDMAC, .ENDMACRO</tt><label id=".ENDMACRO"><p>
1085
1086   End of macro definition (see section <ref id="macros" name="Macros">).
1087
1088
1089 <sect1><tt>.ENDPROC</tt><label id=".ENDPROC"><p>
1090
1091   End of local lexical level (see <tt><ref id=".PROC" name=".PROC"></tt>).
1092
1093
1094 <sect1><tt>.ENDREP, .ENDREPEAT</tt><label id=".ENDREPEAT"><p>
1095
1096   End a <tt><ref id=".REPEAT" name=".REPEAT"></tt> block.
1097
1098
1099 <sect1><tt>.ERROR</tt><label id=".ERROR"><p>
1100
1101   Force an assembly error. The assembler will output an error message
1102   preceeded by "User error" and will <em/not/ produce an object file.
1103
1104   This command may be used to check for initial conditions that must be
1105   set before assembling a source file.
1106
1107   Example:
1108
1109   <tscreen><verb>
1110         .if     foo = 1
1111         ...
1112         .elseif bar = 1
1113         ...
1114         .else
1115         .error  "Must define foo or bar!"
1116         .endif
1117   </verb></tscreen>
1118
1119   See also the <tt><ref id=".WARNING" name=".WARNING"></tt> and <tt><ref
1120   id=".OUT" name=".OUT"></tt> directives.
1121
1122
1123 <sect1><tt>.EXITMAC, .EXITMACRO</tt><label id=".EXITMACRO"><p>
1124
1125   Abort a macro expansion immidiately. This command is often useful in
1126   recursive macros. See separate section <ref id="macros" name="Macros">.
1127
1128
1129 <sect1><tt>.EXPORT</tt><label id=".EXPORT"><p>
1130
1131   Make symbols accessible from other modules. Must be followed by a comma
1132   separated list of symbols to export.
1133
1134   Example:
1135
1136   <tscreen><verb>
1137         .export foo, bar
1138   </verb></tscreen>
1139
1140   See: <tt><ref id=".EXPORTZP" name=".EXPORTZP"></tt>
1141
1142
1143 <sect1><tt>.EXPORTZP</tt><label id=".EXPORTZP"><p>
1144
1145   Make symbols accessible from other modules. Must be followed by a comma
1146   separated list of symbols to export. The exported symbols are explicitly
1147   marked as zero page symols.
1148
1149   Example:
1150
1151   <tscreen><verb>
1152         .exportzp  foo, bar
1153   </verb></tscreen>
1154
1155   See: <tt><ref id=".EXPORT" name=".EXPORT"></tt>
1156
1157
1158 <sect1><tt>.FARADDR</tt><label id=".FARADDR"><p>
1159
1160   Define far (24 bit) address data. The command must be followed by a
1161   sequence of (not necessarily constant) expressions.
1162
1163   Example:
1164
1165   <tscreen><verb>
1166         .faraddr        DrawCircle, DrawRectangle, DrawHexagon
1167   </verb></tscreen>
1168
1169   See: <tt><ref id=".ADDR" name=".ADDR"></tt>
1170
1171
1172 <sect1><tt>.FEATURE</tt><label id=".FEATURE"><p>
1173
1174   This directive may be used to enable one or more compatibility features
1175   of the assembler. While the use of <tt/.FEATURE/ should be avoided when
1176   possible, it may be useful when porting sources written for other
1177   assemblers. There is no way to switch a feature off, once you have
1178   enabled it, so using
1179
1180   <tscreen><verb>
1181         .FEATURE        xxx
1182   </verb></tscreen>
1183
1184   will enable the feature until end of assembly is reached.
1185
1186   The following features are available:
1187
1188   <descrip>
1189
1190   <tag><tt>dollar_is_pc</tt></tag>
1191
1192     The dollar sign may be used as an alias for the star (`*'), which
1193     gives the value of the current PC in expressions.
1194     Note: Assignment to the pseudo variable is not allowed.
1195
1196   <tag><tt>labels_without_colons</tt></tag>
1197
1198     Allow labels without a trailing colon. These labels are only accepted,
1199     if they start at the beginning of a line (no leading white space).
1200
1201   <tag><tt>loose_string_term</tt></tag>
1202
1203     Accept single quotes as well as double quotes as terminators for string
1204     constants.
1205
1206   <tag><tt>loose_char_term</tt></tag>
1207
1208     Accept single quotes as well as double quotes as terminators for char
1209     constants.
1210
1211   <tag><tt>at_in_identifiers</tt></tag>
1212
1213     Accept the at character (`@') as a valid character in identifiers. The
1214     at character is not allowed to start an identifier, even with this
1215     feature enabled.
1216
1217   <tag><tt>dollar_in_identifiers</tt></tag>
1218
1219     Accept the dollar sign (`&dollar;') as a valid character in identifiers. The
1220     at character is not allowed to start an identifier, even with this
1221     feature enabled.
1222
1223   <tag><tt>leading_dot_in_identifiers</tt></tag>
1224
1225     Accept the dot (`.') as the first character of an identifier. This may be
1226     used for example to create macro names that start with a dot emulating
1227     control directives of other assemblers. Note however, that none of the
1228     reserved keywords built into the assembler, that starts with a dot, may be
1229     overridden. When using this feature, you may also get into trouble if
1230     later versions of the assembler define new keywords starting with a dot.
1231
1232   <tag><tt>pc_assignment</tt></tag>
1233
1234     Allow assignments to the PC symbol (`*' or `&dollar;' if <tt/dollar_is_pc/
1235     is enabled). Such an assignment is handled identical to the <tt><ref
1236     id=".ORG" name=".ORG"></tt> command (which is usually not needed, so just
1237     removing the lines with the assignments may also be an option when porting
1238     code written for older assemblers).
1239
1240   </descrip>
1241
1242   It is also possible to specify features on the command line using the
1243   <tt><ref id="option--feature" name="--feature"></tt> command line option.
1244   This is useful when translating sources written for older assemblers, when
1245   you don't want to change the source code.
1246
1247   As an example, to translate sources written for Andre Fachats xa65
1248   assembler, the features
1249
1250   <verb>
1251         labels_without_colons, pc_assignment, loose_char_term
1252   </verb>
1253
1254   may be helpful. They do not make ca65 completely compatible, so you may not
1255   be able to translate the sources without changes, even when enabling these
1256   features. However, I have found several sources that translate without
1257   problems when enabling these features on the command line.
1258
1259
1260 <sect1><tt>.FILEOPT, .FOPT</tt><label id=".FOPT"><p>
1261
1262   Insert an option string into the object file. There are two forms of
1263   this command, one specifies the option by a keyword, the second
1264   specifies it as a number. Since usage of the second one needs knowledge
1265   of the internal encoding, its use is not recommended and I will only
1266   describe the first form here.
1267
1268   The command is followed by one of the keywords
1269
1270   <tscreen><verb>
1271         author
1272         comment
1273         compiler
1274   </verb></tscreen>
1275
1276   a comma and a string. The option is written into the object file
1277   together with the string value. This is currently unidirectional and
1278   there is no way to actually use these options once they are in the
1279   object file.
1280
1281   Examples:
1282
1283   <tscreen><verb>
1284         .fileopt        comment, "Code stolen from my brother"
1285         .fileopt        compiler, "BASIC 2.0"
1286         .fopt           author, "J. R. User"
1287   </verb></tscreen>
1288
1289
1290 <sect1><tt>.FORCEIMPORT</tt><label id=".FORCEIMPORT"><p>
1291
1292   Import an absolute symbol from another module. The command is followed by a
1293   comma separated list of symbols to import. The command is similar to <tt>
1294   <ref id=".IMPORT" name=".IMPORT"></tt>, but the import reference is always
1295   written to the generated object file, even if the symbol is never referenced
1296   (<tt><ref id=".IMPORT" name=".IMPORT"></tt> will not generate import
1297   references for unused symbols).
1298
1299   Example:
1300
1301   <tscreen><verb>
1302         .forceimport    needthisone, needthistoo
1303   </verb></tscreen>
1304
1305   See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
1306
1307
1308 <sect1><tt>.GLOBAL</tt><label id=".GLOBAL"><p>
1309
1310   Declare symbols as global. Must be followed by a comma separated list of
1311   symbols to declare. Symbols from the list, that are defined somewhere in the
1312   source, are exported, all others are imported. Additional <tt><ref
1313   id=".IMPORT" name=".IMPORT"></tt> or <tt><ref id=".EXPORT"
1314   name=".EXPORT"></tt> commands for the same symbol are allowed.
1315
1316   Example:
1317
1318   <tscreen><verb>
1319         .global foo, bar
1320   </verb></tscreen>
1321
1322
1323 <sect1><tt>.GLOBALZP</tt><label id=".GLOBALZP"><p>
1324
1325   Declare symbols as global. Must be followed by a comma separated list of
1326   symbols to declare. Symbols from the list, that are defined somewhere in the
1327   source, are exported, all others are imported. Additional <tt><ref
1328   id=".IMPORTZP" name=".IMPORTZP"></tt> or <tt><ref id=".EXPORTZP"
1329   name=".EXPORTZP"></tt> commands for the same symbol are allowed. The symbols
1330   in the list are explicitly marked as zero page symols.
1331
1332   Example:
1333
1334   <tscreen><verb>
1335         .globalzp foo, bar
1336   </verb></tscreen>
1337
1338
1339 <sect1><tt>.I16</tt><label id=".I16"><p>
1340
1341   Valid only in 65816 mode. Switch the index registers to 16 bit.
1342
1343   Note: This command will not emit any code, it will tell the assembler to
1344   create 16 bit operands for immediate operands.
1345
1346   See also the <tt><ref id=".I8" name=".I8"></tt> and <tt><ref id=".SMART"
1347   name=".SMART"></tt> commands.
1348
1349
1350 <sect1><tt>.I8</tt><label id=".I8"><p>
1351
1352   Valid only in 65816 mode. Switch the index registers to 8 bit.
1353
1354   Note: This command will not emit any code, it will tell the assembler to
1355   create 8 bit operands for immediate operands.
1356
1357   See also the <tt><ref id=".I16" name=".I16"></tt> and <tt><ref id=".SMART"
1358   name=".SMART"></tt> commands.
1359
1360
1361 <sect1><tt>.IF</tt><label id=".IF"><p>
1362
1363   Conditional assembly: Evalute an expression and switch assembler output
1364   on or off depending on the expression. The expression must be a constant
1365   expression, that is, all operands must be defined.
1366
1367   A expression value of zero evaluates to FALSE, any other value evaluates
1368   to TRUE.
1369
1370
1371 <sect1><tt>.IFBLANK</tt><label id=".IFBLANK"><p>
1372
1373   Conditional assembly: Check if there are any remaining tokens in this line,
1374   and evaluate to FALSE if this is the case, and to TRUE otherwise. If the
1375   condition is not true, further lines are not assembled until an <tt><ref
1376   id=".ELSE" name=".ESLE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
1377   <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
1378
1379   This command is often used to check if a macro parameter was given. Since an
1380   empty macro parameter will evaluate to nothing, the condition will evaluate
1381   to FALSE if an empty parameter was given.
1382
1383   Example:
1384
1385   <tscreen><verb>
1386         .macro     arg1, arg2
1387         .ifblank   arg2
1388                    lda     #arg1
1389         .else
1390                    lda     #arg2
1391         .endif
1392         .endmacro
1393   </verb></tscreen>
1394
1395   See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
1396
1397
1398 <sect1><tt>.IFCONST</tt><label id=".IFCONST"><p>
1399
1400   Conditional assembly: Evaluate an expression and switch assembler output
1401   on or off depending on the constness of the expression.
1402
1403   A const expression evaluates to to TRUE, a non const expression (one
1404   containing an imported or currently undefined symbol) evaluates to
1405   FALSE.
1406
1407   See also: <tt><ref id=".CONST" name=".CONST"></tt>
1408
1409
1410 <sect1><tt>.IFDEF</tt><label id=".IFDEF"><p>
1411
1412   Conditional assembly: Check if a symbol is defined. Must be followed by
1413   a symbol name. The condition is true if the the given symbol is already
1414   defined, and false otherwise.
1415
1416   See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
1417
1418
1419 <sect1><tt>.IFNBLANK</tt><label id=".IFNBLANK"><p>
1420
1421   Conditional assembly: Check if there are any remaining tokens in this line,
1422   and evaluate to TRUE if this is the case, and to FALSE otherwise. If the
1423   condition is not true, further lines are not assembled until an <tt><ref
1424   id=".ELSE" name=".ELSE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
1425   <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
1426
1427   This command is often used to check if a macro parameter was given.
1428   Since an empty macro parameter will evaluate to nothing, the condition
1429   will evaluate to FALSE if an empty parameter was given.
1430
1431   Example:
1432
1433   <tscreen><verb>
1434         .macro     arg1, arg2
1435                    lda     #arg1
1436         .ifnblank  arg2
1437                    lda     #arg2
1438         .endif
1439         .endmacro
1440   </verb></tscreen>
1441
1442   See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
1443
1444
1445 <sect1><tt>.IFNDEF</tt><label id=".IFNDEF"><p>
1446
1447   Conditional assembly: Check if a symbol is defined. Must be followed by
1448   a symbol name. The condition is true if the the given symbol is not
1449   defined, and false otherwise.
1450
1451   See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
1452
1453
1454 <sect1><tt>.IFNREF</tt><label id=".IFNREF"><p>
1455
1456   Conditional assembly: Check if a symbol is referenced. Must be followed
1457   by a symbol name. The condition is true if if the the given symbol was
1458   not referenced before, and false otherwise.
1459
1460   See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
1461
1462
1463 <sect1><tt>.IFP02</tt><label id=".IFP02"><p>
1464
1465   Conditional assembly: Check if the assembler is currently in 6502 mode
1466   (see <tt><ref id=".P02" name=".P02"></tt> command).
1467
1468
1469 <sect1><tt>.IFP816</tt><label id=".IFP816"><p>
1470
1471   Conditional assembly: Check if the assembler is currently in 65816 mode
1472   (see <tt><ref id=".P816" name=".P816"></tt> command).
1473
1474
1475 <sect1><tt>.IFPC02</tt><label id=".IFPC02"><p>
1476
1477   Conditional assembly: Check if the assembler is currently in 65C02 mode
1478   (see <tt><ref id=".PC02" name=".PC02"></tt> command).
1479
1480
1481 <sect1><tt>.IFREF</tt><label id=".IFREF"><p>
1482
1483   Conditional assembly: Check if a symbol is referenced. Must be followed
1484   by a symbol name. The condition is true if if the the given symbol was
1485   referenced before, and false otherwise.
1486
1487   This command may be used to build subroutine libraries in include files
1488   (you may use separate object modules for this purpose too).
1489
1490   Example:
1491
1492   <tscreen><verb>
1493         .ifref  ToHex                   ; If someone used this subroutine
1494         ToHex:  tay                     ; Define subroutine
1495                 lda     HexTab,y
1496                 rts
1497         .endif
1498   </verb></tscreen>
1499
1500   See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
1501
1502
1503 <sect1><tt>.IMPORT</tt><label id=".IMPORT"><p>
1504
1505   Import a symbol from another module. The command is followed by a comma
1506   separated list of symbols to import.
1507
1508   Example:
1509
1510   <tscreen><verb>
1511         .import foo, bar
1512   </verb></tscreen>
1513
1514   See: <tt><ref id=".IMPORTZP" name=".IMPORTZP"></tt>
1515
1516
1517 <sect1><tt>.IMPORTZP</tt><label id=".IMPORTZP"><p>
1518
1519   Import a symbol from another module. The command is followed by a comma
1520   separated list of symbols to import. The symbols are explicitly imported
1521   as zero page symbols (that is, symbols with values in byte range).
1522
1523   Example:
1524
1525   <tscreen><verb>
1526         .importzp       foo, bar
1527   </verb></tscreen>
1528
1529   See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
1530
1531
1532 <sect1><tt>.INCBIN</tt><label id=".INCBIN"><p>
1533
1534   Include a file as binary data. The command expects a string argument
1535   that is the name of a file to include literally in the current segment.
1536   In addition to that, a start offset and a size value may be specified,
1537   separated by commas. If no size is specified, all of the file from the
1538   start offset to end-of-file is used. If no start position is specified
1539   either, zero is assume (which means that the whole file is inserted).
1540
1541   Example:
1542
1543   <tscreen><verb>
1544         ; Include whole file
1545         .incbin         "sprites.dat"
1546
1547         ; Include file starting at offset 256
1548         .incbin         "music.dat", $100
1549
1550         ; Read 100 bytes starting at offset 200
1551         .incbin         "graphics.dat", 200, 100
1552   </verb></tscreen>
1553
1554
1555 <sect1><tt>.INCLUDE</tt><label id=".INCLUDE"><p>
1556
1557   Include another file. Include files may be nested up to a depth of 16.
1558
1559   Example:
1560
1561   <tscreen><verb>
1562         .include        "subs.inc"
1563   </verb></tscreen>
1564
1565
1566 <sect1><tt>.LEFT</tt><label id=".LEFT"><p>
1567
1568   Builtin function. Extracts the left part of a given token list.
1569
1570   Syntax:
1571
1572   <tscreen><verb>
1573         .LEFT (&lt;int expr&gt;, &lt;token list&gt;)
1574   </verb></tscreen>
1575
1576   The first integer expression gives the number of tokens to extract from
1577   the token list. The second argument is the token list itself.
1578
1579   Example:
1580
1581   To check in a macro if the given argument has a '#' as first token
1582   (immidiate addressing mode), use something like this:
1583
1584   <tscreen><verb>
1585         .macro  ldax    arg
1586                 ...
1587                 .if (.match (.left (1, arg), #))
1588
1589                 ; ldax called with immidiate operand
1590                 ...
1591
1592                 .endif
1593                 ...
1594         .endmacro
1595   </verb></tscreen>
1596
1597   See also the <tt><ref id=".MID" name=".MID"></tt> and <tt><ref id=".RIGHT"
1598   name=".RIGHT"></tt> builtin functions.
1599
1600
1601 <sect1><tt>.LINECONT</tt><label id=".LINECONT"><p>
1602
1603   Switch on or off line continuations using the backslash character
1604   before a newline. The option is off by default.
1605   Note: Line continuations do not work in a comment. A backslash at the
1606   end of a comment is treated as part of the comment and does not trigger
1607   line continuation.
1608   The command must be followed by a '+' or '-' character to switch the
1609   option on or off respectively.
1610
1611   Example:
1612
1613   <tscreen><verb>
1614         .linecont       +               ; Allow line continuations
1615
1616         lda     \
1617                 #$20                    ; This is legal now
1618   </verb></tscreen>
1619
1620
1621 <sect1><tt>.LIST</tt><label id=".LIST"><p>
1622
1623   Enable output to the listing. The command must be followed by a boolean
1624   switch ("on", "off", "+" or "-") and will enable or disable listing
1625   output.
1626   The option has no effect if the listing is not enabled by the command line
1627   switch -l. If -l is used, an internal counter is set to 1. Lines are output
1628   to the listing file, if the counter is greater than zero, and suppressed if
1629   the counter is zero. Each use of <tt/.LIST/ will increment or decrement the
1630   counter.
1631
1632   Example:
1633
1634   <tscreen><verb>
1635         .list   on              ; Enable listing output
1636   </verb></tscreen>
1637
1638
1639 <sect1><tt>.LISTBYTES</tt><label id=".LISTBYTES"><p>
1640
1641   Set, how many bytes are shown in the listing for one source line. The
1642   default is 12, so the listing will show only the first 12 bytes for any
1643   source line that generates more than 12 bytes of code or data.
1644   The directive needs an argument, which is either "unlimited", or an
1645   integer constant in the range 4..255.
1646
1647   Examples:
1648
1649   <tscreen><verb>
1650         .listbytes      unlimited       ; List all bytes
1651         .listbytes      12              ; List the first 12 bytes
1652         .incbin         "data.bin"      ; Include large binary file
1653   </verb></tscreen>
1654
1655
1656 <sect1><tt>.LOCAL</tt><label id=".LOCAL"><p>
1657
1658   This command may only be used inside a macro definition. It declares a
1659   list of identifiers as local to the macro expansion.
1660
1661   A problem when using macros are labels: Since they don't change their name,
1662   you get a "duplicate symbol" error if the macro is expanded the second time.
1663   Labels declared with <tt><ref id=".LOCAL" name=".LOCAL"></tt> have their
1664   name mapped to an internal unique name (<tt/___ABCD__/) with each macro
1665   invocation.
1666
1667   Some other assemblers start a new lexical block inside a macro expansion.
1668   This has some drawbacks however, since that will not allow <em/any/ symbol
1669   to be visible outside a macro, a feature that is sometimes useful. The
1670   <tt><ref id=".LOCAL" name=".LOCAL"></tt> command is in my eyes a better way
1671   to address the problem.
1672
1673   You get an error when using <tt><ref id=".LOCAL" name=".LOCAL"></tt> outside
1674   a macro.
1675
1676
1677 <sect1><tt>.LOCALCHAR</tt><label id=".LOCALCHAR"><p>
1678
1679   Defines the character that start "cheap" local labels. You may use one
1680   of '@' and '?' as start character. The default is '@'.
1681
1682   Cheap local labels are labels that are visible only between two non
1683   cheap labels. This way you can reuse identifiers like "<tt/loop/" without
1684   using explicit lexical nesting.
1685
1686   Example:
1687
1688   <tscreen><verb>
1689         .localchar      '?'
1690
1691         Clear:  lda     #$00            ; Global label
1692         ?Loop:  sta     Mem,y           ; Local label
1693                 dey
1694                 bne     ?Loop           ; Ok
1695                 rts
1696         Sub:    ...                     ; New global label
1697                 bne     ?Loop           ; ERROR: Unknown identifier!
1698   </verb></tscreen>
1699
1700
1701 <sect1><tt>.MACPACK</tt><label id=".MACPACK"><p>
1702
1703   Insert a predefined macro package. The command is followed by an
1704   identifier specifying the macro package to insert. Available macro
1705   packages are:
1706
1707   <tscreen><verb>
1708         generic         Defines generic macros like add and sub.
1709         longbranch      Defines conditional long jump macros.
1710   </verb></tscreen>
1711
1712   Including a macro package twice, or including a macro package that
1713   redefines already existing macros will lead to an error.
1714
1715   Example:
1716
1717   <tscreen><verb>
1718         .macpack        longbranch      ; Include macro package
1719
1720                 cmp     #$20            ; Set condition codes
1721                 jne     Label           ; Jump long on condition
1722   </verb></tscreen>
1723
1724   Macro packages are explained in more detail in section <ref
1725   id="macropackages" name="Macro packages">.
1726
1727
1728 <sect1><tt>.MAC, .MACRO</tt><label id=".MAC"><p>
1729
1730   Start a classic macro definition. The command is followed by an identifier
1731   (the macro name) and optionally by a comma separated list of identifiers
1732   that are macro parameters.
1733
1734   See section <ref id="macros" name="Macros">.
1735
1736
1737 <sect1><tt>.MATCH</tt><label id=".MATCH"><p>
1738
1739   Builtin function. Matches two token lists against each other. This is
1740   most useful within macros, since macros are not stored as strings, but
1741   as lists of tokens.
1742
1743   The syntax is
1744
1745   <tscreen><verb>
1746         .MATCH(&lt;token list #1&gt;, &lt;token list #2&gt;)
1747   </verb></tscreen>
1748
1749   Both token list may contain arbitrary tokens with the exception of the
1750   terminator token (comma resp. right parenthesis) and
1751
1752   <itemize>
1753   <item>end-of-line
1754   <item>end-of-file
1755   </itemize>
1756
1757   Often a macro parameter is used for any of the token lists.
1758
1759   Please note that the function does only compare tokens, not token
1760   attributes. So any number is equal to any other number, regardless of the
1761   actual value. The same is true for strings. If you need to compare tokens
1762   <em/and/ token attributes, use the <tt><ref id=".XMATCH"
1763   name=".XMATCH"></tt> function.
1764
1765   Example:
1766
1767   Assume the macro <tt/ASR/, that will shift right the accumulator by one,
1768   while honoring the sign bit. The builtin processor instructions will allow
1769   an optional "A" for accu addressing for instructions like <tt/ROL/ and
1770   <tt/ROR/. We will use the <tt><ref id=".MATCH" name=".MATCH"></tt> function
1771   to check for this and print and error for invalid calls.
1772
1773   <tscreen><verb>
1774         .macro  asr     arg
1775
1776                 .if (.not .blank(arg)) .and (.not .match (arg, a))
1777                 .error "Syntax error"
1778                 .endif
1779
1780                 cmp     #$80            ; Bit 7 into carry
1781                 lsr     a               ; Shift carry into bit 7
1782
1783         .endmacro
1784   </verb></tscreen>
1785
1786   The macro will only accept no arguments, or one argument that must be the
1787   reserved keyword "A".
1788
1789   See: <tt><ref id=".XMATCH" name=".XMATCH"></tt>
1790
1791
1792 <sect1><tt>.MID</tt><label id=".MID"><p>
1793
1794   Builtin function. Takes a starting index, a count and a token list as
1795   arguments. Will return part of the token list.
1796
1797   Syntax:
1798
1799   <tscreen><verb>
1800         .MID (&lt;int expr&gt;, &lt;int expr&gt;, &lt;token list&gt;)
1801   </verb></tscreen>
1802
1803   The first integer expression gives the starting token in the list (the
1804   first token has index 0). The second integer expression gives the number
1805   of tokens to extract from the token list. The third argument is the
1806   token list itself.
1807
1808   Example:
1809
1810   To check in a macro if the given argument has a '<tt/#/' as first token
1811   (immidiate addressing mode), use something like this:
1812
1813     <tscreen><verb>
1814         .macro  ldax    arg
1815                 ...
1816                 .if (.match (.mid (0, 1, arg), #))
1817
1818                 ; ldax called with immidiate operand
1819                 ...
1820
1821                 .endif
1822                 ...
1823         .endmacro
1824   </verb></tscreen>
1825
1826   See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".RIGHT"
1827   name=".RIGHT"></tt> builtin functions.
1828
1829
1830 <sect1><tt>.ORG</tt><label id=".ORG"><p>
1831
1832   Start a section of absolute code. The command is followed by a constant
1833   expression that gives the new PC counter location for which the code is
1834   assembled. Use <tt><ref id=".RELOC" name=".RELOC"></tt> to switch back to
1835   relocatable code.
1836
1837   Please note that you <em/do not need/ this command in most cases. Placing
1838   code at a specific address is the job of the linker, not the assembler, so
1839   there is usually no reason to assemble code to a specific address.
1840
1841   You may not switch segments while inside a section of absolute code.
1842
1843   Example:
1844
1845   <tscreen><verb>
1846         .org    $7FF            ; Emit code starting at $7FF
1847   </verb></tscreen>
1848
1849
1850 <sect1><tt>.OUT</tt><label id=".OUT"><p>
1851
1852   Output a string to the console without producing an error. This command
1853   is similiar to <tt/.ERROR/, however, it does not force an assembler error
1854   that prevents the creation of an object file.
1855
1856   Example:
1857
1858   <tscreen><verb>
1859         .out    "This code was written by the codebuster(tm)"
1860   </verb></tscreen>
1861
1862   See also the <tt><ref id=".WARNING" name=".WARNING"></tt> and <tt><ref
1863   id=".ERROR" name=".ERROR"></tt> directives.
1864
1865
1866 <sect1><tt>.P02</tt><label id=".P02"><p>
1867
1868   Enable the 6502 instruction set, disable 65C02 and 65816 instructions.
1869   This is the default if not overridden by the <tt/--cpu/ command line
1870   option.
1871
1872   See: <tt><ref id=".PC02" name=".PC02"></tt> and <tt><ref id=".P816"
1873   name=".P816"></tt>
1874
1875
1876 <sect1><tt>.P816</tt><label id=".P816"><p>
1877
1878   Enable the 65816 instruction set. This is a superset of the 65C02 and
1879   6502 instruction sets.
1880
1881   See: <tt><ref id=".P02" name=".P02"></tt> and <tt><ref id=".PC02"
1882   name=".PC02"></tt>
1883
1884
1885 <sect1><tt>.PAGELEN, .PAGELENGTH</tt><label id=".PAGELENGTH"><p>
1886
1887   Set the page length for the listing. Must be followed by an integer
1888   constant. The value may be "unlimited", or in the range 32 to 127. The
1889   statement has no effect if no listing is generated. The default value is -1
1890   (unlimited) but may be overridden by the <tt/--pagelength/ command line
1891   option. Beware: Since ca65 is a one pass assembler, the listing is generated
1892   after assembly is complete, you cannot use multiple line lengths with one
1893   source. Instead, the value set with the last <tt/.PAGELENGTH/ is used.
1894
1895   Examples:
1896
1897   <tscreen><verb>
1898         .pagelength     66              ; Use 66 lines per listing page
1899
1900         .pagelength     unlimited       ; Unlimited page length
1901   </verb></tscreen>
1902
1903
1904 <sect1><tt>.PARAMCOUNT</tt><label id=".PARAMCOUNT"><p>
1905
1906   This builtin pseudo variable is only available in macros. It is replaced by
1907   the actual number of parameters that were given in the macro invocation.
1908
1909   Example:
1910
1911   <tscreen><verb>
1912         .macro  foo     arg1, arg2, arg3
1913         .if     .paramcount <> 3
1914         .error  "Too few parameters for macro foo"
1915         .endif
1916         ...
1917         .endmacro
1918   </verb></tscreen>
1919
1920   See section <ref id="macros" name="Macros">.
1921
1922
1923 <sect1><tt>.PC02</tt><label id=".PC02"><p>
1924
1925   Enable the 65C02 instructions set. This instruction set includes all
1926   6502 instructions.
1927
1928   See: <tt><ref id=".P02" name=".P02"></tt> and <tt><ref id=".P816"
1929   name=".P816"></tt>
1930
1931
1932 <sect1><tt>.POPSEG</tt><label id=".POPSEG"><p>
1933
1934   Pop the last pushed segment from the stack, and set it.
1935
1936   This command will switch back to the segment that was last pushed onto the
1937   segment stack using the <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
1938   command, and remove this entry from the stack.
1939
1940   The assembler will print an error message if the segment stack is empty
1941   when this command is issued.
1942
1943   See: <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
1944
1945
1946 <sect1><tt>.PROC</tt><label id=".PROC"><p>
1947
1948   Start a nested lexical level. All new symbols from now on are in the local
1949   lexical level and are not accessible from outside. Symbols defined outside
1950   this local level may be accessed as long as their names are not used for new
1951   symbols inside the level. Symbols names in other lexical levels do not
1952   clash, so you may use the same names for identifiers. The lexical level ends
1953   when the <tt><ref id=".ENDPROC" name=".ENDPROC"></tt> command is read.
1954   Lexical levels may be nested up to a depth of 16.
1955
1956   The command may be followed by an identifier, in this case the
1957   identifier is declared in the outer level as a label having the value of
1958   the program counter at the start of the lexical level.
1959
1960   Note: Macro names are always in the global level and in a separate name
1961   space. There is no special reason for this, it's just that I've never
1962   had any need for local macro definitions.
1963
1964   Example:
1965
1966   <tscreen><verb>
1967         .proc   Clear           ; Define Clear subroutine, start new level
1968                 lda     #$00
1969         L1:     sta     Mem,y   ; L1 is local and does not cause a
1970                                 ; duplicate symbol error if used in other
1971                                 ; places
1972                 dey
1973                 bne     L1      ; Reference local symbol
1974                 rts
1975         .endproc                ; Leave lexical level
1976   </verb></tscreen>
1977
1978   See: <tt><ref id=".ENDPROC" name=".ENDPROC"></tt>
1979
1980
1981 <sect1><tt>.PUSHSEG</tt><label id=".PUSHSEG"><p>
1982
1983   Push the currently active segment onto a stack. The entries on the stack
1984   include the name of the segment and the segment type. The stack has a size
1985   of 16 entries.
1986
1987   <tt/.PUSHSEG/ allows together with <tt><ref id=".POPSEG" name=".POPSEG"></tt>
1988   to switch to another segment and to restore the old segment later, without
1989   even knowing the name and type of the current segment.
1990
1991   The assembler will print an error message if the segment stack is already
1992   full, when this command is issued.
1993
1994   See: <tt><ref id=".POPSEG" name=".POPSEG"></tt>
1995
1996
1997 <sect1><tt>.REF, .REFERENCED</tt><label id=".REFERENCED"><p>
1998
1999   Builtin function. The function expects an identifier as argument in braces.
2000   The argument is evaluated, and the function yields "true" if the identifier
2001   is a symbol that has already been referenced somewhere in the source file up
2002   to the current position. Otherwise the function yields false. As an example,
2003   the <tt><ref id=".IFREF" name=".IFREF"></tt> statement may be replaced by
2004
2005   <tscreen><verb>
2006         .if     .referenced(a)
2007   </verb></tscreen>
2008
2009   See: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
2010
2011
2012 <sect1><tt>.REPEAT</tt><label id=".REPEAT"><p>
2013
2014   Repeat all commands between <tt/.REPEAT/ and <tt><ref id=".ENDREPEAT"
2015   name=".ENDREPEAT"></tt> constant number of times. The command is followed by
2016   a constant expression that tells how many times the commands in the body
2017   should get repeated. Optionally, a comma and an identifier may be specified.
2018   If this identifier is found in the body of the repeat statement, it is
2019   replaced by the current repeat count (starting with zero for the first time
2020   the body is repeated).
2021
2022   <tt/.REPEAT/ statements may be nested. If you use the same repeat count
2023   identifier for a nested <tt/.REPEAT/ statement, the one from the inner
2024   level will be used, not the one from the outer level.
2025
2026   Example:
2027
2028   The following macro will emit a string that is "encrypted" in that all
2029   characters of the string are XORed by the value $55.
2030
2031   <tscreen><verb>
2032         .macro  Crypt   Arg
2033                 .repeat .strlen(Arg), I
2034                 .byte   .strat(Arg, I) .xor $55
2035                 .endrep
2036         .endmacro
2037   </verb></tscreen>
2038
2039   See: <tt><ref id=".ENDREPEAT" name=".ENDREPEAT"></tt>
2040
2041
2042 <sect1><tt>.RELOC</tt><label id=".RELOC"><p>
2043
2044   Switch back to relocatable mode. See the <tt><ref id=".ORG"
2045   name=".ORG"></tt> command.
2046
2047
2048 <sect1><tt>.RES</tt><label id=".RES"><p>
2049
2050   Reserve storage. The command is followed by one or two constant
2051   expressions. The first one is mandatory and defines, how many bytes of
2052   storage should be defined. The second, optional expression must by a
2053   constant byte value that will be used as value of the data. If there
2054   is no fill value given, the linker will use the value defined in the
2055   linker configuration file (default: zero).
2056
2057   Example:
2058
2059   <tscreen><verb>
2060         ; Reserve 12 bytes of memory with value $AA
2061         .res    12, $AA
2062   </verb></tscreen>
2063
2064
2065 <sect1><tt>.RIGHT</tt><label id=".RIGHT"><p>
2066
2067   Builtin function. Extracts the right part of a given token list.
2068
2069   Syntax:
2070
2071   <tscreen><verb>
2072         .RIGHT (&lt;int expr&gt;, &lt;token list&gt;)
2073   </verb></tscreen>
2074
2075   The first integer expression gives the number of tokens to extract from
2076   the token list. The second argument is the token list itself.
2077
2078   See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".MID"
2079   name=".MID"></tt> builtin functions.
2080
2081
2082 <sect1><tt>.RODATA</tt><label id=".RODATA"><p>
2083
2084   Switch to the RODATA segment. The name of the RODATA segment is always
2085   "RODATA", so this is a shortcut for
2086
2087   <tscreen><verb>
2088         .segment  "RODATA"
2089   </verb></tscreen>
2090
2091   The RODATA segment is a segment that is used by the compiler for
2092   readonly data like string constants.
2093
2094   See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2095
2096
2097 <sect1><tt>.SEGMENT</tt><label id=".SEGMENT"><p>
2098
2099   Switch to another segment. Code and data is always emitted into a
2100   segment, that is, a named section of data. The default segment is
2101   "CODE". There may be up to 254 different segments per object file
2102   (and up to 65534 per executable). There are shortcut commands for
2103   the most common segments ("CODE", "DATA" and "BSS").
2104
2105   The command is followed by a string containing the segment name (there
2106   are some constraints for the name - as a rule of thumb use only those
2107   segment names that would also be valid identifiers). There may also be
2108   an optional attribute separated by a comma. Valid attributes are
2109   "<tt/zeropage/" and "<tt/absolute/".
2110
2111   When specifying a segment for the first time, "absolute" is the
2112   default. For all other uses, the attribute specified the first time
2113   is the default.
2114
2115   "absolute" means that this is a segment with absolute addressing. That
2116   is, the segment will reside somewhere in core memory outside the zero
2117   page. "zeropage" means the opposite: The segment will be placed in the
2118   zero page and direct (short) addressing is possible for data in this
2119   segment.
2120
2121   Beware: Only labels in a segment with the zeropage attribute are marked
2122   as reachable by short addressing. The `*' (PC counter) operator will
2123   work as in other segments and will create absolute variable values.
2124
2125   Example:
2126
2127   <tscreen><verb>
2128         .segment "ROM2"                 ; Switch to ROM2 segment
2129         .segment "ZP2", zeropage        ; New direct segment
2130         .segment "ZP2"                  ; Ok, will use last attribute
2131         .segment "ZP2", absolute        ; Error, redecl mismatch
2132   </verb></tscreen>
2133
2134   See: <tt><ref id=".BSS" name=".BSS"></tt>, <tt><ref id=".CODE"
2135   name=".CODE"></tt>, <tt><ref id=".DATA" name=".DATA"></tt> and <tt><ref
2136   id=".RODATA" name=".RODATA"></tt>
2137
2138
2139 <sect1><tt>.SMART</tt><label id=".SMART"><p>
2140
2141   Switch on or off smart mode. The command must be followed by a '+' or
2142   '-' character to switch the option on or off respectively. The default
2143   is off (that is, the assembler doesn't try to be smart), but this
2144   default may be changed by the -s switch on the command line.
2145
2146   In smart mode the assembler will track usage of the <tt/REP/ and <tt/SEP/
2147   instructions in 65816 mode and update the operand sizes accordingly. If
2148   the operand of such an instruction cannot be evaluated by the assembler
2149   (for example, because the operand is an imported symbol), a warning is
2150   issued. Beware: Since the assembler cannot trace the execution flow this
2151   may lead to false results in some cases. If in doubt, use the <tt/.Inn/ and
2152   <tt/.Ann/ instructions to tell the assembler about the current settings.
2153
2154   Example:
2155
2156   <tscreen><verb>
2157         .smart                          ; Be smart
2158         .smart  -                       ; Stop being smart
2159   </verb></tscreen>
2160
2161
2162 <sect1><tt>.STRAT</tt><label id=".STRAT"><p>
2163
2164   Builtin function. The function accepts a string and an index as
2165   arguments and returns the value of the character at the given position
2166   as an integer value. The index is zero based.
2167
2168   Example:
2169
2170   <tscreen><verb>
2171         .macro  M       Arg
2172                 ; Check if the argument string starts with '#'
2173                 .if (.strat (Arg, 0) = '#')
2174                 ...
2175                 .endif
2176         .endmacro
2177   </verb></tscreen>
2178
2179
2180 <sect1><tt>.STRING</tt><label id=".STRING"><p>
2181
2182   Builtin function. The function accepts an argument in braces and converts
2183   this argument into a string constant. The argument may be an identifier, or
2184   a constant numeric value.
2185
2186   Since you can use a string in the first place, the use of the function may
2187   not be obvious. However, it is useful in macros, or more complex setups.
2188
2189   Example:
2190
2191   <tscreen><verb>
2192         ; Emulate other assemblers:
2193         .macro  section name
2194                 .segment        .string(name)
2195         .endmacro
2196   </verb></tscreen>
2197
2198
2199 <sect1><tt>.STRLEN</tt><label id=".STRLEN"><p>
2200
2201   Builtin function. The function accepts a string argument in braces and
2202   eveluates to the length of the string.
2203
2204   Example:
2205
2206   The following macro encodes a string as a pascal style string with
2207   a leading length byte.
2208
2209   <tscreen><verb>
2210         .macro  PString Arg
2211                 .byte   .strlen(Arg), Arg
2212         .endmacro
2213   </verb></tscreen>
2214
2215
2216 <sect1><tt>.TCOUNT</tt><label id=".TCOUNT"><p>
2217
2218   Builtin function. The function accepts a token list in braces. The
2219   function result is the number of tokens given as argument.
2220
2221   Example:
2222
2223   The <tt/ldax/ macro accepts the '#' token to denote immidiate addressing (as
2224   with the normal 6502 instructions). To translate it into two separate 8 bit
2225   load instructions, the '#' token has to get stripped from the argument:
2226
2227   <tscreen><verb>
2228         .macro  ldax    arg
2229                 .if (.match (.mid (0, 1, arg), #))
2230                 ; ldax called with immidiate operand
2231                 lda     #<(.right (.tcount (arg)-1, arg))
2232                 ldx     #>(.right (.tcount (arg)-1, arg))
2233                 .else
2234                 ...
2235                 .endif
2236         .endmacro
2237   </verb></tscreen>
2238
2239
2240 <sect1><tt>.TIME</tt><label id=".TIME"><p>
2241
2242   Reading this pseudo variable will give a constant integer value that
2243   represents the current time in POSIX standard (as seconds since the
2244   Epoch).
2245
2246   It may be used to encode the time of translation somewhere in the created
2247   code.
2248
2249   Example:
2250
2251   <tscreen><verb>
2252         .dword  .time   ; Place time here
2253   </verb></tscreen>
2254
2255
2256 <sect1><tt>.WARNING</tt><label id=".WARNING"><p>
2257
2258   Force an assembly warning. The assembler will output a warning message
2259   preceeded by "User warning". This warning will always be output, even if
2260   other warnings are disabled with the <tt><ref id="option-W" name="-W0"></tt>
2261   command line option.
2262
2263   This command may be used to output possible problems when assembling
2264   the source file.
2265
2266   Example:
2267
2268   <tscreen><verb>
2269         .macro  jne     target
2270                 .local L1
2271                 .ifndef target
2272                 .warning "Forward jump in jne, cannot optimize!"
2273                 beq     L1
2274                 jmp     target
2275         L1:
2276                 .else
2277                 ...
2278                 .endif
2279         .endmacro
2280   </verb></tscreen>
2281
2282   See also the <tt><ref id=".ERROR" name=".ERROR"></tt> and <tt><ref id=".OUT"
2283   name=".OUT"></tt> directives.
2284
2285
2286 <sect1><tt>.WORD</tt><label id=".WORD"><p>
2287
2288   Define word sized data. Must be followed by a sequence of (word ranged,
2289   but not necessarily constant) expressions.
2290
2291   Example:
2292
2293   <tscreen><verb>
2294         .word   $0D00, $AF13, _Clear
2295   </verb></tscreen>
2296
2297
2298 <sect1><tt>.XMATCH</tt><label id=".XMATCH"><p>
2299
2300   Builtin function. Matches two token lists against each other. This is
2301   most useful within macros, since macros are not stored as strings, but
2302   as lists of tokens.
2303
2304   The syntax is
2305
2306   <tscreen><verb>
2307         .XMATCH(&lt;token list #1&gt;, &lt;token list #2&gt;)
2308   </verb></tscreen>
2309
2310   Both token list may contain arbitrary tokens with the exception of the
2311   terminator token (comma resp. right parenthesis) and
2312
2313   <itemize>
2314   <item>end-of-line
2315   <item>end-of-file
2316   </itemize>
2317
2318   Often a macro parameter is used for any of the token lists.
2319
2320   The function compares tokens <em/and/ token values. If you need a function
2321   that just compares the type of tokens, have a look at the <tt><ref
2322   id=".MATCH" name=".MATCH"></tt> function.
2323
2324   See: <tt><ref id=".MATCH" name=".MATCH"></tt>
2325
2326
2327 <sect1><tt>.ZEROPAGE</tt><label id=".ZEROPAGE"><p>
2328
2329   Switch to the ZEROPAGE segment and mark it as direct (zeropage) segment.
2330   The name of the ZEROPAGE segment is always "ZEROPAGE", so this is a
2331   shortcut for
2332
2333   <tscreen><verb>
2334         .segment  "ZEROPAGE", zeropage
2335   </verb></tscreen>
2336
2337   Because of the "zeropage" attribute, labels declared in this segment are
2338   addressed using direct addressing mode if possible. You <em/must/ instruct
2339   the linker to place this segment somewhere in the address range 0..$FF
2340   otherwise you will get errors.
2341
2342   See: <tt><ref id=".SEGMENT" name=".SEGMENT"></tt>
2343
2344
2345
2346 <sect>Macros<label id="macros"><p>
2347
2348
2349 <sect1>Introduction<p>
2350
2351 Macros may be thought of as "parametrized super instructions". Macros are
2352 sequences of tokens that have a name. If that name is used in the source
2353 file, the macro is "expanded", that is, it is replaced by the tokens that
2354 were specified when the macro was defined.
2355
2356
2357 <sect1>Macros without parameters<p>
2358
2359 In it's simplest form, a macro does not have parameters. Here's an
2360 example:
2361
2362 <tscreen><verb>
2363         .macro  asr             ; Arithmetic shift right
2364                 cmp     #$80    ; Put bit 7 into carry
2365                 ror             ; Rotate right with carry
2366         .endmacro
2367 </verb></tscreen>
2368
2369 The macro above consists of two real instructions, that are inserted into
2370 the code, whenever the macro is expanded. Macro expansion is simply done
2371 by using the name, like this:
2372
2373 <tscreen><verb>
2374         lda     $2010
2375         asr
2376         sta     $2010
2377 </verb></tscreen>
2378
2379
2380 <sect1>Parametrized macros<p>
2381
2382 When using macro parameters, macros can be even more useful:
2383
2384 <tscreen><verb>
2385         .macro  inc16   addr
2386                 clc
2387                 lda     addr
2388                 adc     #$01
2389                 sta     addr
2390                 lda     addr+1
2391                 adc     #$00
2392                 sta     addr+1
2393         .endmacro
2394 </verb></tscreen>
2395
2396 When calling the macro, you may give a parameter, and each occurence of
2397 the name "addr" in the macro definition will be replaced by the given
2398 parameter. So
2399
2400 <tscreen><verb>
2401         inc16   $1000
2402 </verb></tscreen>
2403
2404 will be expanded to
2405
2406 <tscreen><verb>
2407                 clc
2408                 lda     $1000
2409                 adc     #$01
2410                 sta     $1000
2411                 lda     $1000+1
2412                 adc     #$00
2413                 sta     $1000+1
2414 </verb></tscreen>
2415
2416 A macro may have more than one parameter, in this case, the parameters
2417 are separated by commas. You are free to give less parameters than the
2418 macro actually takes in the definition. You may also leave intermediate
2419 parameters empty. Empty parameters are replaced by empty space (that is,
2420 they are removed when the macro is exanded). If you have a look at our
2421 macro definition above, you will see, that replacing the "addr" parameter
2422 by nothing will lead to wrong code in most lines. To help you, writing
2423 macros with a variable parameter list, there are some control commands:
2424
2425 <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> tests the rest of the line and
2426 returns true, if there are any tokens on the remainder of the line. Since
2427 empty parameters are replaced by nothing, this may be used to test if a given
2428 parameter is empty. <tt><ref id=".IFNBLANK" name=".IFNBLANK"></tt> tests the
2429 opposite.
2430
2431 Look at this example:
2432
2433 <tscreen><verb>
2434         .macro  ldaxy   a, x, y
2435         .ifnblank       a
2436                 lda     #a
2437         .endif
2438         .ifnblank       x
2439                 ldx     #x
2440         .endif
2441         .ifnblank       y
2442                 ldy     #y
2443         .endif
2444         .endmacro
2445 </verb></tscreen>
2446
2447 This macro may be called as follows:
2448
2449 <tscreen><verb>
2450         ldaxy   1, 2, 3         ; Load all three registers
2451
2452         ldaxy   1, , 3          ; Load only a and y
2453
2454         ldaxy   , , 3           ; Load y only
2455 </verb></tscreen>
2456
2457 There's another helper command for determining, which macro parameters are
2458 valid: <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt> This command is
2459 replaced by the parameter count given, <em/including/ intermediate empty macro
2460 parameters:
2461
2462 <tscreen><verb>
2463         ldaxy   1               ; .PARAMCOUNT = 1
2464         ldaxy   1,,3            ; .PARAMCOUNT = 3
2465         ldaxy   1,2             ; .PARAMCOUNT = 2
2466         ldaxy   1,              ; .PARAMCOUNT = 2
2467         ldaxy   1,2,3           ; .PARAMCOUNT = 3
2468 </verb></tscreen>
2469
2470
2471 <sect1>Recursive macros<p>
2472
2473 Macros may be used recursively:
2474
2475 <tscreen><verb>
2476         .macro  push    r1, r2, r3
2477                 lda     r1
2478                 pha
2479         .if     .paramcount > 1
2480                 push    r2, r3
2481         .endif
2482         .endmacro
2483 </verb></tscreen>
2484
2485 There's also a special macro to help writing recursive macros: <tt><ref
2486 id=".EXITMACRO" name=".EXITMACRO"></tt> This command will stop macro expansion
2487 immidiately:
2488
2489 <tscreen><verb>
2490         .macro  push    r1, r2, r3, r4, r5, r6, r7
2491         .ifblank        r1
2492                 ; First parameter is empty
2493                 .exitmacro
2494         .else
2495                 lda     r1
2496                 pha
2497         .endif
2498                 push    r2, r3, r4, r5, r6, r7
2499         .endmacro
2500 </verb></tscreen>
2501
2502 When expanding this macro, the expansion will push all given parameters
2503 until an empty one is encountered. The macro may be called like this:
2504
2505 <tscreen><verb>
2506         push    $20, $21, $32           ; Push 3 ZP locations
2507         push    $21                     ; Push one ZP location
2508 </verb></tscreen>
2509
2510
2511 <sect1>Local symbols inside macros<p>
2512
2513 Now, with recursive macros, <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> and
2514 <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt>, what else do you need?
2515 Have a look at the inc16 macro above. Here is it again:
2516
2517 <tscreen><verb>
2518         .macro  inc16   addr
2519                 clc
2520                 lda     addr
2521                 adc     #$01
2522                 sta     addr
2523                 lda     addr+1
2524                 adc     #$00
2525                 sta     addr+1
2526         .endmacro
2527 </verb></tscreen>
2528
2529 If you have a closer look at the code, you will notice, that it could be
2530 written more efficiently, like this:
2531
2532 <tscreen><verb>
2533         .macro  inc16   addr
2534                 inc     addr
2535                 bne     Skip
2536                 inc     addr+1
2537         Skip:
2538         .endmacro
2539 </verb></tscreen>
2540
2541 But imagine what happens, if you use this macro twice? Since the label
2542 "Skip" has the same name both times, you get a "duplicate symbol" error.
2543 Without a way to circumvent this problem, macros are not as useful, as
2544 they could be. One solution is, to start a new lexical block inside the
2545 macro:
2546
2547 <tscreen><verb>
2548         .macro  inc16   addr
2549         .proc
2550                 inc     addr
2551                 bne     Skip
2552                 inc     addr+1
2553         Skip:
2554         .endproc
2555         .endmacro
2556 </verb></tscreen>
2557
2558 Now the label is local to the block and not visible outside. However,
2559 sometimes you want a label inside the macro to be visible outside. To make
2560 that possible, there's a new command that's only usable inside a macro
2561 definition: <tt><ref id=".LOCAL" name=".LOCAL"></tt>. <tt/.LOCAL/ declares one
2562 or more symbols as local to the macro expansion. The names of local variables
2563 are replaced by a unique name in each separate macro expansion. So we could
2564 also solve the problem above by using <tt/.LOCAL/:
2565
2566 <tscreen><verb>
2567         .macro  inc16   addr
2568                 .local  Skip            ; Make Skip a local symbol
2569                 clc
2570                 lda     addr
2571                 adc     #$01
2572                 sta     addr
2573                 bcc     Skip
2574                 inc     addr+1
2575         Skip:                           ; Not visible outside
2576         .endmacro
2577 </verb></tscreen>
2578
2579
2580 <sect1>C style macros<p>
2581
2582 Starting with version 2.5 of the assembler, there is a second macro type
2583 available: C style macros using the <tt/.DEFINE/ directive. These macros are
2584 similar to the classic macro type described above, but behaviour is sometimes
2585 different:
2586
2587 <itemize>
2588
2589 <item>  Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> may not
2590         span more than a line. You may use line continuation (see <tt><ref
2591         id=".LINECONT" name=".LINECONT"></tt>) to spread the definition over
2592         more than one line for increased readability, but the macro itself
2593         may not contain an end-of-line token.
2594
2595 <item>  Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> share
2596         the name space with classic macros, but they are detected and replaced
2597         at the scanner level. While classic macros may be used in every place,
2598         where a mnemonic or other directive is allowed, <tt><ref id=".DEFINE"
2599         name=".DEFINE"></tt> style macros are allowed anywhere in a line. So
2600         they are more versatile in some situations.
2601
2602 <item>  <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may take
2603         parameters. While classic macros may have empty parameters, this is
2604         not true for <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros.
2605         For this macro type, the number of actual parameters must match
2606         exactly the number of formal parameters.
2607
2608         To make this possible, formal parameters are enclosed in braces when
2609         defining the macro. If there are no parameters, the empty braces may
2610         be omitted.
2611
2612 <item>  Since <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may not
2613         contain end-of-line tokens, there are things that cannot be done. They
2614         may not contain several processor instructions for example. So, while
2615         some things may be done with both macro types, each type has special
2616         usages. The types complement each other.
2617
2618 </itemize>
2619
2620 Let's look at a few examples to make the advantages and disadvantages
2621 clear.
2622
2623 To emulate assemblers that use "<tt/EQU/" instead of "<tt/=/" you may use the
2624 following <tt/.DEFINE/:
2625
2626 <tscreen><verb>
2627         .define EQU     =
2628
2629         foo     EQU     $1234           ; This is accepted now
2630 </verb></tscreen>
2631
2632 You may use the directive to define string constants used elsewhere:
2633
2634 <tscreen><verb>
2635         ; Define the version number
2636         .define VERSION         "12.3a"
2637
2638         ; ... and use it
2639         .asciiz VERSION
2640 </verb></tscreen>
2641
2642 Macros with parameters may also be useful:
2643
2644 <tscreen><verb>
2645         .define DEBUG(message)  .out    message
2646
2647         DEBUG   "Assembling include file #3"
2648 </verb></tscreen>
2649
2650 Note that, while formal parameters have to be placed in braces, this is
2651 not true for the actual parameters. Beware: Since the assembler cannot
2652 detect the end of one parameter, only the first token is used. If you
2653 don't like that, use classic macros instead:
2654
2655 <tscreen><verb>
2656         .macro  message
2657                 .out    message
2658         .endmacro
2659 </verb></tscreen>
2660
2661 (This is an example where a problem can be solved with both macro types).
2662
2663
2664 <sect1>Characters in macros<p>
2665
2666 When using the <ref id="option-t" name="-t"> option, characters are translated
2667 into the target character set of the specific machine. However, this happens
2668 as late as possible. This means that strings are translated if they are part
2669 of a <tt><ref id=".BYTE" name=".BYTE"></tt> or <tt><ref id=".ASCIIZ"
2670 name=".ASCIIZ"></tt> command. Characters are translated as soon as they are
2671 used as part of an expression.
2672
2673 This behaviour is very intuitive outside of macros but may be confusing when
2674 doing more complex macros. If you compare characters against numeric values,
2675 be sure to take the translation into account.
2676
2677
2678
2679
2680 <sect>Macro packages<label id="macropackages"><p>
2681
2682 Using the <tt><ref id=".MACPACK" name=".MACPACK"></tt> directive, predefined
2683 macro packages may be included with just one command. Available macro packages
2684 are:
2685
2686
2687 <sect1><tt>.MACPACK generic</tt><p>
2688
2689 This macro package defines macros that are useful in almost any program.
2690 Currently, two macros are defined:
2691
2692 <tscreen><verb>
2693         .macro  add     Arg
2694                 clc
2695                 adc     Arg
2696         .endmacro
2697
2698         .macro  sub     Arg
2699                 sec
2700                 sbc     Arg
2701         .endmacro
2702 </verb></tscreen>
2703
2704
2705 <sect1><tt>.MACPACK longbranch</tt><p>
2706
2707 This macro package defines long conditional jumps. They are named like the
2708 short counterpart but with the 'b' replaced by a 'j'. Here is a sample
2709 definition for the "<tt/jeq/" macro, the other macros are built using the same
2710 scheme:
2711
2712 <tscreen><verb>
2713         .macro  jeq     Target
2714                 .if     .def(Target) .and ((*+2)-(Target) <= 127)
2715                 beq     Target
2716                 .else
2717                 bne     *+5
2718                 jmp     Target
2719                 .endif
2720         .endmacro
2721 </verb></tscreen>
2722
2723 All macros expand to a short branch, if the label is already defined (back
2724 jump) and is reachable with a short jump. Otherwise the macro expands to a
2725 conditional branch with the branch condition inverted, followed by an absolute
2726 jump to the actual branch target.
2727
2728 The package defines the following macros:
2729
2730 <tscreen><verb>
2731         jeq, jne, jmi, jpl, jcs, jcc, jvs, jvc
2732 </verb></tscreen>
2733
2734
2735
2736 <sect>Module constructors/destructors<label id="condes"><p>
2737
2738 <em>Note:</em> This section applies mostly to C programs, so the explanation
2739 below uses examples from the C libraries. However, the feature may also be
2740 useful for assembler programs.
2741
2742
2743 <sect1>Module overview<p>
2744
2745 Using the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> and <tt><ref
2746 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> keywords it it possible to export
2747 functions in a special way. The linker is able to generate tables with all
2748 functions of a specific type. Such a table will <em>only</em> include symbols
2749 from object files that are linked into a specific executable. This may be used
2750 to add initialization and cleanup code for library modules.
2751
2752 The C heap functions are an example where module initialization code is used.
2753 All heap functions (<tt>malloc</tt>, <tt>free</tt>, ...) work with a few
2754 variables that contain the start and the end of the heap, pointers to the free
2755 list and so on. Since the end of the heap depends on the size and start of the
2756 stack, it must be initialized at runtime. However, initializing these
2757 variables for programs that do not use the heap are a waste of time and
2758 memory.
2759
2760 So the central module defines a function that contains initialization code and
2761 exports this function using the <tt/.CONSTRUCTOR/ statement. If (and only if)
2762 this module is added to an executable by the linker, the initialization
2763 function will be placed into the table of constructors by the linker. The C
2764 startup code will call all constructors before <tt/main/ and all destructors
2765 after <tt/main/, so without any further work, the heap initialization code is
2766 called once the module is linked in.
2767
2768 While it would be possible to add explicit calls to initialization functions
2769 in the startup code, the new approach has several advantages:
2770
2771 <enum>
2772 <item>
2773 If a module is not included, the initialization code is not linked in and not
2774 called. So you don't pay for things you don't need.
2775
2776 <item>
2777 Adding another library that needs initialization does not mean that the
2778 startup code has to be changed. Before we had module constructors and
2779 destructors, the startup code for all systems had to be adjusted to call the
2780 new initialization code.
2781
2782 <item>
2783 The feature saves memory: Each additional initialization function needs just
2784 two bytes in the table (a pointer to the function).
2785
2786 </enum>
2787
2788
2789 <sect1>Pitfalls<p>
2790
2791 When creating and using module constructors and destructors, please take care
2792 of the following:
2793
2794 <itemize>
2795
2796 <item>
2797 The linker will only generate function tables, it will not generate code to
2798 call these functions. If you're using the feature in some other than the
2799 existing C environments, you have to write code to call all functions in a
2800 linker generated table yourself. See the <tt>condes</tt> module in the C
2801 runtime for an example on how to do this.
2802
2803 <item>
2804 The linker will only add addresses of functions that are in modules linked to
2805 the executable. This means that you have to be careful where to place the
2806 condes functions. If initialization is needed for a group of functions, be
2807 sure to place the initialization function into a module that is linked in
2808 regardless of which function is called by the user.
2809
2810 <item>
2811 The linker will generate the tables only when requested to do so by the
2812 <tt/FEATURE CONDES/ statement in the linker config file. Each table has to
2813 be requested separately.
2814
2815 <item>
2816 Constructors and destructors may have priorities. These priorities determine
2817 the order of the functions in the table. If your intialization or cleanup code
2818 does depend on other initialization or cleanup code, you have to choose the
2819 priority for the functions accordingly.
2820
2821 <item>
2822 Besides the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> and <tt><ref
2823 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> statements, there is also a more
2824 generic command: <tt><ref id=".CONDES" name=".CONDES"></tt>. This allows to
2825 specify an additional type. Predefined types are 0 (constructor) and 1
2826 (destructor). The linker generates a separate table for each type on request.
2827
2828 </itemize>
2829
2830
2831
2832
2833
2834 <sect>Bugs/Feedback<p>
2835
2836 If you have problems using the assembler, if you find any bugs, or if
2837 you're doing something interesting with the assembler, I would be glad to
2838 hear from you. Feel free to contact me by email
2839 (<htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org">).
2840
2841
2842
2843 <sect>Copyright<p>
2844
2845 ca65 (and all cc65 binutils) are (C) Copyright 1998-2001 Ullrich von
2846 Bassewitz. For usage of the binaries and/or sources the following
2847 conditions do apply:
2848
2849 This software is provided 'as-is', without any expressed or implied
2850 warranty.  In no event will the authors be held liable for any damages
2851 arising from the use of this software.
2852
2853 Permission is granted to anyone to use this software for any purpose,
2854 including commercial applications, and to alter it and redistribute it
2855 freely, subject to the following restrictions:
2856
2857 <enum>
2858 <item>  The origin of this software must not be misrepresented; you must not
2859         claim that you wrote the original software. If you use this software
2860         in a product, an acknowledgment in the product documentation would be
2861         appreciated but is not required.
2862 <item>  Altered source versions must be plainly marked as such, and must not
2863         be misrepresented as being the original software.
2864 <item>  This notice may not be removed or altered from any source
2865         distribution.
2866 </enum>
2867
2868
2869
2870 </article>
2871
2872
2873