Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
XA(1)			     General Commands Manual			   XA(1)

NAME
     xa - 6502/R65C02/65816 cross-assembler

SYNOPSIS
     xa [OPTION]... FILE

DESCRIPTION
     xa is a multi-pass cross-assembler for the 8-bit processors in the 6502 se-
     ries  (such  as  the  6502,  65C02,  6504, 6507, 6510, 7501, 8500, 8501 and
     8502), the Rockwell R65C02, and the 16-bit 65816 processor. For a	descrip-
     tion of syntax, see ASSEMBLER SYNTAX further in this manual page.

OPTIONS
     -E     Do not stop after 20 errors, but show all errors.

     -v     Verbose output.

     -C     No CMOS opcodes (default is to allow R65C02 opcodes).

     -W     No 65816 opcodes (default).

     -w     Allow 65816 opcodes.

     -B     Show lines with block open/close (see PSEUDO-OPS).

     -c     Produce  o65  object  files  instead of executable files (no linking
	    performed); files may contain undefined references.

     -o filename
	    Set output filename. The default is a.o65; use the special	filename
	    - to output to standard output.

     -P filename
	    Set  listing filename. The default is none; use the special filename
	    - to print the listing to standard output.

     -F format
	    Set listing format; default is plain.  The only other currently sup-
	    ported format is html.

     -e filename
	    Set errorlog filename; default is none.

     -l filename
	    Set labellist filename; default is none. This is  the  symbol  table
	    and  can  be  used	by  disassemblers  such as dxa(1) to reconstruct
	    source.

     -r     Add cross-reference list to labellist (requires -l).

     -Xcompatset
	    Enables compatibility settings to become more (not fully!)	compati-
	    ble  with  other 6502 assemblers and codebases.  Currently supported
	    are compatibility sets MASM, CA65 and C, with XA23	available  as  a
	    deprecated	option	for  codebases relying on compatibility with the
	    previous version of xa.  Multiple compatibility sets may  be  speci-
	    fied and combined, e.g., -XMASM -XXA23.

	    -XMASM  allows  colons to appear in comments for MASM compatibility.
	    This does not affect colon interpretation elsewhere and  may  become
	    the default in a future version.

	    -XCA65  adds  syntactic  features  more compatible with ca65(1).  It
	    permits := for defining labels (instead of plain =), and  adds  sup-
	    port for unnamed labels and "cheap" local labels using the @ charac-
	    ter,  but  disables its other meaning for 24-bit mode (see ASSEMBLER
	    SYNTAX).

	    -XC enables the usage of 0xHEX and 0OCTAL C-style number encodings.

	    -XXA23 restores partial compatibility with xa 2.3.x. In  particular,
	    it	uses ^ for generating control characters, disables escaped char-
	    acters with \, allows nested multi-line comments, and  disables  all
	    predefined	xa  preprocessor  macros. Although some portions of this
	    option remain supported syntax, the option itself is inherently dep-
	    recated and may be removed in the next 2.x or 3.x release.

     -a     Support ca65(1)-style unnamed labels using colons, but not	the  re-
	    mainder  of  the other supported ca65(1) features. This allows their
	    use with 65816 mode, for example. Implies -XMASM.

     -M     This option is deprecated and will be removed in a	future	version;
	    use  -XMASM  instead.  Allows  colons to appear in comments for MASM
	    compatibility. This does not affect colon interpretation  elsewhere,
	    and may become the default in a future version.

     -k     Allow  the	carat  (^)  to mask a character with $1f/31. This can be
	    used as a shorthand for control characters, such as ^m^j becoming  a
	    carriage return followed by a linefeed.

     -R     Start assembler in relocating mode, i.e. use segments.

     -U     Do not allow undefined labels in relocating mode.

     -Llabel
	    Defines  label  as an absolute (but undefined) label even when link-
	    ing.

     -b? addr
	    Set segment base for segment ?  to address addr.  ?  should be t, d,
	    b or z for text, data, bss or zero segments, respectively.

     -A addr
	    Make text segment start at an address such that when the file starts
	    at address addr, relocation is not necessary. Overrides  -bt;  other
	    segments still have to be taken care of with -b.

     -G     Suppress list of exported globals.

     -DDEF=TEXT
	    Define a preprocessor macro on the command line (see PREPROCESSOR).

     -I dir
	    Add  directory dir to the include path (before XAINPUT; see ENVIRON-
	    MENT).

     -O charset
	    Define the output charset for character strings. Currently supported
	    are ASCII (default), PETSCII (Commodore ASCII), PETSCREEN (Commodore
	    screen codes) and HIGH (set high bit on all characters).

     -p?    Set the alternative preprocessor character to  ?.	This  is  useful
	    when  you  wish  to  use cpp(1) and the built-in preprocessor at the
	    same time (see PREPROCESSOR).  Characters may need to be quoted  for
	    your shell (example: -p'~' ).

     --help
	    Show summary of options (-?  is a synonym).

     --version
	    Show version of program.

