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
       series (such as the 6502, 65C02,	6504, 6507, 6510, 7501,	8500, 8501 and
       8502),  the  Rockwell R65C02, and the 16-bit 65816 processor. For a de-
       scription 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 file-
	      name - to	output to standard output.

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

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

       -e filename
	      Set errorlog filename; default is	none.

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

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

       -Xcompatset
	      Enables  compatibility settings to become	more (not fully!) com-
	      patible 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  com-
	      patibility  with	the previous version of	xa.  Multiple compati-
	      bility sets may be specified and combined, e.g., -XMASM -XXA23.

	      -XMASM allows colons to appear in	comments for MASM  compatibil-
	      ity.   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
	      support  for unnamed labels and "cheap" local labels using the @
	      character, but disables its other	meaning	for 24-bit  mode  (see
	      ASSEMBLER	SYNTAX).

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

	      -XXA23 restores partial compatibility with xa 2.3.x. In particu-
	      lar, it uses ^ for generating control characters,	 disables  es-
	      caped  characters	with \,	allows nested multi-line comments, and
	      disables all predefined xa preprocessor  macros.	Although  some
	      portions	of this	option remain supported	syntax,	the option it-
	      self is inherently deprecated 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
	      remainder	 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  ver-
	      sion;  use  -XMASM  instead. Allows colons to appear in comments
	      for MASM compatibility. This does	not affect  colon  interpreta-
	      tion 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	becom-
	      ing 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
	      linking.

       -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  PREPROCES-
	      SOR).

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

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

       -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
       beyond  the scope of this manual	page. We invite	you to investigate any
       number of the excellent books on	the subject; one useful	title is  "Ma-
       chine Language For Beginners" by	Richard	Mansfield (COMPUTE!), covering
       the  Atari,  Commodore and Apple	8-bit systems, and is widely available
       on the used market.

       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
       intentionally not supported, and	should be entered manually  using  the
       .byte  pseudo-op	(see PSEUDO-OPS).  Due to conflicts between the	R65C02
       and 65816 instruction 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
       expressed 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
       program text (example:  "A"  inserts  the  byte	"A"  into  the	output
       stream);	 see also the PSEUDO-OPS section. This is affected by the cur-
       rently 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 considered to	be a special kind of label, and	 can  be  assigned  to
       with statements 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
       multiple	 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 behaviour	to facilitate generating relocatable and posi-
       tion-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'	 behaviour 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 un-
       named labels with a colon and plus signs	for forward branching or minus
       signs for backward branching. For example (from the ca65(1)  documenta-
       tion),

	   :	   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  ex-
       plicitly	specifying the accumulator with	a is unnecessary as the	proper
       form  will  be  selected	if there is no explicit	argument. In fact, for
       consistency with	label handling,	if there is a label named a, this will
       actually	generate code referencing that label as	a memory location  and
       not the accumulator. Otherwise, the assembler will complain.

       Labels  and  opcodes  may  take expressions as their arguments to allow
       computed	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  fol-
       lowing 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
       referring to a memory location) use zero	page, 16-bit  or  (for	65816)
       24-bit addressing where appropriate and where supported by the particu-
       lar  opcode.  This generates smaller and	faster code, and is almost al-
       ways preferable.

       Nevertheless, you can use these prefix operators	to force a  particular
       rendering  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  instruc-
	      tion cannot be reliably determined (see NOTES'N'BUGS)

       Expressions  can	occur as arguments to opcodes or within	the preproces-
       sor (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. Simi-
       larly,

	      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
       assemblers,  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 pre-
       processor level (q.v.).

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

       .byt value1,value2,value3,...
	      Specifies	 a  string of bytes to be directly placed into the as-
	      sembled 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 as-
	      sembled object. Strings are understood  according	 to  the  cur-
	      rently  specified	character set; for example, if ASCII is	speci-
	      fied, they will be rendered as ASCII, and	if PETSCII  is	speci-
	      fied,  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  in-
       serted 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	assem-
	      bled  object  in	6502  little-endian  format  (that  is,	  low-
	      byte/high-byte). The arguments may be expressions. Any number of
	      words can	be specified.

       .dsb length,fillbyte
	      Specifies	 a  data block;	a total	of length repetitions of fill-
	      byte 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	previously assembled object file or an image or	 other	binary
	      data  structure,	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  de-
	      fined  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 visi-
	      ble  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	accumulator 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 im-
	      mediately.  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
	      vectors. 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	 logical  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 PREPROCES-
	      SOR), 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 list-
	      ing 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
       manpage;	 see http://www.6502.org/users/andre/o65/ for the most current
       specification.

       .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  uninitialized 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
	      specified	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
	      object file as file options.  The	argument type is used to spec-
	      ify  the	file option being referenced. A	table of these options
	      is in the	relocatable 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
	      resolved during the link stage, like the -L command line parame-
	      ter.

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

