.\" $Header$
.TH 6809_AS 1
.ad
.SH NAME
6809_as \- assembler for 6809
.SH SYNOPSIS
/usr/em/lib/6809_as [options] argument ...
.SH DESCRIPTION
This assembler is made with the general framework
described in \fIuni_ass\fP(6).
.SH SYNTAX
.IP registers
The 6809 contains four 8-bit registers registers:
two accumulators (a and b),
a direct page register (dp),
and a condition code register (cc),
and five 16-bit registers:
two index registers (x and y),
a user an a hardware stack pointer (u resp. s),
and a program counter (pc).
The index registers and the stack pointers are indexable.
Accumulators a and b can be concatenated to form
the double accumulator d,
of which a is the high and b is the low byte.
An instruction that refers to accumulator a
has an "a" as last character.
In the same way a "b" means that the instruction
uses b as accumulator.
.IP "pseudo instructions"
The 6809 assembler recognizes one additional instruction
that is not translated into a machine instruction: setdp.
It expects an expression as argument.
This is used for efficient address encoding of some addressing
mode (see below).
.IP "addressing modes"
.nf
.ta 8 16 24 32 40 48
syntax		meaning (name)

reg		The operand of the instruction is in `reg'.

reglist		`reglist' is a either list of registers, seperated
		by ','s, or the word "all". It encodes in a register
		save mask, where "all" means all registers, that can
		be used by the push-pull instructions pshs, pshu,
		puls, and pulu.

<expr		The one-byte value of `expr' is an address within
		a 256-byte page. The particular page in use is
		indicated by the contents of dp, so `expr' is the
		low byte of the effective address of the operand,
		and dp the high byte. (direct)

>expr		The two-byte value of `expr' is the exact memory
		address. Not that this mode always requires one
		byte more than "<expr". (extended)

expr		The value of `expr' is an address.
		Except for long branches, this value is examined
		first to see if a short encoding is possible.
		When the instruction is a short branch, the value
		is checked to see if the address is not too remote,
		because in that case this branch is automatically
		replaced by a long branch. When the instruction is
		not a branch, the high byte of the value is compared
		with the value of the argument of the last setdp
		pseudo.  If they are equal, this mode is replaced by
		"<expr", else by ">expr".
		(relative for branch-instructions)

#expr		The value of `expr' is one- or two-byte immediate
		data. (immediate)

(expr)		The value of `expr' is a pointer to the address
		of the operand. (indirect)

expr, reg	The value of `expr' added to the contents of `reg'
		(which must be a 16-bit register) yields the
		effective address of the operand.
		(constant-offset indexed)

, ireg		The contents of `ireg' (which must be indexable)
		yields the effective address of the operand.
		(constant-offset indexed)

(expr, reg)	The value of `expr' added to the contents of `reg'
		(which must be a 16-bit register) yields a pointer
		to the effective address of the operand.
		(constant-offset indexed indirect)

(, ireg)	The contents of `ireg' (which must be indexable)
		yields a pointer to the effective address of the
		operand. (constant-offset indexed indirect)

ac, ireg	The contents of `ac' (which must be an accumulator)
		added to the contents of `ireg' (which must be
		indexable) yields the effective address of the
		operand. (accumulator indexed)

(ac, ireg)	The contents of `ac' (which must be an accumulator)
		added to the contents of `ireg' (which must be
		indexable) yields a pointer to the effective address
		of the operand. (accumulator indexed indirect)

,ireg+
,ireg++		The contents of `ireg' (which must be indexable) is
		used as effective address of the operand. After that
		it is incremented by 1 (+) or 2 (++).
		(auto-increment)

(,ireg++)	The contents of `ireg' (which must be indexable) is
		used as a pointer to the effective address of the
		operand. After that it is incremented by 2.
		(auto-increment indirect)

,-ireg
,--ireg		`ireg' (which must be indexable) is decremented
		by 1 (-) or 2 (--). After that, its contents is used
		as effective address of the operand.
		(auto-decrement)

(,--ireg)	`ireg (which must be indexable) is decremented by 2.
		After that, its contents is used as a pointer to the
		effective address of the operand.
		(auto-decrement indirect)

.fi
.SH "SEE ALSO"
uni_ass(6),
ack(1),
.br
MC6809 preliminary programming manual, Motorola Inc., First Edition, 1979
.SH EXAMPLE
An example of 6809 assembly code.
.nf
.ta 8 16 24 32 40 48
	contby = 80

	compgo:	lda	#contby
		ldx	#table - 2	!start of table

		clrb
	co1:	addb	#2
		lsra
		bcc	co1
		jmp	(b, x)		!accumulator offset indirect
.fi