148 lines
4.6 KiB
Groff
148 lines
4.6 KiB
Groff
|
.\" $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
|