ASSEMBLER SYNTAX
     An  introduction to 6502 assembly language programming and mnemonics is be-
     yond the scope of this manual page. We invite you to investigate any number
     of the excellent books on the subject; one useful title  is  "Machine  Lan-
     guage  For  Beginners" by Richard Mansfield (COMPUTE!), covering the Atari,
     Commodore and Apple 8-bit systems, and is widely available on the used mar-
     ket.

     xa supports both the standard NMOS 6502 opcodes as  well  as  the	Rockwell
     CMOS  opcodes  used in the 65C02 (R65C02). With the -w option, xa will also
     accept opcodes for the 65816. NMOS 6502 undocumented opcodes are intention-
     ally not supported, and should be entered manually using the .byte  pseudo-
     op  (see  PSEUDO-OPS).   Due  to conflicts between the R65C02 and 65816 in-
     struction sets and undocumented instructions on the NMOS 6502, their use is
     discouraged.

     In general, xa accepts the more-or-less standard 6502 assembler  format  as
     popularised  by  MASM  and  TurboAssembler. Values and addresses can be ex-
     pressed either as literals, or as expressions; to wit,

     123       decimal value

     $234      hexadecimal value (0x234 accepted with -XC)

     &123      octal (0123 accepted with -XC)

     %010110   binary

     *	       current value of the program counter

     The ASCII value of any quoted character is inserted directly into the  pro-
     gram  text  (example: "A" inserts the byte "A" into the output stream); see
     also the PSEUDO-OPS section. This is affected  by	the  currently	selected
     character set, if any.

     Labels  define  locations	within the program text, just as in other multi-
     pass assemblers. A label is defined by anything that is not an opcode;  for
     example, a line such as

	    label1 lda #0

     defines  label1 to be the current location of the program counter (thus the
     address of the LDA opcode). A label can be explicitly defined by  assigning
     it the value of an expression, such as

	    label2 = $d000

     which defines label2 to be the address $d000, namely, the start of the VIC-
     II  register block on Commodore 64 computers. The program counter * is con-
     sidered to be a special kind of label, and can be assigned to  with  state-
     ments such as

	    * = $c000

     which  sets  the  program	counter  to decimal location 49152. If -XCA65 is
     specified, you can also use := as well as =.

     With the exception of the program counter, labels cannot be assigned multi-
     ple times. To explicitly declare redefinition of a label, place a -  (dash)
     before it, e.g.,

	    -label2 = $d020

     which  sets label2 to the Commodore 64 border colour register. The scope of
     a label is affected by the block it  resides  within  (see  PSEUDO-OPS  for
     block instructions). A label may also be hard-specified with the -L command
     line option.

     Redefining  a label does not change previously assembled code that used the
     earlier value. Therefore, because the program counter is a special type  of
     label,  changing the program counter to a lower value does not reorder code
     assembled previously and changing it to  a  higher  value	does  not  issue
     padding to put subsequent code at the new location. This is intentional be-
     haviour to facilitate generating relocatable and position-independent code,
     but  can differ from other assemblers which use this behaviour for linking.
     However, it is possible to use pseudo-ops to simulate other assemblers' be-
     haviour and use xa as a linker; see PSEUDO-OPS and LINKING.

     If -XCA65 or -a is specified, "unnamed" labels  may  be  specified  with  :
     (i.e.,  no  label, just a colon); branches may then reference these unnamed
     labels with a colon and plus signs for forward branching or minus signs for
     backward branching. For example (from the ca65(1) documentation),

	 :	 lda	 (ptr1),y	 ; #1
		 cmp	 (ptr2),y
		 bne	 :+		 ; -> #2
		 tax
		 beq	 :+++		 ; -> #4
		 iny
		 bne	 :-		 ; -> #1
		 inc	 ptr1+1
		 inc	 ptr2+1
		 bne	 :-		 ; -> #1

	 :	 bcs	 :+		 ; #2 -> #3
		 ldx	 #$FF
		 rts

	 :	 ldx	 #$01		 ; #3
	 :	 rts			 ; #4

     Additionally, in -XCA65 mode, "cheap" local labels may be used,  marked  by
     the  @ prefix. These temporary labels exist only between two regular labels
     and automatically go out of scope with the next regular label. This allows,
     with reasonable care, reuse of common label names like "loop."

     For those instructions where the accumulator is the implied argument  (such
     as asl and lsr; inc and dec on R65C02; etc.), the idiom of explicitly spec-
     ifying the accumulator with a is unnecessary as the proper form will be se-
     lected  if there is no explicit argument. In fact, for consistency with la-
     bel handling, if there is a label named a, this will actually generate code
     referencing that label as a memory location and not the accumulator. Other-
     wise, the assembler will complain.

     Labels and opcodes may take expressions as their arguments  to  allow  com-
     puted  values, and may themselves reference other labels and/or the program
     counter. An expression such as lab1+1 (which operates on the current  value
     of  label	lab1  and  increments it by one) may use the following operands,
     given from highest to lowest priority:

     *	     multiplication (priority 10)

     /	     integer division (priority 10)

     +	     addition (priority 9)

     -	     subtraction (9)

     <<      shift left (8)

     >>      shift right (8)

     >= =>   greater than or equal to (7)

     >	     greater than (7)

     <= =<   less than or equal to (7)

     <	     less than (7)

     =	     equal to (6); == also accepted

     <> ><   does not equal (6); != also accepted

     &	     bitwise AND (5)

     ^	     bitwise XOR (4)

     |	     bitwise OR (3)

     &&      logical AND (2)

     ||      logical OR (1)

     Parentheses are valid. When redefining a  label,  combining  arithmetic  or
     bitwise  operators  with  the  = (equals) operator such as += and so on are
     valid, e.g.,

	    -redeflabel += (label12/4)

     Normally, xa attempts to ascertain the value of the operand and  (when  re-
     ferring  to  a memory location) use zero page, 16-bit or (for 65816) 24-bit
     addressing where appropriate and where supported by the particular  opcode.
     This generates smaller and faster code, and is almost always preferable.

     Nevertheless, you can use these prefix operators to force a particular ren-
     dering  of the operand. Those that generate an eight bit result can also be
     used in 8-bit addressing modes, such as immediate and zero page.

     <	    low byte of expression, e.g., lda #<vector

     >	    high byte of expression

     !	    in situations where the expression could be understood as either  an
	    absolute  or  zero	page value, do not attempt to optimize to a zero
	    page argument for those opcodes that support it (i.e.,  keep  as  16
	    bit word)

     @	    render  as	24-bit	quantity for 65816, even if smaller than 24 bits
	    (must specify -w command-line option, must not specify -XCA65)

     `	    force further optimization, even if the length  of	the  instruction
	    cannot be reliably determined (see NOTES'N'BUGS)

     Expressions  can  occur  as arguments to opcodes or within the preprocessor
     (see PREPROCESSOR for syntax). For example,

	    lda label2+1

     takes the value at label2+1 (using our previous label's value,  this  would
     be $d021), and will be assembled as $ad $21 $d0 to disk. Similarly,

	    lda #<label2

     will  take  the lowest 8 bits of label2 (i.e., $20), and assign them to the
     accumulator (assembling the instruction as $a9 $20 to disk).

     Comments are specified with a semicolon (;), such as

	    ;this is a comment

     They can also be specified in the C language style,  using  /*  */  and  //
     which are understood at the PREPROCESSOR level (q.v.).

     Normally, the colon (:) separates statements, such as

	    label4 lda #0:sta $d020

     or

	    label2: lda #2

     (note  the use of a colon for specifying a label, similar to some other as-
     semblers, which xa also understands with or without the colon).  This  also
     applies to semicolon comments, such that

	    ; a comment:lda #0

     is  understood  as a comment followed by an opcode. To defeat this, use the
     -XMASM compatibility mode to allow colons within comments; this may  become
     the  default in a future version. Colon statement separation does not apply
     to /* */ and // comments, which are dealt with at	the  preprocessor  level
     (q.v.).

PSEUDO-OPS
     Pseudo-ops  are  false opcodes used by the assembler to denote meta- or in-
     lined commands.  Like most assemblers, xa has a rich set.

     .byt value1,value2,value3,...
	    Specifies a string of bytes to be directly placed into the assembled
	    object.  The arguments may be expressions. Any number of  bytes  can
	    be specified.

     .asc "text1" ,"text2",...
	    Specifies  a character string which will be inserted into the assem-
	    bled object. Strings are understood according to the currently spec-
	    ified character set; for example, if ASCII is specified,  they  will
	    be	rendered  as  ASCII,  and  if PETSCII is specified, they will be
	    translated into the equivalent  Commodore  ASCII  equivalent.  Other
	    non-standard  ASCIIs  such as ATASCII for Atari computers should use
	    the ASCII equivalent  characters;  graphic	and  control  characters
	    should  be specified explicitly using .byt for the precise character
	    you want. Note that when specifying the argument of an opcode,  .asc
	    is not necessary; the quoted character can simply be inserted (e.g.,
	    lda  #"A" ), and is also affected by the current character set.  Any
	    number of character strings can be specified.

     .byt and .asc are synonymous, so you can mix things such as .byt  $43,  22,
     "a  character string" and get the expected result. The string is subject to
     the current character set, but the remaining  bytes  are  inserted  without
     modification.

     .aasc "text1" ,"text2",...
	    Specifies  a  character string that is always rendered in true ASCII
	    regardless of the current character set. Like .asc, it is synonymous
	    with .byt.

     .word value1,value2,value3...
	    Specifies a string of 16-bit words to be placed into  the  assembled
	    object  in	6502 little-endian format (that is, low-byte/high-byte).
	    The arguments may be expressions. Any number of words can be  speci-
	    fied.

     .dsb length,fillbyte
	    Specifies  a  data	block; a total of length repetitions of fillbyte
	    will be inserted into the assembled object. For example, .dsb  5,$10
	    will  insert five bytes, each being 16 decimal, into the object. The
	    arguments may be expressions. If only a single argument is provided,
	    then the argument is treated as a number of null  bytes  to  insert.
	    See LINKING for how to use this pseudo-op to link multiple objects.

     .bin offset,length,"filename"
	    Inlines  a	binary	file without further interpretation specified by
	    filename from offset offset (relative to the beginning of the  file)
	    for  length  bytes.  This allows you to insert data such as a previ-
	    ously assembled object file or an image or other binary data  struc-
	    ture,  inlined  directly into this file's object. If length is zero,
	    then the length of filename, minus the offset, is used instead.  The
	    arguments  may  be	expressions.  See  LINKING  for  how to use this
	    pseudo-op to link multiple objects.

     .(     Opens a new block for scoping. Within a block,  all  labels  defined
	    are  local	to that block and any sub-blocks, and go out of scope as
	    soon as the enclosing block is closed (i.e., lexically scoped).  All
	    labels  defined outside of the block are still visible within it. To
	    explicitly declare a global label within a block, precede the  label
	    with  + or precede it with & to declare it within the previous level
	    only (or globally if you are only one level deep). Sixteen levels of
	    scoping are permitted.

	    .block is accepted as a synonym for .(, as well as	.proc  (but  you
	    cannot  specify  an  explicit  scope name as in ca65; only anonymous
	    blocks are supported).

     .)     Closes a block.  .bend or .endproc are accepted as synonyms.

     .as .al .xs .xl
	    Only relevant in 65816 mode (with the -w  option  specified).  These
	    pseudo-ops set what size accumulator and X/Y-register should be used
	    for  future instructions; .as and .xs set 8-bit operands for the ac-
	    cumulator and index registers, respectively, and  .al  and	.xl  set
	    16-bit  operands.  These  pseudo-ops on purpose do not automatically
	    issue sep and rep instructions to set the  specified  width  in  the
	    CPU;  set the processor bits as you need, or consider constructing a
	    macro.  .al and .xl generate errors if -w is not specified.

     .assert expression,"message"
	    Evaluates expression and if it is false (i.e., evaluates  to  zero),
	    prints  message  as a fatal error, terminating assembly immediately.
	    For example, a block of assembly code that creates	high  ROM  might
	    have

	    .assert *<$fffa, "hit vectors"

	    to	ensure that assembled code does not leak into the 6502 high vec-
	    tors. If the preceding code is  too  long,	the  assertion	will  be
	    false,  and  the condition will be detected in a controlled fashion.
	    Any operation may be used as part of the expression, including logi-
	    cal comparisons such as =, ==, <, <=, >, >=, != and <>.

     .include filename
	    Includes another file in place of the  pseudo-op,  as  if  the  pre-
	    processor had done so with an #include directive (see PREPROCESSOR),
	    but at the assembler phase after preprocessing has already occurred.

     The following pseudo-op applies to listing mode.

     .listbytes number
	    In	the  listing  output, sets the maximum number of hex bytes to be
	    printed in the listing for pseudo-ops like .byt, by default  8.  The
	    special  argument  unlimited sets no upper limit. If listing mode is
	    disabled, this pseudo-op has no observable effect.

     The following pseudo-ops apply primarily to relocatable  .o65  objects.   A
     full  discussion of the relocatable format is beyond the scope of this man-
     page; see http://www.6502.org/users/andre/o65/ for the most current  speci-
     fication.

     .text .data .bss .zero
	    These  pseudo-ops switch between the different segments, .text being
	    the actual code section, .data being the data  segment,  .bss  being
	    uninitialized  label space for allocation and .zero being uninitial-
	    ized zero page space for allocation. In .bss and .zero, only  labels
	    are evaluated. These pseudo-ops are valid in relocating and absolute
	    modes.

     .code  For ca65 compatibility, this is currently mapped to .text.

     .zeropage
	    For ca65 compatibility, this is currently mapped to .zero.

     .align value
	    Aligns the current segment to a byte boundary (2, 4 or 256) as spec-
	    ified  by value (and places it in the header when relocating mode is
	    enabled). Other values generate an error.

     .fopt type, value1, value2, value3, ...
	    Acts like .byt/.asc except that the values are embedded into the ob-
	    ject file as file options.	The argument type is used to specify the
	    file option being referenced. A table of these options is in the re-
	    locatable o65 file format description. The remainder of the  options
	    are  interpreted  as  values  to insert. Any number of values may be
	    specified, and may also be strings.

     .import label1, label2, label3, ...
	    Defines the given labels as global labels which are imported and re-
	    solved during the link stage, like the -L command line parameter.

     .importzp label1, label2, label3, ...
	    Analogous to .import, except that it only  imports	zeropage  labels
	    (i.e., byte values).

PREPROCESSOR
     xa  implements  a	preprocessor very similar to that of the C-language pre-
     processor cpp(1) and many oddiments apply to both. For example,  as  in  C,
     the use of /* */ for comment delimiters is also supported in xa, and so are
     comments using the double slash //.  The preprocessor also supports contin-
     uation  lines,  i.e., lines ending with a backslash (\); the following line
     is then appended to it as if there were no dividing newline.  This  too  is
     handled at the preprocessor level.

     For reasons of memory and complexity, the full breadth of the cpp(1) syntax
     is  not  fully  supported. In particular, macro definitions may not be for-
     ward-defined (i.e., a macro definition can only reference a previously  de-
     fined macro definition), except for macro functions, where recursive evalu-
     ation  is supported; e.g., to #define WW AA , AA must have already been de-
     fined. Certain other directives are not supported, nor  are  most	standard
     pre-defined  macros,  and	there  are  other  limits on evaluation and line
     length. Because the maintainers of xa recognize that some	files  will  re-
     quire  more  complicated preparsing than the built-in preprocessor can sup-
     ply, the preprocessor will accept cpp(1)-style line/filename/flags  output.
     When  these  lines  are  seen  in	the input file, xa will treat them as cc
     would, except that flags are ignored.  xa does not accept files on standard
     input for parsing reasons, so you should dump your cpp(1) output to an  in-
     termediate temporary file, such as

	    cc -E test.s > test.xa
	    xa test.xa

     No special arguments need to be passed to xa; the presence of cpp(1) output
     is detected automatically.

     Note that passing your file through cpp(1) may interfere with xa's own pre-
     processor directives. In this case, to mask directives from cpp(1), use the
     -p  option  to  specify  an alternative character instead of #, such as the
     tilde (e.g., -p'~' ). With this option and argument specified, then instead
     of #include, for example, you can also use ~include, in  addition	to  #in-
     clude  (which  will also still be accepted by the xa preprocessor, assuming
     any survive cpp(1)).  Any character can be used,  although  frankly  patho-
     logic  choices may lead to amusing and frustrating glitches during parsing.
     You can also use this option to defer preprocessor directives  that  cpp(1)
     may  interpret too early until the file actually gets to xa itself for pro-
     cessing.

     The following predefined macros are supported, except if -XXA23  is  speci-
     fied:

     XA_MAJOR
	    The current major version of xa.

     XA_MINOR
	    The current minor version of xa.

     The following preprocessor directives are supported:

     #include "filename"
	    Inserts  the contents of file filename at this position. If the file
	    is not found, it is searched using paths specified by the -I command
	    line option or the environment variable  XAINPUT  (q.v.).  When  in-
	    serted, the file will also be parsed for preprocessor directives.

     #echo comment
	    Inserts  comment  comment into the errorlog file, specified with the
	    -e command line option.

     #print expression
	    Computes the value of expression expression and prints it  into  the
	    errorlog file.

     #error message
	    Displays the message as an error and terminates assembly.

     #define DEFINE text
	    Equates  macro  DEFINE  with text text such that wherever DEFINE ap-
	    pears in the assembly source, text is substituted in its place (just
	    like cpp(1) would do). In addition, #define can specify macro  func-
	    tions  like  cpp(1)  such  that  a	directive like #define mult(a,b)
	    ((a)*(b)) would generate the expected result wherever an  expression
	    of the form mult(a,b) appears in the source. This can also be speci-
	    fied  on  the  command  line  with the -D option. The arguments of a
	    macro function may be recursively evaluated, unlike other  #defines;
	    the  preprocessor will attempt to re-evaluate any argument refencing
	    another preprocessor definition up to ten times before complaining.

     The following directives are conditionals. If the conditional is not satis-
     fied, then the source code between the directive and its terminating #endif
     are expunged and not assembled. Up to fifteen levels of  nesting  are  sup-
     ported.

     #ifdef DEFINE
	    True only if macro DEFINE is defined.

     #ifndef DEFINE
	    The  opposite; true only if macro DEFINE has not been previously de-
	    fined.

     #if expression
	    True if expression expression evaluates to non-zero.  expression may
	    reference other macros.

     #iflused label
	    True if label label has been used (but not necessarily  instantiated
	    with a value).  This works on labels, not macros!

     #ifldef label
	    True  if  label  label  is	defined and assigned with a value.  This
	    works on labels, not macros!

     #else  Implements alternate path for a conditional block.

     #endif
	    Closes a conditional block.

     Unclosed conditional blocks at the end of included files generate warnings;
     unclosed conditional blocks at the end of assembly generate an error.

     #iflused and #ifldef are useful for building up a library based on  labels.
     For example, you might use something like this in your library's code:

	    #iflused label
	    #ifldef label
	    #echo  label  already  defined, library function label cannot be in-
	    serted
	    #else
	    label /* your code */
	    #endif
	    #endif

LINKING
     xa is oriented towards generating sequential  binaries.  Code  is	strictly
     emitted  in  order  even  if the program counter is set to a lower location
     than previously assembled code, and padding is not automatically emitted if
     the program counter is set to a higher location. Changing the program loca-
     tion only changes new labels for code that is subsequently emitted;  previ-
     ous  emitted  code  remains  unchanged.  Fortunately, for many object files
     these conventions have no effect on their generation.

     However, some applications may require generating an object file built from
     several previously generated components, and/or submodules which  may  need
     to  be  present  at specific memory locations. With a minor amount of addi-
     tional specification, it is possible to use xa for this purpose as well.

     The first means of doing so uses the o65 format to make relocatable objects
     that in turn can be linked by ldo65(1) (q.v.).

     The second means involves either assembled code, or insertion of previously
     built object or data files with .bin, using .dsb pseudo-ops  with	computed
     expression  arguments  to insert any necessary padding between them, in the
     sequential order they are to reside in memory. Consider this example:

	 .word $1000
	 * = $1000

	 ; this is your code at $1000
     part1	 rts
	 ; this label marks the end of code
     endofpart1

	 ; DON'T PUT A NEW .word HERE!
	 * = $2000
	 .dsb (*-endofpart1), 0
	 ; yes, set it again
	 * = $2000

	 ; this is your code at $2000
     part2	 rts

     This example, written for Commodore microcomputers using a 16-bit	starting
     address,  has two "modules" in it: one block of code at $1000 (4096), indi-
     cated by the code between labels part1 and endofpart1, and a  second  block
     at $2000 (8192) starting at label part2.

     The padding is computed by the .dsb pseudo-op between the two modules. Note
     that  the program counter is set to the new address and then a computed ex-
     pression inserts the proper number of fill bytes from the end of the assem-
     bled code in part 1 up to the new program counter address. Since  this  it-
     self  advances the program counter, the program counter is reset again, and
     assembly continues.

     When the object this source file generates is loaded, there will be an  rts
     instruction  at  address  4096 and another at address 8192, with null bytes
     between them.

     Should one of these areas need to contain a pre-built file, instead of  as-
     sembly  code,  simply use a .bin pseudo-op to load whatever portions of the
     file are required into the output. The computation of addresses and  number
     of necessary fill bytes is done in the same fashion.

     Although  this  example used the program counter itself to compute the dif-
     ference between addresses, you can use any label for this purpose,  keeping
     in  mind  that only the program counter determines where relative addresses
     within assembled code are resolved.

ENVIRONMENT
     xa utilises the following environment variables, if they exist:

     XAINPUT
	    Include file path; components should be separated by `,'.

     XAOUTPUT
	    Output file path.

