1 <!doctype linuxdoc system>
4 <title>ca65 Users Guide
5 <author>Ullrich von Bassewitz, <htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org">
6 <date>2000-07-19, 2000-11-29, 2001-10-02, 2005-09-08
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.
14 <!-- Table of contents -->
17 <!-- Begin the document -->
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.
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.
32 <sect1>Design criteria<p>
34 Here's a list of the design criteria, that I considered important for the
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
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
62 <item> True lexical nesting for symbols. This is very convenient for larger
64 <item> "Cheap" local symbols without lexical nesting for those quick, late
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
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.
82 <sect1>Command line option overview<p>
84 The assembler accepts the following options:
87 ---------------------------------------------------------------------------
88 Usage: ca65 [options] file
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
97 -i Ignore case of symbols
98 -l name Create a listing file if assembly was ok
99 -mm model Set the memory model
100 -o name Name the output file
102 -t sys Set the target system
103 -v Increase verbosity
106 --auto-import Mark unresolved symbols as import
107 --bin-include-dir dir Set a search path for binary includes
108 --cpu type Set cpu type
109 --create-dep name Create a make dependency file
110 --create-full-dep name Create a full make dependency file
111 --debug-info Add debug info to object file
112 --feature name Set an emulation feature
113 --forget-inc-paths Forget include search paths
114 --help Help (this text)
115 --ignore-case Ignore case of symbols
116 --include-dir dir Set an include directory search path
117 --listing name Create a listing file if assembly was ok
118 --list-bytes n Maximum number of bytes per listing line
119 --macpack-dir dir Set a macro package directory
120 --memory-model model Set the memory model
121 --pagelength n Set the page length for the listing
122 --smart Enable smart mode
123 --target sys Set the target system
124 --verbose Increase verbosity
125 --version Print the assembler version
126 ---------------------------------------------------------------------------
130 <sect1>Command line options in detail<p>
132 Here is a description of all the command line options:
136 <label id="option--bin-include-dir">
137 <tag><tt>--bin-include-dir dir</tt></tag>
139 Name a directory which is searched for binary include files. The option
140 may be used more than once to specify more than one directory to search. The
141 current directory is always searched first before considering any
142 additional directories. See also the section about <ref id="search-paths"
143 name="search paths">.
146 <label id="option--cpu">
147 <tag><tt>--cpu type</tt></tag>
149 Set the default for the CPU type. The option takes a parameter, which
152 6502, 65SC02, 65C02, 65816, sunplus, sweet16, HuC6280
154 The sunplus cpu is not available in the freeware version, because the
155 instruction set is "proprietary and confidential".
158 <label id="option-create-dep">
159 <tag><tt>--create-dep name</tt></tag>
161 Tells the assembler to generate a file containing the dependency list for
162 the assembled module in makefile syntax. The output is written to a file
163 with the given name. The output does not include files passed via debug
164 information to the assembler.
167 <label id="option-create-full-dep">
168 <tag><tt>--create-full-dep name</tt></tag>
170 Tells the assembler to generate a file containing the dependency list for
171 the assembled module in makefile syntax. The output is written to a file
172 with the given name. The output does include files passed via debug
173 information to the assembler.
176 <label id="option--feature">
177 <tag><tt>--feature name</tt></tag>
179 Enable an emulation feature. This is identical as using <tt/.FEATURE/
180 in the source with two exceptions: Feature names must be lower case, and
181 each feature must be specified by using an extra <tt/--feature/ option,
182 comma separated lists are not allowed.
184 See the discussion of the <tt><ref id=".FEATURE" name=".FEATURE"></tt>
185 command for a list of emulation features.
188 <label id="option--forget-inc-paths">
189 <tag><tt>--forget-inc-paths</tt></tag>
191 Forget the builtin include paths. This is most useful when building
192 customized assembler modules, in which case the standard header files should
196 <label id="option-g">
197 <tag><tt>-g, --debug-info</tt></tag>
199 When this option (or the equivalent control command <tt/.DEBUGINFO/) is
200 used, the assembler will add a section to the object file that contains
201 all symbols (including local ones) together with the symbol values and
202 source file positions. The linker will put these additional symbols into
203 the VICE label file, so even local symbols can be seen in the VICE
207 <label id="option-h">
208 <tag><tt>-h, --help</tt></tag>
210 Print the short option summary shown above.
213 <label id="option-i">
214 <tag><tt>-i, --ignore-case</tt></tag>
216 This option makes the assembler case insensitive on identifiers and labels.
217 This option will override the default, but may itself be overridden by the
218 <tt><ref id=".CASE" name=".CASE"></tt> control command.
221 <label id="option-l">
222 <tag><tt>-l name, --listing name</tt></tag>
224 Generate an assembler listing with the given name. A listing file will
225 never be generated in case of assembly errors.
228 <label id="option--list-bytes">
229 <tag><tt>--list-bytes n</tt></tag>
231 Set the maximum number of bytes printed in the listing for one line of
232 input. See the <tt><ref id=".LISTBYTES" name=".LISTBYTES"></tt> directive
233 for more information. The value zero can be used to encode an unlimited
234 number of printed bytes.
237 <label id="option--macpack-dir">
238 <tag><tt>--macpack-dir dir</tt></tag>
240 This options allows to specify a directory containing macro files that are
241 used instead of the builtin images when a <tt><ref id=".MACPACK"
242 name=".MACPACK"></tt> directive is encountered. If <tt>--macpack-dir</tt>
243 was specified, a <tt>.mac</tt> extension is added to the package name and
244 the resulting file is loaded from the given directory. This is most useful
245 when debugging the builtin macro packages.
248 <label id="option-mm">
249 <tag><tt>-mm model, --memory-model model</tt></tag>
251 Define the default memory model. Possible model specifiers are near, far and
255 <label id="option-o">
256 <tag><tt>-o name</tt></tag>
258 The default output name is the name of the input file with the extension
259 replaced by ".o". If you don't like that, you may give another name with
260 the -o option. The output file will be placed in the same directory as
261 the source file, or, if -o is given, the full path in this name is used.
264 <label id="option--pagelength">
265 <tag><tt>--pagelength n</tt></tag>
267 sets the length of a listing page in lines. See the <tt><ref
268 id=".PAGELENGTH" name=".PAGELENGTH"></tt> directive for more information.
271 <label id="option-s">
272 <tag><tt>-s, --smart-mode</tt></tag>
274 In smart mode (enabled by -s or the <tt><ref id=".SMART" name=".SMART"></tt>
275 pseudo instruction) the assembler will track usage of the <tt/REP/ and
276 <tt/SEP/ instructions in 65816 mode and update the operand sizes
277 accordingly. If the operand of such an instruction cannot be evaluated by
278 the assembler (for example, because the operand is an imported symbol), a
281 Beware: Since the assembler cannot trace the execution flow this may
282 lead to false results in some cases. If in doubt, use the .ixx and .axx
283 instructions to tell the assembler about the current settings. Smart
284 mode is off by default.
287 <label id="option-t">
288 <tag><tt>-t sys, --target sys</tt></tag>
290 Set the target system. This will enable translation of character strings and
291 character constants into the character set of the target platform. The
292 default for the target system is "none", which means that no translation
293 will take place. The assembler supports the same target systems as the
294 compiler, see there for a list.
296 Depending on the target, the default CPU type is also set. This can be
297 overriden by using the <tt/<ref id="option--cpu" name="--cpu">/ option.
300 <label id="option-v">
301 <tag><tt>-v, --verbose</tt></tag>
303 Increase the assembler verbosity. Usually only needed for debugging
304 purposes. You may use this option more than one time for even more
308 <label id="option-D">
309 <tag><tt>-D</tt></tag>
311 This option allows you to define symbols on the command line. Without a
312 value, the symbol is defined with the value zero. When giving a value,
313 you may use the '$' prefix for hexadecimal symbols. Please note
314 that for some operating systems, '$' has a special meaning, so
315 you may have to quote the expression.
318 <label id="option-I">
319 <tag><tt>-I dir, --include-dir dir</tt></tag>
321 Name a directory which is searched for include files. The option may be
322 used more than once to specify more than one directory to search. The
323 current directory is always searched first before considering any
324 additional directories. See also the section about <ref id="search-paths"
325 name="search paths">.
328 <label id="option-U">
329 <tag><tt>-U, --auto-import</tt></tag>
331 Mark symbols that are not defined in the sources as imported symbols. This
332 should be used with care since it delays error messages about typos and such
333 until the linker is run. The compiler uses the equivalent of this switch
334 (<tt><ref id=".AUTOIMPORT" name=".AUTOIMPORT"></tt>) to enable auto imported
335 symbols for the runtime library. However, the compiler is supposed to
336 generate code that runs through the assembler without problems, something
337 which is not always true for assembler programmers.
340 <label id="option-V">
341 <tag><tt>-V, --version</tt></tag>
343 Print the version number of the assembler. If you send any suggestions
344 or bugfixes, please include the version number.
347 <label id="option-W">
348 <tag><tt>-Wn</tt></tag>
350 Set the warning level for the assembler. Using -W2 the assembler will
351 even warn about such things like unused imported symbols. The default
352 warning level is 1, and it would probably be silly to set it to
360 <sect>Search paths<label id="search-paths"><p>
362 Normal include files are searched in the following places:
365 <item>The current directory.
366 <item>A compiled-in directory, which is often <tt>/usr/lib/cc65/asminc</tt>
368 <item>The value of the environment variable <tt/CA65_INC/ if it is defined.
369 <item>A subdirectory named <tt/asminc/ of the directory defined in the
370 environment variable <tt/CC65_HOME/, if it is defined.
371 <item>Any directory added with the <tt/<ref id="option-I" name="-I">/ option
375 Binary include files are searched in the following places:
378 <item>The current directory.
379 <item>Any directory added with the <tt/<ref id="option--bin-include-dir"
380 name="--bin-include-dir">/ option on the command line.
385 <sect>Input format<p>
387 <sect1>Assembler syntax<p>
389 The assembler accepts the standard 6502/65816 assembler syntax. One line may
390 contain a label (which is identified by a colon), and, in addition to the
391 label, an assembler mnemonic, a macro, or a control command (see section <ref
392 id="control-commands" name="Control Commands"> for supported control
393 commands). Alternatively, the line may contain a symbol definition using
394 the '=' token. Everything after a semicolon is handled as a comment (that is,
397 Here are some examples for valid input lines:
400 Label: ; A label and a comment
401 lda #$20 ; A 6502 instruction plus comment
402 L1: ldx #$20 ; Same with label
403 L2: .byte "Hello world" ; Label plus control command
404 mymac $20 ; Macro expansion
405 MySym = 3*L1 ; Symbol definition
406 MaSym = Label ; Another symbol
409 The assembler accepts
412 <item>all valid 6502 mnemonics when in 6502 mode (the default or after the
413 <tt><ref id=".P02" name=".P02"></tt> command was given).
414 <item>all valid 6502 mnemonics plus a set of illegal instructions when in
415 <ref id="6502X-mode" name="6502X mode">.
416 <item>all valid 65SC02 mnemonics when in 65SC02 mode (after the
417 <tt><ref id=".PSC02" name=".PSC02"></tt> command was given).
418 <item>all valid 65C02 mnemonics when in 65C02 mode (after the
419 <tt><ref id=".PC02" name=".PC02"></tt> command was given).
420 <item>all valid 65618 mnemonics when in 65816 mode (after the
421 <tt><ref id=".P816" name=".P816"></tt> command was given).
422 <item>all valid SunPlus mnemonics when in SunPlus mode (after the
423 <tt><ref id=".SUNPLUS" name=".SUNPLUS"></tt> command was given).
429 In 65816 mode several aliases are accepted in addition to the official
433 BGE is an alias for BCS
434 BLT is an alias for BCC
435 CPA is an alias for CMP
436 DEA is an alias for DEC A
437 INA is an alias for INC A
438 SWA is an alias for XBA
439 TAD is an alias for TCD
440 TAS is an alias for TCS
441 TDA is an alias for TDC
442 TSA is an alias for TSC
447 <sect1>6502X mode<label id="6502X-mode"><p>
449 6502X mode is an extension to the normal 6502 mode. In this mode, several
450 mnemonics for illegal instructions of the NMOS 6502 CPUs are accepted. Since
451 these instructions are illegal, there are no official mnemonics for them. The
452 unofficial ones are taken from <htmlurl
453 url="http://www.oxyron.de/html/opcodes02.html"
454 name="http://www.oxyron.de/html/opcodes02.html">. Please note that only the
455 ones marked as "stable" are supported. The following table uses information
456 from the mentioned web page, for more information, see there.
459 <item><tt>ALR: A:=(A and #{imm})/2;</tt>
460 <item><tt>ANC: A:=A and #{imm};</tt> Generates opcode $0B.
461 <item><tt>ARR: A:=(A and #{imm})/2;</tt>
462 <item><tt>AXS: X:=A and X-#{imm};</tt>
463 <item><tt>DCP: {adr}:={adr}-1; A-{adr};</tt>
464 <item><tt>ISC: {adr}:={adr}+1; A:=A-{adr};</tt>
465 <item><tt>LAS: A,X,S:={adr} and S;</tt>
466 <item><tt>LAX: A,X:={adr};</tt>
467 <item><tt>RLA: {adr}:={adr}rol; A:=A and {adr};</tt>
468 <item><tt>RRA: {adr}:={adr}ror; A:=A adc {adr};</tt>
469 <item><tt>SAX: {adr}:=A and X;</tt>
470 <item><tt>SLO: {adr}:={adr}*2; A:=A or {adr};</tt>
471 <item><tt>SRE: {adr}:={adr}/2; A:=A xor {adr};</tt>
476 <sect1>sweet16 mode<label id="sweet16-mode"><p>
478 SWEET 16 is an interpreter for a pseudo 16 bit CPU written by Steve Wozniak
479 for the Apple ][ machines. It is available in the Apple ][ ROM. ca65 can
480 generate code for this pseudo CPU when switched into sweet16 mode. The
481 following is special in sweet16 mode:
485 <item>The '@' character denotes indirect addressing and is no longer available
486 for cheap local labels. If you need cheap local labels, you will have to
487 switch to another lead character using the <tt/<ref id=".LOCALCHAR"
488 name=".LOCALCHAR">/ command.
490 <item>Registers are specified using <tt/R0/ .. <tt/R15/. In sweet16 mode,
491 these identifiers are reserved words.
495 Please note that the assembler does neither supply the interpreter needed for
496 SWEET 16 code, nor the zero page locations needed for the SWEET 16 registers,
497 nor does it call the interpreter. All this must be done by your program. Apple
498 ][ programmers do probably know how to use sweet16 mode.
500 For more information about SWEET 16, see
501 <htmlurl url="http://www.6502.org/source/interpreters/sweet16.htm"
502 name="http://www.6502.org/source/interpreters/sweet16.htm">.
505 <sect1>Number format<p>
507 For literal values, the assembler accepts the widely used number formats: A
508 preceding '$' or a trailing 'h' denotes a hex value, a preceding '%'
509 denotes a binary value, and a bare number is interpreted as a decimal. There
510 are currently no octal values and no floats.
513 <sect1>Conditional assembly<p>
515 Please note that when using the conditional directives (<tt/.IF/ and friends),
516 the input must consist of valid assembler tokens, even in <tt/.IF/ branches
517 that are not assembled. The reason for this behaviour is that the assembler
518 must still be able to detect the ending tokens (like <tt/.ENDIF/), so
519 conversion of the input stream into tokens still takes place. As a consequence
520 conditional assembly directives may <bf/not/ be used to prevent normal text
521 (used as a comment or similar) from being assembled. <p>
527 <sect1>Expression evaluation<p>
529 All expressions are evaluated with (at least) 32 bit precision. An
530 expression may contain constant values and any combination of internal and
531 external symbols. Expressions that cannot be evaluated at assembly time
532 are stored inside the object file for evaluation by the linker.
533 Expressions referencing imported symbols must always be evaluated by the
537 <sect1>Size of an expression result<p>
539 Sometimes, the assembler must know about the size of the value that is the
540 result of an expression. This is usually the case, if a decision has to be
541 made, to generate a zero page or an absolute memory references. In this
542 case, the assembler has to make some assumptions about the result of an
546 <item> If the result of an expression is constant, the actual value is
547 checked to see if it's a byte sized expression or not.
548 <item> If the expression is explicitly casted to a byte sized expression by
549 one of the '>', '<' or '^' operators, it is a byte expression.
550 <item> If this is not the case, and the expression contains a symbol,
551 explicitly declared as zero page symbol (by one of the .importzp or
552 .exportzp instructions), then the whole expression is assumed to be
554 <item> If the expression contains symbols that are not defined, and these
555 symbols are local symbols, the enclosing scopes are searched for a
556 symbol with the same name. If one exists and this symbol is defined,
557 its attributes are used to determine the result size.
558 <item> In all other cases the expression is assumed to be word sized.
561 Note: If the assembler is not able to evaluate the expression at assembly
562 time, the linker will evaluate it and check for range errors as soon as
566 <sect1>Boolean expressions<p>
568 In the context of a boolean expression, any non zero value is evaluated as
569 true, any other value to false. The result of a boolean expression is 1 if
570 it's true, and zero if it's false. There are boolean operators with extreme
571 low precedence with version 2.x (where x > 0). The <tt/.AND/ and <tt/.OR/
572 operators are shortcut operators. That is, if the result of the expression is
573 already known, after evaluating the left hand side, the right hand side is
577 <sect1>Constant expressions<p>
579 Sometimes an expression must evaluate to a constant without looking at any
580 further input. One such example is the <tt/<ref id=".IF" name=".IF">/ command
581 that decides if parts of the code are assembled or not. An expression used in
582 the <tt/.IF/ command cannot reference a symbol defined later, because the
583 decision about the <tt/.IF/ must be made at the point when it is read. If the
584 expression used in such a context contains only constant numerical values,
585 there is no problem. When unresolvable symbols are involved it may get harder
586 for the assembler to determine if the expression is actually constant, and it
587 is even possible to create expressions that aren't recognized as constant.
588 Simplifying the expressions will often help.
590 In cases where the result of the expression is not needed immediately, the
591 assembler will delay evaluation until all input is read, at which point all
592 symbols are known. So using arbitrary complex constant expressions is no
593 problem in most cases.
597 <sect1>Available operators<label id="operators"><p>
601 <bf/Operator/| <bf/Description/| <bf/Precedence/@<hline>
602 | Built-in string functions| 0@
604 | Built-in pseudo-variables| 1@
605 | Built-in pseudo-functions| 1@
606 +| Unary positive| 1@
607 -| Unary negative| 1@
609 .BITNOT| Unary bitwise not| 1@
611 .LOBYTE| Unary low-byte operator| 1@
613 .HIBYTE| Unary high-byte operator| 1@
615 .BANKBYTE| Unary bank-byte operator| 1@
617 *| Multiplication| 2@
619 .MOD| Modulo operator| 2@
621 .BITAND| Bitwise and| 2@
623 .BITXOR| Binary bitwise xor| 2@
625 .SHL| Shift-left operator| 2@
627 .SHR| Shift-right operator| 2@
629 +| Binary addition| 3@
630 -| Binary subtraction| 3@
632 .BITOR| Bitwise or| 3@
634 = | Compare operator (equal)| 4@
635 <>| Compare operator (not equal)| 4@
636 <| Compare operator (less)| 4@
637 >| Compare operator (greater)| 4@
638 <=| Compare operator (less or equal)| 4@
639 >=| Compare operator (greater or equal)| 4@
642 .AND| Boolean and| 5@
643 .XOR| Boolean xor| 5@
645 ||<newline>
649 .NOT| Boolean not| 7@<hline>
651 <caption>Available operators, sorted by precedence
654 To force a specific order of evaluation, parentheses may be used, as usual.
658 <sect>Symbols and labels<p>
660 A symbol or label is an identifier that starts with a letter and is followed
661 by letters and digits. Depending on some features enabled (see
662 <tt><ref id="at_in_identifiers" name="at_in_identifiers"></tt>,
663 <tt><ref id="dollar_in_identifiers" name="dollar_in_identifiers"></tt> and
664 <tt><ref id="leading_dot_in_identifiers" name="leading_dot_in_identifiers"></tt>)
665 other characters may be present. Use of identifiers consisting of a single
666 character will not work in all cases, because some of these identifiers are
667 reserved keywords (for example "A" is not a valid identifier for a label,
668 because it is the keyword for the accumulator).
670 The assembler allows you to use symbols instead of naked values to make
671 the source more readable. There are a lot of different ways to define and
672 use symbols and labels, giving a lot of flexibility.
674 <sect1>Numeric constants<p>
676 Numeric constants are defined using the equal sign or the label assignment
677 operator. After doing
683 may use the symbol "two" in every place where a number is expected, and it is
684 evaluated to the value 2 in this context. The label assignment operator is
685 almost identical, but causes the symbol to be marked as a label, so it may be
686 handled differently in a debugger:
692 The right side can of course be an expression:
700 <sect1>Numeric variables<p>
702 Within macros and other control structures (<tt><ref id=".REPEAT"
703 name=".REPEAT"></tt>, ...) it is sometimes useful to have some sort of
704 variable. This can be achieved by the <tt>.SET</tt> operator. It creates a
705 symbol that may get assigned a different value later:
709 lda #four ; Loads 4 into A
711 lda #four ; Loads 3 into A
714 Since the value of the symbol can change later, it must be possible to
715 evaluate it when used (no delayed evaluation as with normal symbols). So the
716 expression used as the value must be constant.
718 Following is an example for a macro that generates a different label each time
719 it is used. It uses the <tt><ref id=".SPRINTF" name=".SPRINTF"></tt> function
720 and a numeric variable named <tt>lcount</tt>.
723 .lcount .set 0 ; Initialize the counter
726 .ident (.sprintf ("L%04X", lcount)):
727 lcount .set lcount + 1
732 <sect1>Standard labels<p>
734 A label is defined by writing the name of the label at the start of the line
735 (before any instruction mnemonic, macro or pseudo directive), followed by a
736 colon. This will declare a symbol with the given name and the value of the
737 current program counter.
740 <sect1>Local labels and symbols<p>
742 Using the <tt><ref id=".PROC" name=".PROC"></tt> directive, it is possible to
743 create regions of code where the names of labels and symbols are local to this
744 region. They are not known outside of this region and cannot be accessed from
745 there. Such regions may be nested like PROCEDUREs in Pascal.
747 See the description of the <tt><ref id=".PROC" name=".PROC"></tt>
748 directive for more information.
751 <sect1>Cheap local labels<p>
753 Cheap local labels are defined like standard labels, but the name of the
754 label must begin with a special symbol (usually '@', but this can be
755 changed by the <tt><ref id=".LOCALCHAR" name=".LOCALCHAR"></tt>
758 Cheap local labels are visible only between two non cheap labels. As soon as a
759 standard symbol is encountered (this may also be a local symbol if inside a
760 region defined with the <tt><ref id=".PROC" name=".PROC"></tt> directive), the
761 cheap local symbol goes out of scope.
763 You may use cheap local labels as an easy way to reuse common label
764 names like "Loop". Here is an example:
767 Clear: lda #$00 ; Global label
769 @Loop: sta Mem,y ; Local label
773 Sub: ... ; New global label
774 bne @Loop ; ERROR: Unknown identifier!
777 <sect1>Unnamed labels<p>
779 If you really want to write messy code, there are also unnamed labels. These
780 labels do not have a name (you guessed that already, didn't you?). A colon is
781 used to mark the absence of the name.
783 Unnamed labels may be accessed by using the colon plus several minus or plus
784 characters as a label designator. Using the '-' characters will create a back
785 reference (use the n'th label backwards), using '+' will create a forward
786 reference (use the n'th label in forward direction). An example will help to
809 As you can see from the example, unnamed labels will make even short
810 sections of code hard to understand, because you have to count labels
811 to find branch targets (this is the reason why I for my part do
812 prefer the "cheap" local labels). Nevertheless, unnamed labels are
813 convenient in some situations, so it's your decision.
816 <sect1>Using macros to define labels and constants<p>
818 While there are drawbacks with this approach, it may be handy in some
819 situations. Using <tt><ref id=".DEFINE" name=".DEFINE"></tt>, it is
820 possible to define symbols or constants that may be used elsewhere. Since
821 the macro facility works on a very low level, there is no scoping. On the
822 other side, you may also define string constants this way (this is not
823 possible with the other symbol types).
829 .DEFINE version "SOS V2.3"
831 four = two * two ; Ok
834 .PROC ; Start local scope
835 two = 3 ; Will give "2 = 3" - invalid!
840 <sect1>Symbols and <tt>.DEBUGINFO</tt><p>
842 If <tt><ref id=".DEBUGINFO" name=".DEBUGINFO"></tt> is enabled (or <ref
843 id="option-g" name="-g"> is given on the command line), global, local and
844 cheap local labels are written to the object file and will be available in the
845 symbol file via the linker. Unnamed labels are not written to the object file,
846 because they don't have a name which would allow to access them.
850 <sect>Scopes<label id="scopes"><p>
852 ca65 implements several sorts of scopes for symbols.
854 <sect1>Global scope<p>
856 All (non cheap local) symbols that are declared outside of any nested scopes
860 <sect1>Cheap locals<p>
862 A special scope is the scope for cheap local symbols. It lasts from one non
863 local symbol to the next one, without any provisions made by the programmer.
864 All other scopes differ in usage but use the same concept internally.
867 <sect1>Generic nested scopes<p>
869 A nested scoped for generic use is started with <tt/<ref id=".SCOPE"
870 name=".SCOPE">/ and closed with <tt/<ref id=".ENDSCOPE" name=".ENDSCOPE">/.
871 The scope can have a name, in which case it is accessible from the outside by
872 using <ref id="scopesyntax" name="explicit scopes">. If the scope does not
873 have a name, all symbols created within the scope are local to the scope, and
874 aren't accessible from the outside.
876 A nested scope can access symbols from the local or from enclosing scopes by
877 name without using explicit scope names. In some cases there may be
878 ambiguities, for example if there is a reference to a local symbol that is not
879 yet defined, but a symbol with the same name exists in outer scopes:
891 In the example above, the <tt/lda/ instruction will load the value 3 into the
892 accumulator, because <tt/foo/ is redefined in the scope. However:
904 Here, <tt/lda/ will still load from <tt/$12,x/, but since it is unknown to the
905 assembler that <tt/foo/ is a zeropage symbol when translating the instruction,
906 absolute mode is used instead. In fact, the assembler will not use absolute
907 mode by default, but it will search through the enclosing scopes for a symbol
908 with the given name. If one is found, the address size of this symbol is used.
909 This may lead to errors:
921 In this case, when the assembler sees the symbol <tt/foo/ in the <tt/lda/
922 instruction, it will search for an already defined symbol <tt/foo/. It will
923 find <tt/foo/ in scope <tt/outer/, and a close look reveals that it is a
924 zeropage symbol. So the assembler will use zeropage addressing mode. If
925 <tt/foo/ is redefined later in scope <tt/inner/, the assembler tries to change
926 the address in the <tt/lda/ instruction already translated, but since the new
927 value needs absolute addressing mode, this fails, and an error message "Range
930 Of course the most simple solution for the problem is to move the definition
931 of <tt/foo/ in scope <tt/inner/ upwards, so it precedes its use. There may be
932 rare cases when this cannot be done. In these cases, you can use one of the
933 address size override operators:
945 This will cause the <tt/lda/ instruction to be translated using absolute
946 addressing mode, which means changing the symbol reference later does not
950 <sect1>Nested procedures<p>
952 A nested procedure is created by use of <tt/<ref id=".PROC" name=".PROC">/. It
953 differs from a <tt/<ref id=".SCOPE" name=".SCOPE">/ in that it must have a
954 name, and a it will introduce a symbol with this name in the enclosing scope.
963 is actually the same as
972 This is the reason why a procedure must have a name. If you want a scope
973 without a name, use <tt/<ref id=".SCOPE" name=".SCOPE">/.
975 <bf/Note:/ As you can see from the example above, scopes and symbols live in
976 different namespaces. There can be a symbol named <tt/foo/ and a scope named
977 <tt/foo/ without any conflicts (but see the section titled <ref
978 id="scopesearch" name=""Scope search order"">).
981 <sect1>Structs, unions and enums<p>
983 Structs, unions and enums are explained in a <ref id="structs" name="separate
984 section">, I do only cover them here, because if they are declared with a
985 name, they open a nested scope, similar to <tt/<ref id=".SCOPE"
986 name=".SCOPE">/. However, when no name is specified, the behaviour is
987 different: In this case, no new scope will be opened, symbols declared within
988 a struct, union, or enum declaration will then be added to the enclosing scope
992 <sect1>Explicit scope specification<label id="scopesyntax"><p>
994 Accessing symbols from other scopes is possible by using an explicit scope
995 specification, provided that the scope where the symbol lives in has a name.
996 The namespace token (<tt/::/) is used to access other scopes:
1004 lda foo::bar ; Access foo in scope bar
1007 The only way to deny access to a scope from the outside is to declare a scope
1008 without a name (using the <tt/<ref id=".SCOPE" name=".SCOPE">/ command).
1010 A special syntax is used to specify the global scope: If a symbol or scope is
1011 preceded by the namespace token, the global scope is searched:
1018 lda #::bar ; Access the global bar (which is 3)
1023 <sect1>Scope search order<label id="scopesearch"><p>
1025 The assembler searches for a scope in a similar way as for a symbol. First, it
1026 looks in the current scope, and then it walks up the enclosing scopes until
1029 However, one important thing to note when using explicit scope syntax is, that
1030 a symbol may be accessed before it is defined, but a scope may <bf/not/ be
1031 used without a preceding definition. This means that in the following
1040 lda #foo::bar ; Will load 3, not 2!
1047 the reference to the scope <tt/foo/ will use the global scope, and not the
1048 local one, because the local one is not visible at the point where it is
1051 Things get more complex if a complete chain of scopes is specified:
1062 lda #outer::inner::bar ; 1
1074 When <tt/outer::inner::bar/ is referenced in the <tt/lda/ instruction, the
1075 assembler will first search in the local scope for a scope named <tt/outer/.
1076 Since none is found, the enclosing scope (<tt/another/) is checked. There is
1077 still no scope named <tt/outer/, so scope <tt/foo/ is checked, and finally
1078 scope <tt/outer/ is found. Within this scope, <tt/inner/ is searched, and in
1079 this scope, the assembler looks for a symbol named <tt/bar/.
1081 Please note that once the anchor scope is found, all following scopes
1082 (<tt/inner/ in this case) are expected to be found exactly in this scope. The
1083 assembler will search the scope tree only for the first scope (if it is not
1084 anchored in the root scope). Starting from there on, there is no flexibility,
1085 so if the scope named <tt/outer/ found by the assembler does not contain a
1086 scope named <tt/inner/, this would be an error, even if such a pair does exist
1087 (one level up in global scope).
1089 Ambiguities that may be introduced by this search algorithm may be removed by
1090 anchoring the scope specification in the global scope. In the example above,
1091 if you want to access the "other" symbol <tt/bar/, you would have to write:
1102 lda #::outer::inner::bar ; 2
1115 <sect>Address sizes and memory models<label id="address-sizes"><p>
1117 <sect1>Address sizes<p>
1119 ca65 assigns each segment and each symbol an address size. This is true, even
1120 if the symbol is not used as an address. You may also think of a value range
1121 of the symbol instead of an address size.
1123 Possible address sizes are:
1126 <item>Zeropage or direct (8 bits)
1127 <item>Absolute (16 bits)
1129 <item>Long (32 bits)
1132 Since the assembler uses default address sizes for the segments and symbols,
1133 it is usually not necessary to override the default behaviour. In cases, where
1134 it is necessary, the following keywords may be used to specify address sizes:
1137 <item>DIRECT, ZEROPAGE or ZP for zeropage addressing (8 bits).
1138 <item>ABSOLUTE, ABS or NEAR for absolute addressing (16 bits).
1139 <item>FAR for far addressing (24 bits).
1140 <item>LONG or DWORD for long addressing (32 bits).
1144 <sect1>Address sizes of segments<p>
1146 The assembler assigns an address size to each segment. Since the
1147 representation of a label within this segment is "segment start + offset",
1148 labels will inherit the address size of the segment they are declared in.
1150 The address size of a segment may be changed, by using an optional address
1151 size modifier. See the <tt/<ref id=".SEGMENT" name="segment directive">/ for
1152 an explanation on how this is done.
1155 <sect1>Address sizes of symbols<p>
1160 <sect1>Memory models<p>
1162 The default address size of a segment depends on the memory model used. Since
1163 labels inherit the address size from the segment they are declared in,
1164 changing the memory model is an easy way to change the address size of many
1170 <sect>Pseudo variables<label id="pseudo-variables"><p>
1172 Pseudo variables are readable in all cases, and in some special cases also
1175 <sect1><tt>*</tt><p>
1177 Reading this pseudo variable will return the program counter at the start
1178 of the current input line.
1180 Assignment to this variable is possible when <tt/<ref id=".FEATURE"
1181 name=".FEATURE pc_assignment">/ is used. Note: You should not use
1182 assignments to <tt/*/, use <tt/<ref id=".ORG" name=".ORG">/ instead.
1185 <sect1><tt>.CPU</tt><label id=".CPU"><p>
1187 Reading this pseudo variable will give a constant integer value that
1188 tells which CPU is currently enabled. It can also tell which instruction
1189 set the CPU is able to translate. The value read from the pseudo variable
1190 should be further examined by using one of the constants defined by the
1191 "cpu" macro package (see <tt/<ref id=".MACPACK" name=".MACPACK">/).
1193 It may be used to replace the .IFPxx pseudo instructions or to construct
1194 even more complex expressions.
1200 .if (.cpu .bitand CPU_ISET_65816)
1212 <sect1><tt>.PARAMCOUNT</tt><label id=".PARAMCOUNT"><p>
1214 This builtin pseudo variable is only available in macros. It is replaced by
1215 the actual number of parameters that were given in the macro invocation.
1220 .macro foo arg1, arg2, arg3
1221 .if .paramcount <> 3
1222 .error "Too few parameters for macro foo"
1228 See section <ref id="macros" name="Macros">.
1231 <sect1><tt>.TIME</tt><label id=".TIME"><p>
1233 Reading this pseudo variable will give a constant integer value that
1234 represents the current time in POSIX standard (as seconds since the
1237 It may be used to encode the time of translation somewhere in the created
1243 .dword .time ; Place time here
1247 <sect1><tt>.VERSION</tt><label id=".VERSION"><p>
1249 Reading this pseudo variable will give the assembler version according to
1250 the following formula:
1252 VER_MAJOR*$100 + VER_MINOR*$10 + VER_PATCH
1254 It may be used to encode the assembler version or check the assembler for
1255 special features not available with older versions.
1259 Version 2.11.1 of the assembler will return $2B1 as numerical constant when
1260 reading the pseudo variable <tt/.VERSION/.
1264 <sect>Pseudo functions<label id="pseudo-functions"><p>
1266 Pseudo functions expect their arguments in parenthesis, and they have a result,
1267 either a string or an expression.
1270 <sect1><tt>.BANKBYTE</tt><label id=".BANKBYTE"><p>
1272 The function returns the bank byte (that is, bits 16-23) of its argument.
1273 It works identical to the '^' operator.
1275 See: <tt><ref id=".HIBYTE" name=".HIBYTE"></tt>,
1276 <tt><ref id=".LOBYTE" name=".LOBYTE"></tt>
1279 <sect1><tt>.BLANK</tt><label id=".BLANK"><p>
1281 Builtin function. The function evaluates its argument in braces and yields
1282 "false" if the argument is non blank (there is an argument), and "true" if
1283 there is no argument. The token list that makes up the function argument
1284 may optionally be enclosed in curly braces. This allows the inclusion of
1285 tokens that would otherwise terminate the list (the closing right
1286 parenthesis). The curly braces are not considered part of the list, a list
1287 just consisting of curly braces is considered to be empty.
1289 As an example, the <tt/.IFBLANK/ statement may be replaced by
1297 <sect1><tt>.CONCAT</tt><label id=".CONCAT"><p>
1299 Builtin string function. The function allows to concatenate a list of string
1300 constants separated by commas. The result is a string constant that is the
1301 concatenation of all arguments. This function is most useful in macros and
1302 when used together with the <tt/.STRING/ builtin function. The function may
1303 be used in any case where a string constant is expected.
1308 .include .concat ("myheader", ".", "inc")
1311 This is the same as the command
1314 .include "myheader.inc"
1318 <sect1><tt>.CONST</tt><label id=".CONST"><p>
1320 Builtin function. The function evaluates its argument in braces and
1321 yields "true" if the argument is a constant expression (that is, an
1322 expression that yields a constant value at assembly time) and "false"
1323 otherwise. As an example, the .IFCONST statement may be replaced by
1330 <sect1><tt>.HIBYTE</tt><label id=".HIBYTE"><p>
1332 The function returns the high byte (that is, bits 8-15) of its argument.
1333 It works identical to the '>' operator.
1335 See: <tt><ref id=".LOBYTE" name=".LOBYTE"></tt>,
1336 <tt><ref id=".BANKBYTE" name=".BANKBYTE"></tt>
1339 <sect1><tt>.HIWORD</tt><label id=".HIWORD"><p>
1341 The function returns the high word (that is, bits 16-31) of its argument.
1343 See: <tt><ref id=".LOWORD" name=".LOWORD"></tt>
1346 <sect1><tt>.IDENT</tt><label id=".IDENT"><p>
1348 The function expects a string as its argument, and converts this argument
1349 into an identifier. If the string starts with the current <tt/<ref
1350 id=".LOCALCHAR" name=".LOCALCHAR">/, it will be converted into a cheap local
1351 identifier, otherwise it will be converted into a normal identifier.
1356 .macro makelabel arg1, arg2
1357 .ident (.concat (arg1, arg2)):
1360 makelabel "foo", "bar"
1362 .word foobar ; Valid label
1366 <sect1><tt>.LEFT</tt><label id=".LEFT"><p>
1368 Builtin function. Extracts the left part of a given token list.
1373 .LEFT (<int expr>, <token list>)
1376 The first integer expression gives the number of tokens to extract from
1377 the token list. The second argument is the token list itself. The token
1378 list may optionally be enclosed into curly braces. This allows the
1379 inclusion of tokens that would otherwise terminate the list (the closing
1380 right paren in the given case).
1384 To check in a macro if the given argument has a '#' as first token
1385 (immediate addressing mode), use something like this:
1390 .if (.match (.left (1, {arg}), #))
1392 ; ldax called with immediate operand
1400 See also the <tt><ref id=".MID" name=".MID"></tt> and <tt><ref id=".RIGHT"
1401 name=".RIGHT"></tt> builtin functions.
1404 <sect1><tt>.LOBYTE</tt><label id=".LOBYTE"><p>
1406 The function returns the low byte (that is, bits 0-7) of its argument.
1407 It works identical to the '<' operator.
1409 See: <tt><ref id=".HIBYTE" name=".HIBYTE"></tt>,
1410 <tt><ref id=".BANKBYTE" name=".BANKBYTE"></tt>
1413 <sect1><tt>.LOWORD</tt><label id=".LOWORD"><p>
1415 The function returns the low word (that is, bits 0-15) of its argument.
1417 See: <tt><ref id=".HIWORD" name=".HIWORD"></tt>
1420 <sect1><tt>.MATCH</tt><label id=".MATCH"><p>
1422 Builtin function. Matches two token lists against each other. This is
1423 most useful within macros, since macros are not stored as strings, but
1429 .MATCH(<token list #1>, <token list #2>)
1432 Both token list may contain arbitrary tokens with the exception of the
1433 terminator token (comma resp. right parenthesis) and
1440 The token lists may optionally be enclosed into curly braces. This allows
1441 the inclusion of tokens that would otherwise terminate the list (the closing
1442 right paren in the given case). Often a macro parameter is used for any of
1445 Please note that the function does only compare tokens, not token
1446 attributes. So any number is equal to any other number, regardless of the
1447 actual value. The same is true for strings. If you need to compare tokens
1448 <em/and/ token attributes, use the <tt><ref id=".XMATCH"
1449 name=".XMATCH"></tt> function.
1453 Assume the macro <tt/ASR/, that will shift right the accumulator by one,
1454 while honoring the sign bit. The builtin processor instructions will allow
1455 an optional "A" for accu addressing for instructions like <tt/ROL/ and
1456 <tt/ROR/. We will use the <tt><ref id=".MATCH" name=".MATCH"></tt> function
1457 to check for this and print and error for invalid calls.
1462 .if (.not .blank(arg)) .and (.not .match ({arg}, a))
1463 .error "Syntax error"
1466 cmp #$80 ; Bit 7 into carry
1467 lsr a ; Shift carry into bit 7
1472 The macro will only accept no arguments, or one argument that must be the
1473 reserved keyword "A".
1475 See: <tt><ref id=".XMATCH" name=".XMATCH"></tt>
1478 <sect1><tt>.MAX</tt><label id=".MAX"><p>
1480 Builtin function. The result is the larger of two values.
1485 .MAX (<value #1>, <value #2>)
1491 ; Reserve space for the larger of two data blocks
1492 savearea: .max (.sizeof (foo), .sizeof (bar))
1495 See: <tt><ref id=".MIN" name=".MIN"></tt>
1498 <sect1><tt>.MID</tt><label id=".MID"><p>
1500 Builtin function. Takes a starting index, a count and a token list as
1501 arguments. Will return part of the token list.
1506 .MID (<int expr>, <int expr>, <token list>)
1509 The first integer expression gives the starting token in the list (the first
1510 token has index 0). The second integer expression gives the number of tokens
1511 to extract from the token list. The third argument is the token list itself.
1512 The token list may optionally be enclosed into curly braces. This allows the
1513 inclusion of tokens that would otherwise terminate the list (the closing
1514 right paren in the given case).
1518 To check in a macro if the given argument has a '<tt/#/' as first token
1519 (immediate addressing mode), use something like this:
1524 .if (.match (.mid (0, 1, {arg}), #))
1526 ; ldax called with immediate operand
1534 See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".RIGHT"
1535 name=".RIGHT"></tt> builtin functions.
1538 <sect1><tt>.MIN</tt><label id=".MIN"><p>
1540 Builtin function. The result is the smaller of two values.
1545 .MIN (<value #1>, <value #2>)
1551 ; Reserve space for some data, but 256 bytes minimum
1552 savearea: .min (.sizeof (foo), 256)
1555 See: <tt><ref id=".MAX" name=".MAX"></tt>
1558 <sect1><tt>.REF, .REFERENCED</tt><label id=".REFERENCED"><p>
1560 Builtin function. The function expects an identifier as argument in braces.
1561 The argument is evaluated, and the function yields "true" if the identifier
1562 is a symbol that has already been referenced somewhere in the source file up
1563 to the current position. Otherwise the function yields false. As an example,
1564 the <tt><ref id=".IFREF" name=".IFREF"></tt> statement may be replaced by
1570 See: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
1573 <sect1><tt>.RIGHT</tt><label id=".RIGHT"><p>
1575 Builtin function. Extracts the right part of a given token list.
1580 .RIGHT (<int expr>, <token list>)
1583 The first integer expression gives the number of tokens to extract from the
1584 token list. The second argument is the token list itself. The token list
1585 may optionally be enclosed into curly braces. This allows the inclusion of
1586 tokens that would otherwise terminate the list (the closing right paren in
1589 See also the <tt><ref id=".LEFT" name=".LEFT"></tt> and <tt><ref id=".MID"
1590 name=".MID"></tt> builtin functions.
1593 <sect1><tt>.SIZEOF</tt><label id=".SIZEOF"><p>
1595 <tt/.SIZEOF/ is a pseudo function that returns the size of its argument. The
1596 argument can be a struct/union, a struct member, a procedure, or a label. In
1597 case of a procedure or label, its size is defined by the amount of data
1598 placed in the segment where the label is relative to. If a line of code
1599 switches segments (for example in a macro) data placed in other segments
1600 does not count for the size.
1602 Please note that a symbol or scope must exist, before it is used together with
1603 <tt/.SIZEOF/ (this may get relaxed later, but will always be true for scopes).
1604 A scope has preference over a symbol with the same name, so if the last part
1605 of a name represents both, a scope and a symbol, the scope is chosen over the
1608 After the following code:
1611 .struct Point ; Struct size = 4
1616 P: .tag Point ; Declare a point
1617 @P: .tag Point ; Declare another point
1629 .data ; Segment switch!!!
1635 <tag><tt/.sizeof(Point)/</tag>
1636 will have the value 4, because this is the size of struct <tt/Point/.
1638 <tag><tt/.sizeof(Point::xcoord)/</tag>
1639 will have the value 2, because this is the size of the member <tt/xcoord/
1640 in struct <tt/Point/.
1642 <tag><tt/.sizeof(P)/</tag>
1643 will have the value 4, this is the size of the data declared on the same
1644 source line as the label <tt/P/, which is in the same segment that <tt/P/
1647 <tag><tt/.sizeof(@P)/</tag>
1648 will have the value 4, see above. The example demonstrates that <tt/.SIZEOF/
1649 does also work for cheap local symbols.
1651 <tag><tt/.sizeof(Code)/</tag>
1652 will have the value 3, since this is amount of data emitted into the code
1653 segment, the segment that was active when <tt/Code/ was entered. Note that
1654 this value includes the amount of data emitted in child scopes (in this
1655 case <tt/Code::Inner/).
1657 <tag><tt/.sizeof(Code::Inner)/</tag>
1658 will have the value 1 as expected.
1660 <tag><tt/.sizeof(Data)/</tag>
1661 will have the value 0. Data is emitted within the scope <tt/Data/, but since
1662 the segment is switched after entry, this data is emitted into another
1667 <sect1><tt>.STRAT</tt><label id=".STRAT"><p>
1669 Builtin function. The function accepts a string and an index as
1670 arguments and returns the value of the character at the given position
1671 as an integer value. The index is zero based.
1677 ; Check if the argument string starts with '#'
1678 .if (.strat (Arg, 0) = '#')
1685 <sect1><tt>.SPRINTF</tt><label id=".SPRINTF"><p>
1687 Builtin function. It expects a format string as first argument. The number
1688 and type of the following arguments depend on the format string. The format
1689 string is similar to the one of the C <tt/printf/ function. Missing things
1690 are: Length modifiers, variable width.
1692 The result of the function is a string.
1699 ; Generate an identifier:
1700 .ident (.sprintf ("%s%03d", "label", num)):
1704 <sect1><tt>.STRING</tt><label id=".STRING"><p>
1706 Builtin function. The function accepts an argument in braces and converts
1707 this argument into a string constant. The argument may be an identifier, or
1708 a constant numeric value.
1710 Since you can use a string in the first place, the use of the function may
1711 not be obvious. However, it is useful in macros, or more complex setups.
1716 ; Emulate other assemblers:
1718 .segment .string(name)
1723 <sect1><tt>.STRLEN</tt><label id=".STRLEN"><p>
1725 Builtin function. The function accepts a string argument in braces and
1726 evaluates to the length of the string.
1730 The following macro encodes a string as a pascal style string with
1731 a leading length byte.
1735 .byte .strlen(Arg), Arg
1740 <sect1><tt>.TCOUNT</tt><label id=".TCOUNT"><p>
1742 Builtin function. The function accepts a token list in braces. The function
1743 result is the number of tokens given as argument. The token list may
1744 optionally be enclosed into curly braces which are not considered part of
1745 the list and not counted. Enclosement in curly braces allows the inclusion
1746 of tokens that would otherwise terminate the list (the closing right paren
1751 The <tt/ldax/ macro accepts the '#' token to denote immediate addressing (as
1752 with the normal 6502 instructions). To translate it into two separate 8 bit
1753 load instructions, the '#' token has to get stripped from the argument:
1757 .if (.match (.mid (0, 1, {arg}), #))
1758 ; ldax called with immediate operand
1759 lda #<(.right (.tcount ({arg})-1, {arg}))
1760 ldx #>(.right (.tcount ({arg})-1, {arg}))
1768 <sect1><tt>.XMATCH</tt><label id=".XMATCH"><p>
1770 Builtin function. Matches two token lists against each other. This is
1771 most useful within macros, since macros are not stored as strings, but
1777 .XMATCH(<token list #1>, <token list #2>)
1780 Both token list may contain arbitrary tokens with the exception of the
1781 terminator token (comma resp. right parenthesis) and
1788 The token lists may optionally be enclosed into curly braces. This allows
1789 the inclusion of tokens that would otherwise terminate the list (the closing
1790 right paren in the given case). Often a macro parameter is used for any of
1793 The function compares tokens <em/and/ token values. If you need a function
1794 that just compares the type of tokens, have a look at the <tt><ref
1795 id=".MATCH" name=".MATCH"></tt> function.
1797 See: <tt><ref id=".MATCH" name=".MATCH"></tt>
1801 <sect>Control commands<label id="control-commands"><p>
1803 Here's a list of all control commands and a description, what they do:
1806 <sect1><tt>.A16</tt><label id=".A16"><p>
1808 Valid only in 65816 mode. Switch the accumulator to 16 bit.
1810 Note: This command will not emit any code, it will tell the assembler to
1811 create 16 bit operands for immediate accumulator addressing mode.
1813 See also: <tt><ref id=".SMART" name=".SMART"></tt>
1816 <sect1><tt>.A8</tt><label id=".A8"><p>
1818 Valid only in 65816 mode. Switch the accumulator to 8 bit.
1820 Note: This command will not emit any code, it will tell the assembler to
1821 create 8 bit operands for immediate accu addressing mode.
1823 See also: <tt><ref id=".SMART" name=".SMART"></tt>
1826 <sect1><tt>.ADDR</tt><label id=".ADDR"><p>
1828 Define word sized data. In 6502 mode, this is an alias for <tt/.WORD/ and
1829 may be used for better readability if the data words are address values. In
1830 65816 mode, the address is forced to be 16 bit wide to fit into the current
1831 segment. See also <tt><ref id=".FARADDR" name=".FARADDR"></tt>. The command
1832 must be followed by a sequence of (not necessarily constant) expressions.
1837 .addr $0D00, $AF13, _Clear
1840 See: <tt><ref id=".FARADDR" name=".FARADDR"></tt>, <tt><ref id=".WORD"
1844 <sect1><tt>.ALIGN</tt><label id=".ALIGN"><p>
1846 Align data to a given boundary. The command expects a constant integer
1847 argument that must be a power of two, plus an optional second argument
1848 in byte range. If there is a second argument, it is used as fill value,
1849 otherwise the value defined in the linker configuration file is used
1850 (the default for this value is zero).
1852 Since alignment depends on the base address of the module, you must
1853 give the same (or a greater) alignment for the segment when linking.
1854 The linker will give you a warning, if you don't do that.
1863 <sect1><tt>.ASCIIZ</tt><label id=".ASCIIZ"><p>
1865 Define a string with a trailing zero.
1870 Msg: .asciiz "Hello world"
1873 This will put the string "Hello world" followed by a binary zero into
1874 the current segment. There may be more strings separated by commas, but
1875 the binary zero is only appended once (after the last one).
1878 <sect1><tt>.ASSERT</tt><label id=".ASSERT"><p>
1880 Add an assertion. The command is followed by an expression, an action
1881 specifier, and an optional message that is output in case the assertion
1882 fails. If no message was given, the string "Assertion failed" is used. The
1883 action specifier may be one of <tt/warning/, <tt/error/, <tt/ldwarning/ or
1884 <tt/lderror/. In the former two cases, the assertion is evaluated by the
1885 assembler if possible, and in any case, it's also passed to the linker in
1886 the object file (if one is generated). The linker will then evaluate the
1887 expression when segment placement has been done.
1892 .assert * = $8000, error, "Code not at $8000"
1895 The example assertion will check that the current location is at $8000,
1896 when the output file is written, and abort with an error if this is not
1897 the case. More complex expressions are possible. The action specifier
1898 <tt/warning/ outputs a warning, while the <tt/error/ specifier outputs
1899 an error message. In the latter case, generation of the output file is
1900 suppressed in both the assembler and linker.
1903 <sect1><tt>.AUTOIMPORT</tt><label id=".AUTOIMPORT"><p>
1905 Is followed by a plus or a minus character. When switched on (using a
1906 +), undefined symbols are automatically marked as import instead of
1907 giving errors. When switched off (which is the default so this does not
1908 make much sense), this does not happen and an error message is
1909 displayed. The state of the autoimport flag is evaluated when the
1910 complete source was translated, before outputting actual code, so it is
1911 <em/not/ possible to switch this feature on or off for separate sections
1912 of code. The last setting is used for all symbols.
1914 You should probably not use this switch because it delays error
1915 messages about undefined symbols until the link stage. The cc65
1916 compiler (which is supposed to produce correct assembler code in all
1917 circumstances, something which is not true for most assembler
1918 programmers) will insert this command to avoid importing each and every
1919 routine from the runtime library.
1924 .autoimport + ; Switch on auto import
1927 <sect1><tt>.BANKBYTES</tt><label id=".BANKBYTES"><p>
1929 Define byte sized data by extracting only the bank byte (that is, bits 16-23) from
1930 each expression. This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
1931 the operator '^' prepended to each expression in its list.
1936 .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
1938 TableLookupLo: .lobytes MyTable
1939 TableLookupHi: .hibytes MyTable
1940 TableLookupBank: .bankbytes MyTable
1943 which is equivalent to
1946 TableLookupLo: .byte <TableItem0, <TableItem1, <TableItem2, <TableItem3
1947 TableLookupHi: .byte >TableItem0, >TableItem1, >TableItem2, >TableItem3
1948 TableLookupBank: .byte ^TableItem0, ^TableItem1, ^TableItem2, ^TableItem3
1951 See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
1952 <tt><ref id=".HIBYTES" name=".HIBYTES"></tt>,
1953 <tt><ref id=".LOBYTES" name=".LOBYTES"></tt>
1956 <sect1><tt>.BSS</tt><label id=".BSS"><p>
1958 Switch to the BSS segment. The name of the BSS segment is always "BSS",
1959 so this is a shortcut for
1965 See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
1968 <sect1><tt>.BYT, .BYTE</tt><label id=".BYTE"><p>
1970 Define byte sized data. Must be followed by a sequence of (byte ranged)
1971 expressions or strings.
1977 .byt "world", $0D, $00
1981 <sect1><tt>.CASE</tt><label id=".CASE"><p>
1983 Switch on or off case sensitivity on identifiers. The default is off
1984 (that is, identifiers are case sensitive), but may be changed by the
1985 -i switch on the command line.
1986 The command must be followed by a '+' or '-' character to switch the
1987 option on or off respectively.
1992 .case - ; Identifiers are not case sensitive
1996 <sect1><tt>.CHARMAP</tt><label id=".CHARMAP"><p>
1998 Apply a custom mapping for characters. The command is followed by two
1999 numbers in the range 1..255. The first one is the index of the source
2000 character, the second one is the mapping. The mapping applies to all
2001 character and string constants when they generate output, and overrides
2002 a mapping table specified with the <tt><ref id="option-t" name="-t"></tt>
2003 command line switch.
2008 .charmap $41, $61 ; Map 'A' to 'a'
2012 <sect1><tt>.CODE</tt><label id=".CODE"><p>
2014 Switch to the CODE segment. The name of the CODE segment is always
2015 "CODE", so this is a shortcut for
2021 See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2024 <sect1><tt>.CONDES</tt><label id=".CONDES"><p>
2026 Export a symbol and mark it in a special way. The linker is able to build
2027 tables of all such symbols. This may be used to automatically create a list
2028 of functions needed to initialize linked library modules.
2030 Note: The linker has a feature to build a table of marked routines, but it
2031 is your code that must call these routines, so just declaring a symbol with
2032 <tt/.CONDES/ does nothing by itself.
2034 All symbols are exported as an absolute (16 bit) symbol. You don't need to
2035 use an additional <tt><ref id=".EXPORT" name=".EXPORT"></tt> statement, this
2036 is implied by <tt/.CONDES/.
2038 <tt/.CONDES/ is followed by the type, which may be <tt/constructor/,
2039 <tt/destructor/ or a numeric value between 0 and 6 (where 0 is the same as
2040 specifying <tt/constructor/ and 1 is equal to specifying <tt/destructor/).
2041 The <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
2042 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
2043 name=".INTERRUPTOR"></tt> commands are actually shortcuts for <tt/.CONDES/
2044 with a type of <tt/constructor/ resp. <tt/destructor/ or <tt/interruptor/.
2046 After the type, an optional priority may be specified. Higher numeric values
2047 mean higher priority. If no priority is given, the default priority of 7 is
2048 used. Be careful when assigning priorities to your own module constructors
2049 so they won't interfere with the ones in the cc65 library.
2054 .condes ModuleInit, constructor
2055 .condes ModInit, 0, 16
2058 See the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
2059 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
2060 name=".INTERRUPTOR"></tt> commands and the separate section <ref id="condes"
2061 name="Module constructors/destructors"> explaining the feature in more
2065 <sect1><tt>.CONSTRUCTOR</tt><label id=".CONSTRUCTOR"><p>
2067 Export a symbol and mark it as a module constructor. This may be used
2068 together with the linker to build a table of constructor subroutines that
2069 are called by the startup code.
2071 Note: The linker has a feature to build a table of marked routines, but it
2072 is your code that must call these routines, so just declaring a symbol as
2073 constructor does nothing by itself.
2075 A constructor is always exported as an absolute (16 bit) symbol. You don't
2076 need to use an additional <tt/.export/ statement, this is implied by
2077 <tt/.constructor/. It may have an optional priority that is separated by a
2078 comma. Higher numeric values mean a higher priority. If no priority is
2079 given, the default priority of 7 is used. Be careful when assigning
2080 priorities to your own module constructors so they won't interfere with the
2081 ones in the cc65 library.
2086 .constructor ModuleInit
2087 .constructor ModInit, 16
2090 See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
2091 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> commands and the separate section
2092 <ref id="condes" name="Module constructors/destructors"> explaining the
2093 feature in more detail.
2096 <sect1><tt>.DATA</tt><label id=".DATA"><p>
2098 Switch to the DATA segment. The name of the DATA segment is always
2099 "DATA", so this is a shortcut for
2105 See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
2108 <sect1><tt>.DBYT</tt><label id=".DBYT"><p>
2110 Define word sized data with the hi and lo bytes swapped (use <tt/.WORD/ to
2111 create word sized data in native 65XX format). Must be followed by a
2112 sequence of (word ranged) expressions.
2120 This will emit the bytes
2126 into the current segment in that order.
2129 <sect1><tt>.DEBUGINFO</tt><label id=".DEBUGINFO"><p>
2131 Switch on or off debug info generation. The default is off (that is,
2132 the object file will not contain debug infos), but may be changed by the
2133 -g switch on the command line.
2134 The command must be followed by a '+' or '-' character to switch the
2135 option on or off respectively.
2140 .debuginfo + ; Generate debug info
2144 <sect1><tt>.DEFINE</tt><label id=".DEFINE"><p>
2146 Start a define style macro definition. The command is followed by an
2147 identifier (the macro name) and optionally by a list of formal arguments
2149 See also the <tt><ref id=".UNDEFINE" name=".UNDEFINE"></tt> command and
2150 section <ref id="macros" name="Macros">.
2153 <sect1><tt>.DELMAC, .DELMACRO</tt><label id=".DELMACRO"><p>
2155 Delete a classic macro (defined with <tt><ref id=".MACRO"
2156 name=".MACRO"></tt>) . The command is followed by the name of an
2157 existing macro. Its definition will be deleted together with the name.
2158 If necessary, another macro with this name may be defined later.
2160 See: <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
2161 <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>,
2162 <tt><ref id=".MACRO" name=".MACRO"></tt>
2164 See also section <ref id="macros" name="Macros">.
2167 <sect1><tt>.DEF, .DEFINED</tt><label id=".DEFINED"><p>
2169 Builtin function. The function expects an identifier as argument in braces.
2170 The argument is evaluated, and the function yields "true" if the identifier
2171 is a symbol that is already defined somewhere in the source file up to the
2172 current position. Otherwise the function yields false. As an example, the
2173 <tt><ref id=".IFDEF" name=".IFDEF"></tt> statement may be replaced by
2180 <sect1><tt>.DESTRUCTOR</tt><label id=".DESTRUCTOR"><p>
2182 Export a symbol and mark it as a module destructor. This may be used
2183 together with the linker to build a table of destructor subroutines that
2184 are called by the startup code.
2186 Note: The linker has a feature to build a table of marked routines, but it
2187 is your code that must call these routines, so just declaring a symbol as
2188 constructor does nothing by itself.
2190 A destructor is always exported as an absolute (16 bit) symbol. You don't
2191 need to use an additional <tt/.export/ statement, this is implied by
2192 <tt/.destructor/. It may have an optional priority that is separated by a
2193 comma. Higher numerical values mean a higher priority. If no priority is
2194 given, the default priority of 7 is used. Be careful when assigning
2195 priorities to your own module destructors so they won't interfere with the
2196 ones in the cc65 library.
2201 .destructor ModuleDone
2202 .destructor ModDone, 16
2205 See the <tt><ref id=".CONDES" name=".CONDES"></tt> and <tt><ref
2206 id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt> commands and the separate
2207 section <ref id="condes" name="Module constructors/destructors"> explaining
2208 the feature in more detail.
2211 <sect1><tt>.DWORD</tt><label id=".DWORD"><p>
2213 Define dword sized data (4 bytes) Must be followed by a sequence of
2219 .dword $12344512, $12FA489
2223 <sect1><tt>.ELSE</tt><label id=".ELSE"><p>
2225 Conditional assembly: Reverse the current condition.
2228 <sect1><tt>.ELSEIF</tt><label id=".ELSEIF"><p>
2230 Conditional assembly: Reverse current condition and test a new one.
2233 <sect1><tt>.END</tt><label id=".END"><p>
2235 Forced end of assembly. Assembly stops at this point, even if the command
2236 is read from an include file.
2239 <sect1><tt>.ENDENUM</tt><label id=".ENDENUM"><p>
2241 End a <tt><ref id=".ENUM" name=".ENUM"></tt> declaration.
2244 <sect1><tt>.ENDIF</tt><label id=".ENDIF"><p>
2246 Conditional assembly: Close a <tt><ref id=".IF" name=".IF..."></tt> or
2247 <tt><ref id=".ELSE" name=".ELSE"></tt> branch.
2250 <sect1><tt>.ENDMAC, .ENDMACRO</tt><label id=".ENDMACRO"><p>
2252 Marks the end of a macro definition.
2254 See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
2255 <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>,
2256 <tt><ref id=".MACRO" name=".MACRO"></tt>
2258 See also section <ref id="macros" name="Macros">.
2261 <sect1><tt>.ENDPROC</tt><label id=".ENDPROC"><p>
2263 End of local lexical level (see <tt><ref id=".PROC" name=".PROC"></tt>).
2266 <sect1><tt>.ENDREP, .ENDREPEAT</tt><label id=".ENDREPEAT"><p>
2268 End a <tt><ref id=".REPEAT" name=".REPEAT"></tt> block.
2271 <sect1><tt>.ENDSCOPE</tt><label id=".ENDSCOPE"><p>
2273 End of local lexical level (see <tt/<ref id=".SCOPE" name=".SCOPE">/).
2276 <sect1><tt>.ENDSTRUCT</tt><label id=".ENDSTRUCT"><p>
2278 Ends a struct definition. See the <tt/<ref id=".STRUCT" name=".STRUCT">/
2279 command and the separate section named <ref id="structs" name=""Structs
2283 <sect1><tt>.ENUM</tt><label id=".ENUM"><p>
2285 Start an enumeration. This directive is very similar to the C <tt/enum/
2286 keyword. If a name is given, a new scope is created for the enumeration,
2287 otherwise the enumeration members are placed in the enclosing scope.
2289 In the enumeration body, symbols are declared. The first symbol has a value
2290 of zero, and each following symbol will get the value of the preceding plus
2291 one. This behaviour may be overridden by an explicit assignment. Two symbols
2292 may have the same value.
2304 Above example will create a new scope named <tt/errorcodes/ with three
2305 symbols in it that get the values 0, 1 and 2 respectively. Another way
2306 to write this would have been:
2316 Please note that explicit scoping must be used to access the identifiers:
2319 .word errorcodes::no_error
2322 A more complex example:
2331 EWOULDBLOCK = EAGAIN
2335 In this example, the enumeration does not have a name, which means that the
2336 members will be visible in the enclosing scope and can be used in this scope
2337 without explicit scoping. The first member (<tt/EUNKNOWN/) has the value -1.
2338 The value for the following members is incremented by one, so <tt/EOK/ would
2339 be zero and so on. <tt/EWOULDBLOCK/ is an alias for <tt/EGAIN/, so it has an
2340 override for the value using an already defined symbol.
2343 <sect1><tt>.ERROR</tt><label id=".ERROR"><p>
2345 Force an assembly error. The assembler will output an error message
2346 preceded by "User error". Assembly is continued but no object file will
2349 This command may be used to check for initial conditions that must be
2350 set before assembling a source file.
2360 .error "Must define foo or bar!"
2364 See also: <tt><ref id=".FATAL" name=".FATAL"></tt>,
2365 <tt><ref id=".OUT" name=".OUT"></tt>,
2366 <tt><ref id=".WARNING" name=".WARNING"></tt>
2369 <sect1><tt>.EXITMAC, .EXITMACRO</tt><label id=".EXITMACRO"><p>
2371 Abort a macro expansion immediately. This command is often useful in
2374 See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
2375 <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
2376 <tt><ref id=".MACRO" name=".MACRO"></tt>
2378 See also section <ref id="macros" name="Macros">.
2381 <sect1><tt>.EXPORT</tt><label id=".EXPORT"><p>
2383 Make symbols accessible from other modules. Must be followed by a comma
2384 separated list of symbols to export, with each one optionally followed by an
2385 address specification and (also optional) an assignment. Using an additional
2386 assignment in the export statement allows to define and export a symbol in
2387 one statement. The default is to export the symbol with the address size it
2388 actually has. The assembler will issue a warning, if the symbol is exported
2389 with an address size smaller than the actual address size.
2396 .export foobar: far = foo * bar
2397 .export baz := foobar, zap: far = baz - bar
2400 As with constant definitions, using <tt/:=/ instead of <tt/=/ marks the
2403 See: <tt><ref id=".EXPORTZP" name=".EXPORTZP"></tt>
2406 <sect1><tt>.EXPORTZP</tt><label id=".EXPORTZP"><p>
2408 Make symbols accessible from other modules. Must be followed by a comma
2409 separated list of symbols to export. The exported symbols are explicitly
2410 marked as zero page symbols. An assignment may be included in the
2411 <tt/.EXPORTZP/ statement. This allows to define and export a symbol in one
2418 .exportzp baz := $02
2421 See: <tt><ref id=".EXPORT" name=".EXPORT"></tt>
2424 <sect1><tt>.FARADDR</tt><label id=".FARADDR"><p>
2426 Define far (24 bit) address data. The command must be followed by a
2427 sequence of (not necessarily constant) expressions.
2432 .faraddr DrawCircle, DrawRectangle, DrawHexagon
2435 See: <tt><ref id=".ADDR" name=".ADDR"></tt>
2438 <sect1><tt>.FATAL</tt><label id=".FATAL"><p>
2440 Force an assembly error and terminate assembly. The assembler will output an
2441 error message preceded by "User error" and will terminate assembly
2444 This command may be used to check for initial conditions that must be
2445 set before assembling a source file.
2455 .fatal "Must define foo or bar!"
2459 See also: <tt><ref id=".ERROR" name=".ERROR"></tt>,
2460 <tt><ref id=".OUT" name=".OUT"></tt>,
2461 <tt><ref id=".WARNING" name=".WARNING"></tt>
2464 <sect1><tt>.FEATURE</tt><label id=".FEATURE"><p>
2466 This directive may be used to enable one or more compatibility features
2467 of the assembler. While the use of <tt/.FEATURE/ should be avoided when
2468 possible, it may be useful when porting sources written for other
2469 assemblers. There is no way to switch a feature off, once you have
2470 enabled it, so using
2476 will enable the feature until end of assembly is reached.
2478 The following features are available:
2482 <tag><tt>at_in_identifiers</tt><label id="at_in_identifiers"></tag>
2484 Accept the at character (`@') as a valid character in identifiers. The
2485 at character is not allowed to start an identifier, even with this
2488 <tag><tt>c_comments</tt></tag>
2490 Allow C like comments using <tt>/*</tt> and <tt>*/</tt> as left and right
2491 comment terminators. Note that C comments may not be nested. There's also a
2492 pitfall when using C like comments: All statements must be terminated by
2493 "end-of-line". Using C like comments, it is possible to hide the newline,
2494 which results in error messages. See the following non working example:
2497 lda #$00 /* This comment hides the newline
2501 <tag><tt>dollar_in_identifiers</tt><label id="dollar_in_identifiers"></tag>
2503 Accept the dollar sign (`$') as a valid character in identifiers. The
2504 dollar character is not allowed to start an identifier, even with this
2507 <tag><tt>dollar_is_pc</tt></tag>
2509 The dollar sign may be used as an alias for the star (`*'), which
2510 gives the value of the current PC in expressions.
2511 Note: Assignment to the pseudo variable is not allowed.
2513 <tag><tt>labels_without_colons</tt></tag>
2515 Allow labels without a trailing colon. These labels are only accepted,
2516 if they start at the beginning of a line (no leading white space).
2518 <tag><tt>leading_dot_in_identifiers</tt><label id="leading_dot_in_identifiers"></tag>
2520 Accept the dot (`.') as the first character of an identifier. This may be
2521 used for example to create macro names that start with a dot emulating
2522 control directives of other assemblers. Note however, that none of the
2523 reserved keywords built into the assembler, that starts with a dot, may be
2524 overridden. When using this feature, you may also get into trouble if
2525 later versions of the assembler define new keywords starting with a dot.
2527 <tag><tt>loose_char_term</tt></tag>
2529 Accept single quotes as well as double quotes as terminators for char
2532 <tag><tt>loose_string_term</tt></tag>
2534 Accept single quotes as well as double quotes as terminators for string
2537 <tag><tt>missing_char_term</tt></tag>
2539 Accept single quoted character constants where the terminating quote is
2544 <bf/Note:/ This does not work in conjunction with <tt/.FEATURE
2545 loose_string_term/, since in this case the input would be ambiguous.
2547 <tag><tt>org_per_seg</tt><label id="org_per_seg"></tag>
2549 This feature makes relocatable/absolute mode local to the current segment.
2550 Using <tt><ref id=".ORG" name=".ORG"></tt> when <tt/org_per_seg/ is in
2551 effect will only enable absolute mode for the current segment. Dito for
2552 <tt><ref id=".RELOC" name=".RELOC"></tt>.
2554 <tag><tt>pc_assignment</tt></tag>
2556 Allow assignments to the PC symbol (`*' or `$' if <tt/dollar_is_pc/
2557 is enabled). Such an assignment is handled identical to the <tt><ref
2558 id=".ORG" name=".ORG"></tt> command (which is usually not needed, so just
2559 removing the lines with the assignments may also be an option when porting
2560 code written for older assemblers).
2562 <tag><tt>ubiquitous_idents</tt></tag>
2564 Allow the use of instructions names as names for macros and symbols. This
2565 makes it possible to "overload" instructions by defining a macro with the
2566 same name. This does also make it possible to introduce hard to find errors
2567 in your code, so be careful!
2571 It is also possible to specify features on the command line using the
2572 <tt><ref id="option--feature" name="--feature"></tt> command line option.
2573 This is useful when translating sources written for older assemblers, when
2574 you don't want to change the source code.
2576 As an example, to translate sources written for Andre Fachats xa65
2577 assembler, the features
2580 labels_without_colons, pc_assignment, loose_char_term
2583 may be helpful. They do not make ca65 completely compatible, so you may not
2584 be able to translate the sources without changes, even when enabling these
2585 features. However, I have found several sources that translate without
2586 problems when enabling these features on the command line.
2589 <sect1><tt>.FILEOPT, .FOPT</tt><label id=".FOPT"><p>
2591 Insert an option string into the object file. There are two forms of
2592 this command, one specifies the option by a keyword, the second
2593 specifies it as a number. Since usage of the second one needs knowledge
2594 of the internal encoding, its use is not recommended and I will only
2595 describe the first form here.
2597 The command is followed by one of the keywords
2605 a comma and a string. The option is written into the object file
2606 together with the string value. This is currently unidirectional and
2607 there is no way to actually use these options once they are in the
2613 .fileopt comment, "Code stolen from my brother"
2614 .fileopt compiler, "BASIC 2.0"
2615 .fopt author, "J. R. User"
2619 <sect1><tt>.FORCEIMPORT</tt><label id=".FORCEIMPORT"><p>
2621 Import an absolute symbol from another module. The command is followed by a
2622 comma separated list of symbols to import. The command is similar to <tt>
2623 <ref id=".IMPORT" name=".IMPORT"></tt>, but the import reference is always
2624 written to the generated object file, even if the symbol is never referenced
2625 (<tt><ref id=".IMPORT" name=".IMPORT"></tt> will not generate import
2626 references for unused symbols).
2631 .forceimport needthisone, needthistoo
2634 See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
2637 <sect1><tt>.GLOBAL</tt><label id=".GLOBAL"><p>
2639 Declare symbols as global. Must be followed by a comma separated list of
2640 symbols to declare. Symbols from the list, that are defined somewhere in the
2641 source, are exported, all others are imported. Additional <tt><ref
2642 id=".IMPORT" name=".IMPORT"></tt> or <tt><ref id=".EXPORT"
2643 name=".EXPORT"></tt> commands for the same symbol are allowed.
2652 <sect1><tt>.GLOBALZP</tt><label id=".GLOBALZP"><p>
2654 Declare symbols as global. Must be followed by a comma separated list of
2655 symbols to declare. Symbols from the list, that are defined somewhere in the
2656 source, are exported, all others are imported. Additional <tt><ref
2657 id=".IMPORTZP" name=".IMPORTZP"></tt> or <tt><ref id=".EXPORTZP"
2658 name=".EXPORTZP"></tt> commands for the same symbol are allowed. The symbols
2659 in the list are explicitly marked as zero page symbols.
2667 <sect1><tt>.HIBYTES</tt><label id=".HIBYTES"><p>
2669 Define byte sized data by extracting only the high byte (that is, bits 8-15) from
2670 each expression. This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
2671 the operator '>' prepended to each expression in its list.
2676 .lobytes $1234, $2345, $3456, $4567
2677 .hibytes $fedc, $edcb, $dcba, $cba9
2680 which is equivalent to
2683 .byte $34, $45, $56, $67
2684 .byte $fe, $ed, $dc, $cb
2690 .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
2692 TableLookupLo: .lobytes MyTable
2693 TableLookupHi: .hibytes MyTable
2696 which is equivalent to
2699 TableLookupLo: .byte <TableItem0, <TableItem1, <TableItem2, <TableItem3
2700 TableLookupHi: .byte >TableItem0, >TableItem1, >TableItem2, >TableItem3
2703 See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
2704 <tt><ref id=".LOBYTES" name=".LOBYTES"></tt>,
2705 <tt><ref id=".BANKBYTES" name=".BANKBYTES"></tt>
2708 <sect1><tt>.I16</tt><label id=".I16"><p>
2710 Valid only in 65816 mode. Switch the index registers to 16 bit.
2712 Note: This command will not emit any code, it will tell the assembler to
2713 create 16 bit operands for immediate operands.
2715 See also the <tt><ref id=".I8" name=".I8"></tt> and <tt><ref id=".SMART"
2716 name=".SMART"></tt> commands.
2719 <sect1><tt>.I8</tt><label id=".I8"><p>
2721 Valid only in 65816 mode. Switch the index registers to 8 bit.
2723 Note: This command will not emit any code, it will tell the assembler to
2724 create 8 bit operands for immediate operands.
2726 See also the <tt><ref id=".I16" name=".I16"></tt> and <tt><ref id=".SMART"
2727 name=".SMART"></tt> commands.
2730 <sect1><tt>.IF</tt><label id=".IF"><p>
2732 Conditional assembly: Evaluate an expression and switch assembler output
2733 on or off depending on the expression. The expression must be a constant
2734 expression, that is, all operands must be defined.
2736 A expression value of zero evaluates to FALSE, any other value evaluates
2740 <sect1><tt>.IFBLANK</tt><label id=".IFBLANK"><p>
2742 Conditional assembly: Check if there are any remaining tokens in this line,
2743 and evaluate to FALSE if this is the case, and to TRUE otherwise. If the
2744 condition is not true, further lines are not assembled until an <tt><ref
2745 id=".ELSE" name=".ESLE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
2746 <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
2748 This command is often used to check if a macro parameter was given. Since an
2749 empty macro parameter will evaluate to nothing, the condition will evaluate
2750 to FALSE if an empty parameter was given.
2764 See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
2767 <sect1><tt>.IFCONST</tt><label id=".IFCONST"><p>
2769 Conditional assembly: Evaluate an expression and switch assembler output
2770 on or off depending on the constness of the expression.
2772 A const expression evaluates to to TRUE, a non const expression (one
2773 containing an imported or currently undefined symbol) evaluates to
2776 See also: <tt><ref id=".CONST" name=".CONST"></tt>
2779 <sect1><tt>.IFDEF</tt><label id=".IFDEF"><p>
2781 Conditional assembly: Check if a symbol is defined. Must be followed by
2782 a symbol name. The condition is true if the the given symbol is already
2783 defined, and false otherwise.
2785 See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
2788 <sect1><tt>.IFNBLANK</tt><label id=".IFNBLANK"><p>
2790 Conditional assembly: Check if there are any remaining tokens in this line,
2791 and evaluate to TRUE if this is the case, and to FALSE otherwise. If the
2792 condition is not true, further lines are not assembled until an <tt><ref
2793 id=".ELSE" name=".ELSE"></tt>, <tt><ref id=".ELSEIF" name=".ELSEIF"></tt> or
2794 <tt><ref id=".ENDIF" name=".ENDIF"></tt> directive.
2796 This command is often used to check if a macro parameter was given.
2797 Since an empty macro parameter will evaluate to nothing, the condition
2798 will evaluate to FALSE if an empty parameter was given.
2811 See also: <tt><ref id=".BLANK" name=".BLANK"></tt>
2814 <sect1><tt>.IFNDEF</tt><label id=".IFNDEF"><p>
2816 Conditional assembly: Check if a symbol is defined. Must be followed by
2817 a symbol name. The condition is true if the the given symbol is not
2818 defined, and false otherwise.
2820 See also: <tt><ref id=".DEFINED" name=".DEFINED"></tt>
2823 <sect1><tt>.IFNREF</tt><label id=".IFNREF"><p>
2825 Conditional assembly: Check if a symbol is referenced. Must be followed
2826 by a symbol name. The condition is true if if the the given symbol was
2827 not referenced before, and false otherwise.
2829 See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
2832 <sect1><tt>.IFP02</tt><label id=".IFP02"><p>
2834 Conditional assembly: Check if the assembler is currently in 6502 mode
2835 (see <tt><ref id=".P02" name=".P02"></tt> command).
2838 <sect1><tt>.IFP816</tt><label id=".IFP816"><p>
2840 Conditional assembly: Check if the assembler is currently in 65816 mode
2841 (see <tt><ref id=".P816" name=".P816"></tt> command).
2844 <sect1><tt>.IFPC02</tt><label id=".IFPC02"><p>
2846 Conditional assembly: Check if the assembler is currently in 65C02 mode
2847 (see <tt><ref id=".PC02" name=".PC02"></tt> command).
2850 <sect1><tt>.IFPSC02</tt><label id=".IFPSC02"><p>
2852 Conditional assembly: Check if the assembler is currently in 65SC02 mode
2853 (see <tt><ref id=".PSC02" name=".PSC02"></tt> command).
2856 <sect1><tt>.IFREF</tt><label id=".IFREF"><p>
2858 Conditional assembly: Check if a symbol is referenced. Must be followed
2859 by a symbol name. The condition is true if if the the given symbol was
2860 referenced before, and false otherwise.
2862 This command may be used to build subroutine libraries in include files
2863 (you may use separate object modules for this purpose too).
2868 .ifref ToHex ; If someone used this subroutine
2869 ToHex: tay ; Define subroutine
2875 See also: <tt><ref id=".REFERENCED" name=".REFERENCED"></tt>
2878 <sect1><tt>.IMPORT</tt><label id=".IMPORT"><p>
2880 Import a symbol from another module. The command is followed by a comma
2881 separated list of symbols to import, with each one optionally followed by
2882 an address specification.
2888 .import bar: zeropage
2891 See: <tt><ref id=".IMPORTZP" name=".IMPORTZP"></tt>
2894 <sect1><tt>.IMPORTZP</tt><label id=".IMPORTZP"><p>
2896 Import a symbol from another module. The command is followed by a comma
2897 separated list of symbols to import. The symbols are explicitly imported
2898 as zero page symbols (that is, symbols with values in byte range).
2906 See: <tt><ref id=".IMPORT" name=".IMPORT"></tt>
2909 <sect1><tt>.INCBIN</tt><label id=".INCBIN"><p>
2911 Include a file as binary data. The command expects a string argument
2912 that is the name of a file to include literally in the current segment.
2913 In addition to that, a start offset and a size value may be specified,
2914 separated by commas. If no size is specified, all of the file from the
2915 start offset to end-of-file is used. If no start position is specified
2916 either, zero is assumed (which means that the whole file is inserted).
2921 ; Include whole file
2922 .incbin "sprites.dat"
2924 ; Include file starting at offset 256
2925 .incbin "music.dat", $100
2927 ; Read 100 bytes starting at offset 200
2928 .incbin "graphics.dat", 200, 100
2932 <sect1><tt>.INCLUDE</tt><label id=".INCLUDE"><p>
2934 Include another file. Include files may be nested up to a depth of 16.
2943 <sect1><tt>.INTERRUPTOR</tt><label id=".INTERRUPTOR"><p>
2945 Export a symbol and mark it as an interruptor. This may be used together
2946 with the linker to build a table of interruptor subroutines that are called
2949 Note: The linker has a feature to build a table of marked routines, but it
2950 is your code that must call these routines, so just declaring a symbol as
2951 interruptor does nothing by itself.
2953 An interruptor is always exported as an absolute (16 bit) symbol. You don't
2954 need to use an additional <tt/.export/ statement, this is implied by
2955 <tt/.interruptor/. It may have an optional priority that is separated by a
2956 comma. Higher numeric values mean a higher priority. If no priority is
2957 given, the default priority of 7 is used. Be careful when assigning
2958 priorities to your own module constructors so they won't interfere with the
2959 ones in the cc65 library.
2964 .interruptor IrqHandler
2965 .interruptor Handler, 16
2968 See the <tt><ref id=".CONDES" name=".CONDES"></tt> command and the separate
2969 section <ref id="condes" name="Module constructors/destructors"> explaining
2970 the feature in more detail.
2973 <sect1><tt>.LINECONT</tt><label id=".LINECONT"><p>
2975 Switch on or off line continuations using the backslash character
2976 before a newline. The option is off by default.
2977 Note: Line continuations do not work in a comment. A backslash at the
2978 end of a comment is treated as part of the comment and does not trigger
2980 The command must be followed by a '+' or '-' character to switch the
2981 option on or off respectively.
2986 .linecont + ; Allow line continuations
2989 #$20 ; This is legal now
2993 <sect1><tt>.LIST</tt><label id=".LIST"><p>
2995 Enable output to the listing. The command must be followed by a boolean
2996 switch ("on", "off", "+" or "-") and will enable or disable listing
2998 The option has no effect if the listing is not enabled by the command line
2999 switch -l. If -l is used, an internal counter is set to 1. Lines are output
3000 to the listing file, if the counter is greater than zero, and suppressed if
3001 the counter is zero. Each use of <tt/.LIST/ will increment or decrement the
3007 .list on ; Enable listing output
3011 <sect1><tt>.LISTBYTES</tt><label id=".LISTBYTES"><p>
3013 Set, how many bytes are shown in the listing for one source line. The
3014 default is 12, so the listing will show only the first 12 bytes for any
3015 source line that generates more than 12 bytes of code or data.
3016 The directive needs an argument, which is either "unlimited", or an
3017 integer constant in the range 4..255.
3022 .listbytes unlimited ; List all bytes
3023 .listbytes 12 ; List the first 12 bytes
3024 .incbin "data.bin" ; Include large binary file
3028 <sect1><tt>.LOBYTES</tt><label id=".LOBYTES"><p>
3030 Define byte sized data by extracting only the low byte (that is, bits 0-7) from
3031 each expression. This is equivalent to <tt><ref id=".BYTE" name=".BYTE"></tt> with
3032 the operator '<' prepended to each expression in its list.
3037 .lobytes $1234, $2345, $3456, $4567
3038 .hibytes $fedc, $edcb, $dcba, $cba9
3041 which is equivalent to
3044 .byte $34, $45, $56, $67
3045 .byte $fe, $ed, $dc, $cb
3051 .define MyTable TableItem0, TableItem1, TableItem2, TableItem3
3053 TableLookupLo: .lobytes MyTable
3054 TableLookupHi: .hibytes MyTable
3057 which is equivalent to
3060 TableLookupLo: .byte <TableItem0, <TableItem1, <TableItem2, <TableItem3
3061 TableLookupHi: .byte >TableItem0, >TableItem1, >TableItem2, >TableItem3
3064 See also: <tt><ref id=".BYTE" name=".BYTE"></tt>,
3065 <tt><ref id=".HIBYTES" name=".HIBYTES"></tt>,
3066 <tt><ref id=".BANKBYTES" name=".BANKBYTES"></tt>
3069 <sect1><tt>.LOCAL</tt><label id=".LOCAL"><p>
3071 This command may only be used inside a macro definition. It declares a
3072 list of identifiers as local to the macro expansion.
3074 A problem when using macros are labels: Since they don't change their name,
3075 you get a "duplicate symbol" error if the macro is expanded the second time.
3076 Labels declared with <tt><ref id=".LOCAL" name=".LOCAL"></tt> have their
3077 name mapped to an internal unique name (<tt/___ABCD__/) with each macro
3080 Some other assemblers start a new lexical block inside a macro expansion.
3081 This has some drawbacks however, since that will not allow <em/any/ symbol
3082 to be visible outside a macro, a feature that is sometimes useful. The
3083 <tt><ref id=".LOCAL" name=".LOCAL"></tt> command is in my eyes a better way
3084 to address the problem.
3086 You get an error when using <tt><ref id=".LOCAL" name=".LOCAL"></tt> outside
3090 <sect1><tt>.LOCALCHAR</tt><label id=".LOCALCHAR"><p>
3092 Defines the character that start "cheap" local labels. You may use one
3093 of '@' and '?' as start character. The default is '@'.
3095 Cheap local labels are labels that are visible only between two non
3096 cheap labels. This way you can reuse identifiers like "<tt/loop/" without
3097 using explicit lexical nesting.
3104 Clear: lda #$00 ; Global label
3105 ?Loop: sta Mem,y ; Local label
3109 Sub: ... ; New global label
3110 bne ?Loop ; ERROR: Unknown identifier!
3114 <sect1><tt>.MACPACK</tt><label id=".MACPACK"><p>
3116 Insert a predefined macro package. The command is followed by an
3117 identifier specifying the macro package to insert. Available macro
3121 atari Defines the scrcode macro.
3122 cbm Defines the scrcode macro.
3123 cpu Defines constants for the .CPU variable.
3124 generic Defines generic macros like add and sub.
3125 longbranch Defines conditional long jump macros.
3128 Including a macro package twice, or including a macro package that
3129 redefines already existing macros will lead to an error.
3134 .macpack longbranch ; Include macro package
3136 cmp #$20 ; Set condition codes
3137 jne Label ; Jump long on condition
3140 Macro packages are explained in more detail in section <ref
3141 id="macropackages" name="Macro packages">.
3144 <sect1><tt>.MAC, .MACRO</tt><label id=".MACRO"><p>
3146 Start a classic macro definition. The command is followed by an identifier
3147 (the macro name) and optionally by a comma separated list of identifiers
3148 that are macro parameters. A macro definition is terminated by <tt><ref
3149 id=".ENDMACRO" name=".ENDMACRO"></tt>.
3154 .macro ldax arg ; Define macro ldax
3159 See: <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>,
3160 <tt><ref id=".ENDMACRO" name=".ENDMACRO"></tt>,
3161 <tt><ref id=".EXITMACRO" name=".EXITMACRO"></tt>
3163 See also section <ref id="macros" name="Macros">.
3166 <sect1><tt>.ORG</tt><label id=".ORG"><p>
3168 Start a section of absolute code. The command is followed by a constant
3169 expression that gives the new PC counter location for which the code is
3170 assembled. Use <tt><ref id=".RELOC" name=".RELOC"></tt> to switch back to
3173 By default, absolute/relocatable mode is global (valid even when switching
3174 segments). Using <tt>.FEATURE <ref id="org_per_seg" name="org_per_seg"></tt>
3175 it can be made segment local.
3177 Please note that you <em/do not need/ <tt/.ORG/ in most cases. Placing
3178 code at a specific address is the job of the linker, not the assembler, so
3179 there is usually no reason to assemble code to a specific address.
3184 .org $7FF ; Emit code starting at $7FF
3188 <sect1><tt>.OUT</tt><label id=".OUT"><p>
3190 Output a string to the console without producing an error. This command
3191 is similar to <tt/.ERROR/, however, it does not force an assembler error
3192 that prevents the creation of an object file.
3197 .out "This code was written by the codebuster(tm)"
3200 See also: <tt><ref id=".ERROR" name=".ERROR"></tt>,
3201 <tt><ref id=".FATAL" name=".FATAL"></tt>,
3202 <tt><ref id=".WARNING" name=".WARNING"></tt>
3205 <sect1><tt>.P02</tt><label id=".P02"><p>
3207 Enable the 6502 instruction set, disable 65SC02, 65C02 and 65816
3208 instructions. This is the default if not overridden by the
3209 <tt><ref id="option--cpu" name="--cpu"></tt> command line option.
3211 See: <tt><ref id=".PC02" name=".PC02"></tt>, <tt><ref id=".PSC02"
3212 name=".PSC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3215 <sect1><tt>.P816</tt><label id=".P816"><p>
3217 Enable the 65816 instruction set. This is a superset of the 65SC02 and
3218 6502 instruction sets.
3220 See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PSC02"
3221 name=".PSC02"></tt> and <tt><ref id=".PC02" name=".PC02"></tt>
3224 <sect1><tt>.PAGELEN, .PAGELENGTH</tt><label id=".PAGELENGTH"><p>
3226 Set the page length for the listing. Must be followed by an integer
3227 constant. The value may be "unlimited", or in the range 32 to 127. The
3228 statement has no effect if no listing is generated. The default value is -1
3229 (unlimited) but may be overridden by the <tt/--pagelength/ command line
3230 option. Beware: Since ca65 is a one pass assembler, the listing is generated
3231 after assembly is complete, you cannot use multiple line lengths with one
3232 source. Instead, the value set with the last <tt/.PAGELENGTH/ is used.
3237 .pagelength 66 ; Use 66 lines per listing page
3239 .pagelength unlimited ; Unlimited page length
3243 <sect1><tt>.PC02</tt><label id=".PC02"><p>
3245 Enable the 65C02 instructions set. This instruction set includes all
3246 6502 and 65SC02 instructions.
3248 See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PSC02"
3249 name=".PSC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3252 <sect1><tt>.POPCPU</tt><label id=".POPCPU"><p>
3254 Pop the last CPU setting from the stack, and activate it.
3256 This command will switch back to the CPU that was last pushed onto the CPU
3257 stack using the <tt><ref id=".PUSHCPU" name=".PUSHCPU"></tt> command, and
3258 remove this entry from the stack.
3260 The assembler will print an error message if the CPU stack is empty when
3261 this command is issued.
3263 See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".PUSHCPU"
3264 name=".PUSHCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
3267 <sect1><tt>.POPSEG</tt><label id=".POPSEG"><p>
3269 Pop the last pushed segment from the stack, and set it.
3271 This command will switch back to the segment that was last pushed onto the
3272 segment stack using the <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
3273 command, and remove this entry from the stack.
3275 The assembler will print an error message if the segment stack is empty
3276 when this command is issued.
3278 See: <tt><ref id=".PUSHSEG" name=".PUSHSEG"></tt>
3281 <sect1><tt>.PROC</tt><label id=".PROC"><p>
3283 Start a nested lexical level with the given name and adds a symbol with this
3284 name to the enclosing scope. All new symbols from now on are in the local
3285 lexical level and are accessible from outside only via <ref id="scopesyntax"
3286 name="explicit scope specification">. Symbols defined outside this local
3287 level may be accessed as long as their names are not used for new symbols
3288 inside the level. Symbols names in other lexical levels do not clash, so you
3289 may use the same names for identifiers. The lexical level ends when the
3290 <tt><ref id=".ENDPROC" name=".ENDPROC"></tt> command is read. Lexical levels
3291 may be nested up to a depth of 16 (this is an artificial limit to protect
3292 against errors in the source).
3294 Note: Macro names are always in the global level and in a separate name
3295 space. There is no special reason for this, it's just that I've never
3296 had any need for local macro definitions.
3301 .proc Clear ; Define Clear subroutine, start new level
3303 L1: sta Mem,y ; L1 is local and does not cause a
3304 ; duplicate symbol error if used in other
3307 bne L1 ; Reference local symbol
3309 .endproc ; Leave lexical level
3312 See: <tt/<ref id=".ENDPROC" name=".ENDPROC">/ and <tt/<ref id=".SCOPE"
3316 <sect1><tt>.PSC02</tt><label id=".PSC02"><p>
3318 Enable the 65SC02 instructions set. This instruction set includes all
3321 See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PC02"
3322 name=".PC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
3325 <sect1><tt>.PUSHCPU</tt><label id=".PUSHCPU"><p>
3327 Push the currently active CPU onto a stack. The stack has a size of 8
3330 <tt/.PUSHCPU/ allows together with <tt><ref id=".POPCPU"
3331 name=".POPCPU"></tt> to switch to another CPU and to restore the old CPU
3332 later, without knowledge of the current CPU setting.
3334 The assembler will print an error message if the CPU stack is already full,
3335 when this command is issued.
3337 See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".POPCPU"
3338 name=".POPCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
3341 <sect1><tt>.PUSHSEG</tt><label id=".PUSHSEG"><p>
3343 Push the currently active segment onto a stack. The entries on the stack
3344 include the name of the segment and the segment type. The stack has a size
3347 <tt/.PUSHSEG/ allows together with <tt><ref id=".POPSEG" name=".POPSEG"></tt>
3348 to switch to another segment and to restore the old segment later, without
3349 even knowing the name and type of the current segment.
3351 The assembler will print an error message if the segment stack is already
3352 full, when this command is issued.
3354 See: <tt><ref id=".POPSEG" name=".POPSEG"></tt>
3357 <sect1><tt>.RELOC</tt><label id=".RELOC"><p>
3359 Switch back to relocatable mode. See the <tt><ref id=".ORG"
3360 name=".ORG"></tt> command.
3363 <sect1><tt>.REPEAT</tt><label id=".REPEAT"><p>
3365 Repeat all commands between <tt/.REPEAT/ and <tt><ref id=".ENDREPEAT"
3366 name=".ENDREPEAT"></tt> constant number of times. The command is followed by
3367 a constant expression that tells how many times the commands in the body
3368 should get repeated. Optionally, a comma and an identifier may be specified.
3369 If this identifier is found in the body of the repeat statement, it is
3370 replaced by the current repeat count (starting with zero for the first time
3371 the body is repeated).
3373 <tt/.REPEAT/ statements may be nested. If you use the same repeat count
3374 identifier for a nested <tt/.REPEAT/ statement, the one from the inner
3375 level will be used, not the one from the outer level.
3379 The following macro will emit a string that is "encrypted" in that all
3380 characters of the string are XORed by the value $55.
3384 .repeat .strlen(Arg), I
3385 .byte .strat(Arg, I) ^ $55
3390 See: <tt><ref id=".ENDREPEAT" name=".ENDREPEAT"></tt>
3393 <sect1><tt>.RES</tt><label id=".RES"><p>
3395 Reserve storage. The command is followed by one or two constant
3396 expressions. The first one is mandatory and defines, how many bytes of
3397 storage should be defined. The second, optional expression must by a
3398 constant byte value that will be used as value of the data. If there
3399 is no fill value given, the linker will use the value defined in the
3400 linker configuration file (default: zero).
3405 ; Reserve 12 bytes of memory with value $AA
3410 <sect1><tt>.RODATA</tt><label id=".RODATA"><p>
3412 Switch to the RODATA segment. The name of the RODATA segment is always
3413 "RODATA", so this is a shortcut for
3419 The RODATA segment is a segment that is used by the compiler for
3420 readonly data like string constants.
3422 See also the <tt><ref id=".SEGMENT" name=".SEGMENT"></tt> command.
3425 <sect1><tt>.SCOPE</tt><label id=".SCOPE"><p>
3427 Start a nested lexical level with the given name. All new symbols from now
3428 on are in the local lexical level and are accessible from outside only via
3429 <ref id="scopesyntax" name="explicit scope specification">. Symbols defined
3430 outside this local level may be accessed as long as their names are not used
3431 for new symbols inside the level. Symbols names in other lexical levels do
3432 not clash, so you may use the same names for identifiers. The lexical level
3433 ends when the <tt><ref id=".ENDSCOPE" name=".ENDSCOPE"></tt> command is
3434 read. Lexical levels may be nested up to a depth of 16 (this is an
3435 artificial limit to protect against errors in the source).
3437 Note: Macro names are always in the global level and in a separate name
3438 space. There is no special reason for this, it's just that I've never
3439 had any need for local macro definitions.
3444 .scope Error ; Start new scope named Error
3446 File = 1 ; File error
3447 Parse = 2 ; Parse error
3448 .endscope ; Close lexical level
3451 lda #Error::File ; Use symbol from scope Error
3454 See: <tt/<ref id=".ENDSCOPE" name=".ENDSCOPE">/ and <tt/<ref id=".PROC"
3458 <sect1><tt>.SEGMENT</tt><label id=".SEGMENT"><p>
3460 Switch to another segment. Code and data is always emitted into a
3461 segment, that is, a named section of data. The default segment is
3462 "CODE". There may be up to 254 different segments per object file
3463 (and up to 65534 per executable). There are shortcut commands for
3464 the most common segments ("CODE", "DATA" and "BSS").
3466 The command is followed by a string containing the segment name (there are
3467 some constraints for the name - as a rule of thumb use only those segment
3468 names that would also be valid identifiers). There may also be an optional
3469 address size separated by a colon. See the section covering <tt/<ref
3470 id="address-sizes" name="address sizes">/ for more information.
3472 The default address size for a segment depends on the memory model specified
3473 on the command line. The default is "absolute", which means that you don't
3474 have to use an address size modifier in most cases.
3476 "absolute" means that the is a segment with 16 bit (absolute) addressing.
3477 That is, the segment will reside somewhere in core memory outside the zero
3478 page. "zeropage" (8 bit) means that the segment will be placed in the zero
3479 page and direct (short) addressing is possible for data in this segment.
3481 Beware: Only labels in a segment with the zeropage attribute are marked
3482 as reachable by short addressing. The `*' (PC counter) operator will
3483 work as in other segments and will create absolute variable values.
3485 Please note that a segment cannot have two different address sizes. A
3486 segment specified as zeropage cannot be declared as being absolute later.
3491 .segment "ROM2" ; Switch to ROM2 segment
3492 .segment "ZP2": zeropage ; New direct segment
3493 .segment "ZP2" ; Ok, will use last attribute
3494 .segment "ZP2": absolute ; Error, redecl mismatch
3497 See: <tt><ref id=".BSS" name=".BSS"></tt>, <tt><ref id=".CODE"
3498 name=".CODE"></tt>, <tt><ref id=".DATA" name=".DATA"></tt> and <tt><ref
3499 id=".RODATA" name=".RODATA"></tt>
3502 <sect1><tt>.SETCPU</tt><label id=".SETCPU"><p>
3504 Switch the CPU instruction set. The command is followed by a string that
3505 specifies the CPU. Possible values are those that can also be supplied to
3506 the <tt><ref id="option--cpu" name="--cpu"></tt> command line option,
3507 namely: 6502, 6502X, 65SC02, 65C02, 65816, sunplus and HuC6280. Please
3508 note that support for the sunplus CPU is not available in the freeware
3509 version, because the instruction set of the sunplus CPU is "proprietary
3512 See: <tt><ref id=".CPU" name=".CPU"></tt>,
3513 <tt><ref id=".IFP02" name=".IFP02"></tt>,
3514 <tt><ref id=".IFP816" name=".IFP816"></tt>,
3515 <tt><ref id=".IFPC02" name=".IFPC02"></tt>,
3516 <tt><ref id=".IFPSC02" name=".IFPSC02"></tt>,
3517 <tt><ref id=".P02" name=".P02"></tt>,
3518 <tt><ref id=".P816" name=".P816"></tt>,
3519 <tt><ref id=".PC02" name=".PC02"></tt>,
3520 <tt><ref id=".PSC02" name=".PSC02"></tt>
3523 <sect1><tt>.SMART</tt><label id=".SMART"><p>
3525 Switch on or off smart mode. The command must be followed by a '+' or '-'
3526 character to switch the option on or off respectively. The default is off
3527 (that is, the assembler doesn't try to be smart), but this default may be
3528 changed by the -s switch on the command line.
3530 In smart mode the assembler will do the following:
3533 <item>Track usage of the <tt/REP/ and <tt/SEP/ instructions in 65816 mode
3534 and update the operand sizes accordingly. If the operand of such an
3535 instruction cannot be evaluated by the assembler (for example, because
3536 the operand is an imported symbol), a warning is issued. Beware: Since
3537 the assembler cannot trace the execution flow this may lead to false
3538 results in some cases. If in doubt, use the <tt/.Inn/ and <tt/.Ann/
3539 instructions to tell the assembler about the current settings.
3540 <item>In 65816 mode, replace a <tt/RTS/ instruction by <tt/RTL/ if it is
3541 used within a procedure declared as <tt/far/, or if the procedure has
3542 no explicit address specification, but it is <tt/far/ because of the
3550 .smart - ; Stop being smart
3553 See: <tt><ref id=".A16" name=".A16"></tt>,
3554 <tt><ref id=".A8" name=".A8"></tt>,
3555 <tt><ref id=".I16" name=".I16"></tt>,
3556 <tt><ref id=".I8" name=".I8"></tt>
3559 <sect1><tt>.STRUCT</tt><label id=".STRUCT"><p>
3561 Starts a struct definition. Structs are covered in a separate section named
3562 <ref id="structs" name=""Structs and unions"">.
3564 See: <tt><ref id=".ENDSTRUCT" name=".ENDSTRUCT"></tt>
3567 <sect1><tt>.SUNPLUS</tt><label id=".SUNPLUS"><p>
3569 Enable the SunPlus instructions set. This command will not work in the
3570 freeware version of the assembler, because the instruction set is
3571 "proprietary and confidential".
3573 See: <tt><ref id=".P02" name=".P02"></tt>, <tt><ref id=".PSC02"
3574 name=".PSC02"></tt>, <tt><ref id=".PC02" name=".PC02"></tt>, and
3575 <tt><ref id=".P816" name=".P816"></tt>
3578 <sect1><tt>.TAG</tt><label id=".TAG"><p>
3580 Allocate space for a struct or union.
3591 .tag Point ; Allocate 4 bytes
3595 <sect1><tt>.UNDEF, .UNDEFINE</tt><label id=".UNDEFINE"><p>
3597 Delete a define style macro definition. The command is followed by an
3598 identifier which specifies the name of the macro to delete. Macro
3599 replacement is switched of when reading the token following the command
3600 (otherwise the macro name would be replaced by its replacement list).
3602 See also the <tt><ref id=".DEFINE" name=".DEFINE"></tt> command and
3603 section <ref id="macros" name="Macros">.
3606 <sect1><tt>.WARNING</tt><label id=".WARNING"><p>
3608 Force an assembly warning. The assembler will output a warning message
3609 preceded by "User warning". This warning will always be output, even if
3610 other warnings are disabled with the <tt><ref id="option-W" name="-W0"></tt>
3611 command line option.
3613 This command may be used to output possible problems when assembling
3622 .warning "Forward jump in jne, cannot optimize!"
3632 See also: <tt><ref id=".ERROR" name=".ERROR"></tt>
3633 <tt><ref id=".FATAL" name=".FATAL"></tt>,
3634 <tt><ref id=".OUT" name=".OUT"></tt>
3637 <sect1><tt>.WORD</tt><label id=".WORD"><p>
3639 Define word sized data. Must be followed by a sequence of (word ranged,
3640 but not necessarily constant) expressions.
3645 .word $0D00, $AF13, _Clear
3649 <sect1><tt>.ZEROPAGE</tt><label id=".ZEROPAGE"><p>
3651 Switch to the ZEROPAGE segment and mark it as direct (zeropage) segment.
3652 The name of the ZEROPAGE segment is always "ZEROPAGE", so this is a
3656 .segment "ZEROPAGE", zeropage
3659 Because of the "zeropage" attribute, labels declared in this segment are
3660 addressed using direct addressing mode if possible. You <em/must/ instruct
3661 the linker to place this segment somewhere in the address range 0..$FF
3662 otherwise you will get errors.
3664 See: <tt><ref id=".SEGMENT" name=".SEGMENT"></tt>
3668 <sect>Macros<label id="macros"><p>
3671 <sect1>Introduction<p>
3673 Macros may be thought of as "parametrized super instructions". Macros are
3674 sequences of tokens that have a name. If that name is used in the source
3675 file, the macro is "expanded", that is, it is replaced by the tokens that
3676 were specified when the macro was defined.
3679 <sect1>Macros without parameters<p>
3681 In its simplest form, a macro does not have parameters. Here's an
3685 .macro asr ; Arithmetic shift right
3686 cmp #$80 ; Put bit 7 into carry
3687 ror ; Rotate right with carry
3691 The macro above consists of two real instructions, that are inserted into
3692 the code, whenever the macro is expanded. Macro expansion is simply done
3693 by using the name, like this:
3702 <sect1>Parametrized macros<p>
3704 When using macro parameters, macros can be even more useful:
3718 When calling the macro, you may give a parameter, and each occurrence of
3719 the name "addr" in the macro definition will be replaced by the given
3738 A macro may have more than one parameter, in this case, the parameters
3739 are separated by commas. You are free to give less parameters than the
3740 macro actually takes in the definition. You may also leave intermediate
3741 parameters empty. Empty parameters are replaced by empty space (that is,
3742 they are removed when the macro is expanded). If you have a look at our
3743 macro definition above, you will see, that replacing the "addr" parameter
3744 by nothing will lead to wrong code in most lines. To help you, writing
3745 macros with a variable parameter list, there are some control commands:
3747 <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> tests the rest of the line and
3748 returns true, if there are any tokens on the remainder of the line. Since
3749 empty parameters are replaced by nothing, this may be used to test if a given
3750 parameter is empty. <tt><ref id=".IFNBLANK" name=".IFNBLANK"></tt> tests the
3753 Look at this example:
3756 .macro ldaxy a, x, y
3769 This macro may be called as follows:
3772 ldaxy 1, 2, 3 ; Load all three registers
3774 ldaxy 1, , 3 ; Load only a and y
3776 ldaxy , , 3 ; Load y only
3779 There's another helper command for determining, which macro parameters are
3780 valid: <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt> This command is
3781 replaced by the parameter count given, <em/including/ intermediate empty macro
3785 ldaxy 1 ; .PARAMCOUNT = 1
3786 ldaxy 1,,3 ; .PARAMCOUNT = 3
3787 ldaxy 1,2 ; .PARAMCOUNT = 2
3788 ldaxy 1, ; .PARAMCOUNT = 2
3789 ldaxy 1,2,3 ; .PARAMCOUNT = 3
3792 Macro parameters may optionally be enclosed into curly braces. This allows the
3793 inclusion of tokens that would otherwise terminate the parameter (the comma in
3794 case of a macro parameter).
3797 .macro foo arg1, arg2
3801 foo ($00,x) ; Two parameters passed
3802 foo {($00,x)} ; One parameter passed
3805 In the first case, the macro is called with two parameters: '<tt/($00/'
3806 and 'x)'. The comma is not passed to the macro, since it is part of the
3807 calling sequence, not the parameters.
3809 In the second case, '($00,x)' is passed to the macro, this time
3810 including the comma.
3813 <sect1>Detecting parameter types<p>
3815 Sometimes it is nice to write a macro that acts differently depending on the
3816 type of the argument supplied. An example would be a macro that loads a 16 bit
3817 value from either an immediate operand, or from memory. The <tt/<ref
3818 id=".MATCH" name=".MATCH">/ and <tt/<ref id=".XMATCH" name=".XMATCH">/
3819 functions will allow you to do exactly this:
3823 .if (.match (.left (1, {arg}), #))
3825 lda #<(.right (.tcount ({arg})-1, {arg}))
3826 ldx #>(.right (.tcount ({arg})-1, {arg}))
3828 ; assume absolute or zero page
3835 Using the <tt/<ref id=".MATCH" name=".MATCH">/ function, the macro is able to
3836 check if its argument begins with a hash mark. If so, two immediate loads are
3837 emitted, Otherwise a load from an absolute zero page memory location is
3838 assumed. Please note how the curly braces are used to enclose parameters to
3839 pseudo functions handling token lists. This is necessary, because the token
3840 lists may include commas or parens, which would be treated by the assembler
3843 The macro can be used as
3848 ldax #$1234 ; X=$12, A=$34
3850 ldax foo ; X=$56, A=$78
3854 <sect1>Recursive macros<p>
3856 Macros may be used recursively:
3859 .macro push r1, r2, r3
3868 There's also a special macro to help writing recursive macros: <tt><ref
3869 id=".EXITMACRO" name=".EXITMACRO"></tt> This command will stop macro expansion
3873 .macro push r1, r2, r3, r4, r5, r6, r7
3875 ; First parameter is empty
3881 push r2, r3, r4, r5, r6, r7
3885 When expanding this macro, the expansion will push all given parameters
3886 until an empty one is encountered. The macro may be called like this:
3889 push $20, $21, $32 ; Push 3 ZP locations
3890 push $21 ; Push one ZP location
3894 <sect1>Local symbols inside macros<p>
3896 Now, with recursive macros, <tt><ref id=".IFBLANK" name=".IFBLANK"></tt> and
3897 <tt><ref id=".PARAMCOUNT" name=".PARAMCOUNT"></tt>, what else do you need?
3898 Have a look at the inc16 macro above. Here is it again:
3912 If you have a closer look at the code, you will notice, that it could be
3913 written more efficiently, like this:
3924 But imagine what happens, if you use this macro twice? Since the label
3925 "Skip" has the same name both times, you get a "duplicate symbol" error.
3926 Without a way to circumvent this problem, macros are not as useful, as
3927 they could be. One solution is, to start a new lexical block inside the
3941 Now the label is local to the block and not visible outside. However,
3942 sometimes you want a label inside the macro to be visible outside. To make
3943 that possible, there's a new command that's only usable inside a macro
3944 definition: <tt><ref id=".LOCAL" name=".LOCAL"></tt>. <tt/.LOCAL/ declares one
3945 or more symbols as local to the macro expansion. The names of local variables
3946 are replaced by a unique name in each separate macro expansion. So we could
3947 also solve the problem above by using <tt/.LOCAL/:
3951 .local Skip ; Make Skip a local symbol
3958 Skip: ; Not visible outside
3963 <sect1>C style macros<p>
3965 Starting with version 2.5 of the assembler, there is a second macro type
3966 available: C style macros using the <tt/.DEFINE/ directive. These macros are
3967 similar to the classic macro type described above, but behaviour is sometimes
3972 <item> Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> may not
3973 span more than a line. You may use line continuation (see <tt><ref
3974 id=".LINECONT" name=".LINECONT"></tt>) to spread the definition over
3975 more than one line for increased readability, but the macro itself
3976 may not contain an end-of-line token.
3978 <item> Macros defined with <tt><ref id=".DEFINE" name=".DEFINE"></tt> share
3979 the name space with classic macros, but they are detected and replaced
3980 at the scanner level. While classic macros may be used in every place,
3981 where a mnemonic or other directive is allowed, <tt><ref id=".DEFINE"
3982 name=".DEFINE"></tt> style macros are allowed anywhere in a line. So
3983 they are more versatile in some situations.
3985 <item> <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may take
3986 parameters. While classic macros may have empty parameters, this is
3987 not true for <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros.
3988 For this macro type, the number of actual parameters must match
3989 exactly the number of formal parameters.
3991 To make this possible, formal parameters are enclosed in braces when
3992 defining the macro. If there are no parameters, the empty braces may
3995 <item> Since <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros may not
3996 contain end-of-line tokens, there are things that cannot be done. They
3997 may not contain several processor instructions for example. So, while
3998 some things may be done with both macro types, each type has special
3999 usages. The types complement each other.
4003 Let's look at a few examples to make the advantages and disadvantages
4006 To emulate assemblers that use "<tt/EQU/" instead of "<tt/=/" you may use the
4007 following <tt/.DEFINE/:
4012 foo EQU $1234 ; This is accepted now
4015 You may use the directive to define string constants used elsewhere:
4018 ; Define the version number
4019 .define VERSION "12.3a"
4025 Macros with parameters may also be useful:
4028 .define DEBUG(message) .out message
4030 DEBUG "Assembling include file #3"
4033 Note that, while formal parameters have to be placed in braces, this is
4034 not true for the actual parameters. Beware: Since the assembler cannot
4035 detect the end of one parameter, only the first token is used. If you
4036 don't like that, use classic macros instead:
4044 (This is an example where a problem can be solved with both macro types).
4047 <sect1>Characters in macros<p>
4049 When using the <ref id="option-t" name="-t"> option, characters are translated
4050 into the target character set of the specific machine. However, this happens
4051 as late as possible. This means that strings are translated if they are part
4052 of a <tt><ref id=".BYTE" name=".BYTE"></tt> or <tt><ref id=".ASCIIZ"
4053 name=".ASCIIZ"></tt> command. Characters are translated as soon as they are
4054 used as part of an expression.
4056 This behaviour is very intuitive outside of macros but may be confusing when
4057 doing more complex macros. If you compare characters against numeric values,
4058 be sure to take the translation into account.
4061 <sect1>Deleting macros<p>
4063 Macros can be deleted. This will not work if the macro that should be deleted
4064 is currently expanded as in the following non working example:
4068 .delmacro notworking
4071 notworking ; Will not work
4074 The commands to delete classic and define style macros differ. Classic macros
4075 can be deleted by use of <tt><ref id=".DELMACRO" name=".DELMACRO"></tt>, while
4076 for <tt><ref id=".DEFINE" name=".DEFINE"></tt> style macros, <tt><ref
4077 id=".UNDEFINE" name=".UNDEFINE"></tt> must be used. Example:
4085 .byte value ; Emit one byte with value 1
4086 mac ; Emit another byte with value 2
4091 .byte value ; Error: Unknown identifier
4092 mac ; Error: Missing ":"
4095 A separate command for <tt>.DEFINE</tt> style macros was necessary, because
4096 the name of such a macro is replaced by its replacement list on a very low
4097 level. To get the actual name, macro replacement has to be switched off when
4098 reading the argument to <tt>.UNDEFINE</tt>. This does also mean that the
4099 argument to <tt>.UNDEFINE</tt> is not allowed to come from another
4100 <tt>.DEFINE</tt>. All this is not necessary for classic macros, so having two
4101 different commands increases flexibility.
4104 <sect>Macro packages<label id="macropackages"><p>
4106 Using the <tt><ref id=".MACPACK" name=".MACPACK"></tt> directive, predefined
4107 macro packages may be included with just one command. Available macro packages
4111 <sect1><tt>.MACPACK generic</tt><p>
4113 This macro package defines macros that are useful in almost any program.
4114 Currently defined macros are:
4149 <sect1><tt>.MACPACK longbranch</tt><p>
4151 This macro package defines long conditional jumps. They are named like the
4152 short counterpart but with the 'b' replaced by a 'j'. Here is a sample
4153 definition for the "<tt/jeq/" macro, the other macros are built using the same
4158 .if .def(Target) .and ((*+2)-(Target) <= 127)
4167 All macros expand to a short branch, if the label is already defined (back
4168 jump) and is reachable with a short jump. Otherwise the macro expands to a
4169 conditional branch with the branch condition inverted, followed by an absolute
4170 jump to the actual branch target.
4172 The package defines the following macros:
4175 jeq, jne, jmi, jpl, jcs, jcc, jvs, jvc
4180 <sect1><tt>.MACPACK atari</tt><p>
4182 The atari macro package will define a macro named <tt/scrcode/. It takes a
4183 string as argument and places this string into memory translated into screen
4187 <sect1><tt>.MACPACK cbm</tt><p>
4189 The cbm macro package will define a macro named <tt/scrcode/. It takes a
4190 string as argument and places this string into memory translated into screen
4194 <sect1><tt>.MACPACK cpu</tt><p>
4196 This macro package does not define any macros but constants used to examine
4197 the value read from the <tt/<ref id=".CPU" name=".CPU">/ pseudo variable. For
4198 each supported CPU a constant similar to
4210 is defined. These constants may be used to determine the exact type of the
4211 currently enabled CPU. In addition to that, for each CPU instruction set,
4212 another constant is defined:
4224 The value read from the <tt/<ref id=".CPU" name=".CPU">/ pseudo variable may
4225 be checked with <tt/<ref id="operators" name=".BITAND">/ to determine if the
4226 currently enabled CPU supports a specific instruction set. For example the
4227 65C02 supports all instructions of the 65SC02 CPU, so it has the
4228 <tt/CPU_ISET_65SC02/ bit set in addition to its native <tt/CPU_ISET_65C02/
4232 .if (.cpu .bitand CPU_ISET_65SC02)
4240 it is possible to determine if the
4246 instruction is supported, which is the case for the 65SC02, 65C02 and 65816
4247 CPUs (the latter two are upwards compatible to the 65SC02).
4251 <sect>Predefined constants<label id="predefined-constants"><p>
4253 For better orthogonality, the assembler defines similar symbols as the
4254 compiler, depending on the target system selected:
4257 <item><tt/__APPLE2__/ - Target system is <tt/apple2/
4258 <item><tt/__APPLE2ENH__/ - Target system is <tt/apple2enh/
4259 <item><tt/__ATARI__/ - Target system is <tt/atari/
4260 <item><tt/__ATMOS__/ - Target system is <tt/atmos/
4261 <item><tt/__BBC__/ - Target system is <tt/bbc/
4262 <item><tt/__C128__/ - Target system is <tt/c128/
4263 <item><tt/__C16__/ - Target system is <tt/c16/
4264 <item><tt/__C64__/ - Target system is <tt/c64/
4265 <item><tt/__CBM__/ - Target is a Commodore system
4266 <item><tt/__CBM510__/ - Target system is <tt/cbm510/
4267 <item><tt/__CBM610__/ - Target system is <tt/cbm610/
4268 <item><tt/__GEOS__/ - Target system is <tt/geos/
4269 <item><tt/__LUNIX__/ - Target system is <tt/lunix/
4270 <item><tt/__NES__/ - Target system is <tt/nes/
4271 <item><tt/__PET__/ - Target system is <tt/pet/
4272 <item><tt/__PLUS4__/ - Target system is <tt/plus4/
4273 <item><tt/__SUPERVISION__/ - Target system is <tt/supervision/
4274 <item><tt/__VIC20__/ - Target system is <tt/vic20/
4278 <sect>Structs and unions<label id="structs"><p>
4280 <sect1>Structs and unions Overview<p>
4282 Structs and unions are special forms of <ref id="scopes" name="scopes">. They
4283 are to some degree comparable to their C counterparts. Both have a list of
4284 members. Each member allocates storage and may optionally have a name, which,
4285 in case of a struct, is the offset from the beginning and, in case of a union,
4289 <sect1>Declaration<p>
4291 Here is an example for a very simple struct with two members and a total size
4301 A union shares the total space between all its members, its size is the same
4302 as that of the largest member.
4304 A struct or union must not necessarily have a name. If it is anonymous, no
4305 local scope is opened, the identifiers used to name the members are placed
4306 into the current scope instead.
4308 A struct may contain unnamed members and definitions of local structs. The
4309 storage allocators may contain a multiplier, as in the example below:
4314 .word 2 ; Allocate two words
4321 <sect1>The <tt/.TAG/ keyword<p>
4323 Using the <ref id=".TAG" name=".TAG"> keyword, it is possible to reserve space
4324 for an already defined struct or unions within another struct:
4338 Space for a struct or union may be allocated using the <ref id=".TAG"
4339 name=".TAG"> directive.
4345 Currently, members are just offsets from the start of the struct or union. To
4346 access a field of a struct, the member offset has to be added to the address
4347 of the struct itself:
4350 lda C+Circle::Radius ; Load circle radius into A
4353 This may change in a future version of the assembler.
4356 <sect1>Limitations<p>
4358 Structs and unions are currently implemented as nested symbol tables (in fact,
4359 they were a by-product of the improved scoping rules). Currently, the
4360 assembler has no idea of types. This means that the <ref id=".TAG"
4361 name=".TAG"> keyword will only allocate space. You won't be able to initialize
4362 variables declared with <ref id=".TAG" name=".TAG">, and adding an embedded
4363 structure to another structure with <ref id=".TAG" name=".TAG"> will not make
4364 this structure accessible by using the '::' operator.
4368 <sect>Module constructors/destructors<label id="condes"><p>
4370 <em>Note:</em> This section applies mostly to C programs, so the explanation
4371 below uses examples from the C libraries. However, the feature may also be
4372 useful for assembler programs.
4375 <sect1>Module constructors/destructors Overview<p>
4377 Using the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
4378 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
4379 name=".INTERRUPTOR"></tt> keywords it it possible to export functions in a
4380 special way. The linker is able to generate tables with all functions of a
4381 specific type. Such a table will <em>only</em> include symbols from object
4382 files that are linked into a specific executable. This may be used to add
4383 initialization and cleanup code for library modules, or a table of interrupt
4386 The C heap functions are an example where module initialization code is used.
4387 All heap functions (<tt>malloc</tt>, <tt>free</tt>, ...) work with a few
4388 variables that contain the start and the end of the heap, pointers to the free
4389 list and so on. Since the end of the heap depends on the size and start of the
4390 stack, it must be initialized at runtime. However, initializing these
4391 variables for programs that do not use the heap are a waste of time and
4394 So the central module defines a function that contains initialization code and
4395 exports this function using the <tt/.CONSTRUCTOR/ statement. If (and only if)
4396 this module is added to an executable by the linker, the initialization
4397 function will be placed into the table of constructors by the linker. The C
4398 startup code will call all constructors before <tt/main/ and all destructors
4399 after <tt/main/, so without any further work, the heap initialization code is
4400 called once the module is linked in.
4402 While it would be possible to add explicit calls to initialization functions
4403 in the startup code, the new approach has several advantages:
4407 If a module is not included, the initialization code is not linked in and not
4408 called. So you don't pay for things you don't need.
4411 Adding another library that needs initialization does not mean that the
4412 startup code has to be changed. Before we had module constructors and
4413 destructors, the startup code for all systems had to be adjusted to call the
4414 new initialization code.
4417 The feature saves memory: Each additional initialization function needs just
4418 two bytes in the table (a pointer to the function).
4423 <sect1>Calling order<p>
4425 The symbols are sorted in increasing priority order by the linker when using
4426 one of the builtin linker configurations, so the functions with lower
4427 priorities come first and are followed by those with higher priorities. The C
4428 library runtime subroutine that walks over the function tables calls the
4429 functions starting from the top of the table - which means that functions with
4430 a high priority are called first.
4432 So when using the C runtime, functions are called with high priority functions
4433 first, followed by low priority functions.
4438 When using these special symbols, please take care of the following:
4443 The linker will only generate function tables, it will not generate code to
4444 call these functions. If you're using the feature in some other than the
4445 existing C environments, you have to write code to call all functions in a
4446 linker generated table yourself. See the <tt/condes/ and <tt/callirq/ modules
4447 in the C runtime for an example on how to do this.
4450 The linker will only add addresses of functions that are in modules linked to
4451 the executable. This means that you have to be careful where to place the
4452 condes functions. If initialization or an irq handler is needed for a group of
4453 functions, be sure to place the function into a module that is linked in
4454 regardless of which function is called by the user.
4457 The linker will generate the tables only when requested to do so by the
4458 <tt/FEATURE CONDES/ statement in the linker config file. Each table has to
4459 be requested separately.
4462 Constructors and destructors may have priorities. These priorities determine
4463 the order of the functions in the table. If your initialization or cleanup code
4464 does depend on other initialization or cleanup code, you have to choose the
4465 priority for the functions accordingly.
4468 Besides the <tt><ref id=".CONSTRUCTOR" name=".CONSTRUCTOR"></tt>, <tt><ref
4469 id=".DESTRUCTOR" name=".DESTRUCTOR"></tt> and <tt><ref id=".INTERRUPTOR"
4470 name=".INTERRUPTOR"></tt> statements, there is also a more generic command:
4471 <tt><ref id=".CONDES" name=".CONDES"></tt>. This allows to specify an
4472 additional type. Predefined types are 0 (constructor), 1 (destructor) and 2
4473 (interruptor). The linker generates a separate table for each type on request.
4478 <sect>Porting sources from other assemblers<p>
4480 Sometimes it is necessary to port code written for older assemblers to ca65.
4481 In some cases, this can be done without any changes to the source code by
4482 using the emulation features of ca65 (see <tt><ref id=".FEATURE"
4483 name=".FEATURE"></tt>). In other cases, it is necessary to make changes to the
4486 Probably the biggest difference is the handling of the <tt><ref id=".ORG"
4487 name=".ORG"></tt> directive. ca65 generates relocatable code, and placement is
4488 done by the linker. Most other assemblers generate absolute code, placement is
4489 done within the assembler and there is no external linker.
4491 In general it is not a good idea to write new code using the emulation
4492 features of the assembler, but there may be situations where even this rule is
4497 You need to use some of the ca65 emulation features to simulate the behaviour
4498 of such simple assemblers.
4501 <item>Prepare your sourcecode like this:
4504 ; if you want TASS style labels without colons
4505 .feature labels_without_colons
4507 ; if you want TASS style character constants
4508 ; ("a" instead of the default 'a')
4509 .feature loose_char_term
4511 .word *+2 ; the cbm load address
4516 notice that the two emulation features are mostly useful for porting
4517 sources originally written in/for TASS, they are not needed for the
4518 actual "simple assembler operation" and are not recommended if you are
4519 writing new code from scratch.
4521 <item>Replace all program counter assignments (which are not possible in ca65
4522 by default, and the respective emulation feature works different from what
4523 you'd expect) by another way to skip to memory locations, for example the
4524 <tt><ref id=".RES" name=".RES"></tt> directive.
4528 .res $2000-* ; reserve memory up to $2000
4531 Please note that other than the original TASS, ca65 can never move the program
4532 counter backwards - think of it as if you are assembling to disk with TASS.
4534 <item>Conditional assembly (<tt/.ifeq//<tt/.endif//<tt/.goto/ etc.) must be
4535 rewritten to match ca65 syntax. Most importantly notice that due to the lack
4536 of <tt/.goto/, everything involving loops must be replaced by
4537 <tt><ref id=".REPEAT" name=".REPEAT"></tt>.
4539 <item>To assemble code to a different address than it is executed at, use the
4540 <tt><ref id=".ORG" name=".ORG"></tt> directive instead of
4541 <tt/.offs/-constructs.
4548 .reloc ; back to normal
4551 <item>Then assemble like this:
4554 cl65 --start-addr 0x0ffe -t none myprog.s -o myprog.prg
4557 Note that you need to use the actual start address minus two, since two bytes
4558 are used for the cbm load address.
4563 <sect>Bugs/Feedback<p>
4565 If you have problems using the assembler, if you find any bugs, or if
4566 you're doing something interesting with the assembler, I would be glad to
4567 hear from you. Feel free to contact me by email
4568 (<htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org">).
4574 ca65 (and all cc65 binutils) are (C) Copyright 1998-2003 Ullrich von
4575 Bassewitz. For usage of the binaries and/or sources the following
4576 conditions do apply:
4578 This software is provided 'as-is', without any expressed or implied
4579 warranty. In no event will the authors be held liable for any damages
4580 arising from the use of this software.
4582 Permission is granted to anyone to use this software for any purpose,
4583 including commercial applications, and to alter it and redistribute it
4584 freely, subject to the following restrictions:
4587 <item> The origin of this software must not be misrepresented; you must not
4588 claim that you wrote the original software. If you use this software
4589 in a product, an acknowledgment in the product documentation would be
4590 appreciated but is not required.
4591 <item> Altered source versions must be plainly marked as such, and must not
4592 be misrepresented as being the original software.
4593 <item> This notice may not be removed or altered from any source