PREPROCESSOR
       xa implements a preprocessor very similar to  that  of  the  C-language
       preprocessor  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	continuation 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  forward-defined (i.e., a macro definition can only reference	a pre-
       viously defined macro definition), except for  macro  functions,	 where
       recursive  evaluation  is  supported;  e.g., to #define WW AA , AA must
       have already been defined. 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  require  more  complicated	 preparsing  than  the
       built-in	  preprocessor	 can  supply,  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  rea-
       sons,  so  you should dump your cpp(1) output to	an intermediate	tempo-
       rary 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
       preprocessor 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	speci-
       fied, then instead of #include, for example, you	can also use ~include,
       in  addition  to	 #include (which will also still be accepted by	the xa
       preprocessor, assuming any survive cpp(1)).  Any	character can be used,
       although	frankly	pathologic choices may lead to amusing and frustrating
       glitches	during parsing.	 You can also use this option  to  defer  pre-
       processor directives that cpp(1)	may interpret too early	until the file
       actually	gets to	xa itself for processing.

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

       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  inserted,	the  file will also be parsed for pre-
	      processor	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
	      appears in the assembly source, text is substituted in its place
	      (just  like  cpp(1)  would do). In addition, #define can specify
	      macro functions 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  specified 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-eval-
	      uate  any	 argument refencing another preprocessor definition up
	      to ten times before complaining.

       The following directives	are conditionals. If the  conditional  is  not
       satisfied, then the source code between the directive and its terminat-
       ing  #endif  are	 expunged  and	not assembled. Up to fifteen levels of
       nesting are supported.

       #ifdef DEFINE
	      True only	if macro DEFINE	is defined.

       #ifndef DEFINE
	      The opposite; true only if macro DEFINE has not been  previously
	      defined.

       #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 instanti-
	      ated 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 warn-
       ings; unclosed conditional blocks at the	end of	assembly  generate  an
       error.

       #iflused	 and #ifldef are useful	for building up	a library based	on la-
       bels. 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
	      inserted
	      #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	 emit-
       ted  if	the  program counter is	set to a higher	location. Changing the
       program location	only changes new labels	for code that is  subsequently
       emitted;	previous 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 additional 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 ob-
       jects that in turn can be linked	by ldo65(1) (q.v.).

       The second means	involves either	assembled code,	or insertion of	previ-
       ously  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), indicated 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 com-
       puted expression	inserts	the proper number of fill bytes	from  the  end
       of  the assembled code in part 1	up to the new program counter address.
       Since this itself 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
       assembly	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
       difference  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 ver-
       sions 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
       current instruction is processed	-- cannot be optimized into zero  page
       instructions even if the	label does end up being	defined	as a zero page
       location, because the assembler does not	know the value of the label in
       advance during the first	pass when the length of	an instruction is com-
       puted. 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 optimizable anyhow, and those instructions that can
       only  take  an  8-bit parameter will always be casted to	an 8-bit quan-
       tity.)  If the label cannot otherwise be	defined	ahead of the  instruc-
       tion,  the  backtick prefix ` may be used to force further optimization
       no matter where the label is defined as long as	the  instruction  sup-
       ports  it.   Indiscriminately  forcing  the  issue  can be fraught with
       peril, however, and is not recommended; to discourage this, the	assem-
       bler 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 maintainer 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.0>

home | help