NOTES'N'BUGS
     The R65C02 instructions ina (often rendered inc a) and dea (dec a) must  be
     rendered as bare inc and dec instructions respectively.

     The  65816  instructions mvn and mvp use two eight bit parameters, the only
     instructions in the entire instruction set to do so. Older versions  of  xa
     took  a  single  16-bit  absolute value. As of 2.4.0, this old syntax is no
     longer accepted.

     Forward-defined labels -- that is, labels that are defined after  the  cur-
     rent  instruction	is  processed  -- cannot be optimized into zero page in-
     structions even if the label does end up being defined as a zero page loca-
     tion, because the assembler does not know the value of the label in advance
     during the first pass when the length of an instruction is computed. On the
     second pass, a warning will be issued when an instruction that  could  have
     been  optimized can't be because of this limitation.  (Obviously, this does
     not apply to branching or jumping instructions because they're not optimiz-
     able anyhow, and those instructions that can only take an	8-bit  parameter
     will always be casted to an 8-bit quantity.)  If the label cannot otherwise
     be  defined  ahead of the instruction, the backtick prefix ` may be used to
     force further optimization no matter where the label is defined as long  as
     the  instruction  supports  it.   Indiscriminately forcing the issue can be
     fraught with peril, however, and is not recommended;  to  discourage  this,
     the  assembler  will  complain  about its use in addressing mode situations
     where no ambiguity exists, such as indirect indexed, branching and so on.

SEE ALSO
     file65(1), ldo65(1), reloc65(1), uncpk(1), dxa(1)

AUTHOR
     This manual page was written by  David  Weinehall	<tao@acc.umu.se>,  Andre
     Fachat <fachat@web.de> and Cameron Kaiser <ckaiser@floodgap.com>.	Original
     xa package (C)1989-1997 Andre Fachat. Additional changes (C)1989-2024 Andre
     Fachat, Jolse Maginnis, David Weinehall, Cameron Kaiser. The official main-
     tainer is Cameron Kaiser.

OVER 30 YEARS OF XA
     Yay us?

WEBSITE
     http://www.floodgap.com/retrotech/xa/

				  5 March 2024				   XA(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=xa&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help