@c Copyright (C) 2018 Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@ifset GENERIC
@page
@node S12Z-Dependent
@chapter S12Z Dependent Features
@end ifset
@ifclear GENERIC
@node Machine Dependencies
@chapter S12Z Dependent Features
@end ifclear

The Freescale S12Z version of @code{@value{AS}} has a few machine
dependent features.

@cindex S12Z support
@menu
* S12Z-Opts::                   S12Z Options
* S12Z-Syntax::                 Syntax
* S12Z-Directives::             Assembler Directives
* S12Z-opcodes::                Opcodes
@end menu

@node S12Z-Opts
@section S12Z Options

@cindex options, S12Z
@cindex S12Z options

@node S12Z-Syntax
@section Syntax

@cindex S12Z syntax
@cindex syntax, S12Z

In the S12Z syntax, the instruction name comes first and it may
be followed by one or by several operands.
In most cases the maximum number of operands is three.
Some instructions accept and (in certain situations require) a suffix
indicating the size of the operand.
The suffix is separated from the instruction name by a period (@samp{.})
and may be one of @samp{b}, @samp{w}, @samp{p} or @samp{l} indicating
`byte' (a single byte), `word' (2 bytes), `pointer' (3 bytes) or `long' (4 bytes)
respectively.
Operands are separated by a comma (@samp{,}).
A comma however does not act as a separator if it appears within parentheses
(@samp{()}) or within square brackets (@samp{[]}).
@code{@value{AS}} will complain if too many, too few or inappropriate operands
are specified for a given instruction.
The MRI mode is not supported for this architecture.
Example:

@smallexample
	bset.b  0xA98, #5
	mov.b   #6, 0x2409
	ld      d0, #4
	mov.l   (d0, x), 0x2409
	inc     d0
	cmp     d0, #12
	blt     *-4
	lea     x, 0x2409
	st      y,  (1, x)
@end smallexample

@cindex line comment character, S12Z
@cindex S12Z line comment character
The presence of a @samp{;} character anywhere
on a line indicates the start of a comment that extends to the end of
that line.

A @samp{*} or a @samp{#} character at the start of a line also
introduces a line comment, but these characters do not work elsewhere
on the line.  If the first character of the line is a @samp{#} then as
well as starting a comment, the line could also be logical line number
directive (@pxref{Comments}) or a preprocessor control command
(@pxref{Preprocessing}).

@cindex line separator, S12Z
@cindex statement separator, S12Z
@cindex S12Z line separator
The S12Z assembler does not currently support a line separator
character.

@cindex S12Z addressing modes
@cindex addressing modes, S12Z
The following addressing modes are understood for the S12Z.
@table @dfn
@item Immediate
@samp{#@var{number}}

@item Immediate Bit Field
@samp{#@var{width}:@var{offset}}

Bit field instructions in the immediate mode require the width and offset to
be specified.
The @var{width} pararmeter specifies the number of bits in the field.
It should be a number in the range [1,32].
@var{Offset} determines the position within the field where the operation
should start.
It should be a number in the range [0,31].

@item Relative
@samp{*@var{symbol}}, or @samp{*[+-]@var{digits}}

Program counter relative addresses have a width of 15 bits.
Thus, they must be within the range [-32768, 32767].

@item Register
@samp{@var{reg}}

Some instructions accept a register as an operand.
In general, @var{reg} may be a data register (@samp{D0}, @samp{D1} @dots{}
@samp{D7}), the @var{X} register or the @var{Y} register.

A few instructions accept as an argument the stack pointer
register (@samp{S}), and/or the program counter (@samp{P}).

Some very special instructions accept arguments which refer to the
condition code register.  For these arguments the  syntax is
@samp{CCR}, @samp{CCH} or @samp{CCL} which refer to the complete condition code register, the condition code register high byte and the condition code register low byte respectively.

@item Absolute Direct
@samp{@var{symbol}}, or @samp{@var{digits}}

@item Absolute Indirect
@samp{[@var{symbol}}, or @samp{@var{digits}]}


@item Constant Offset Indexed
@samp{(@var{number},@var{reg})}

@var{Reg} may be either @samp{X}, @samp{Y}, @samp{S} or
@samp{P} or one of the data registers @samp{D0}, @samp{D1} @dots{}
@samp{D7}.
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then the
register value is treated as a signed value.
Otherwise it is treated as unsigned.
@var{Number} may be any integer in the range [-8388608,8388607].

@item Offset Indexed Indirect
@samp{[@var{number},@var{reg}]}

@var{Reg} may be either @samp{X}, @samp{Y}, @samp{S} or
@samp{P}.
@var{Number} may be any integer in the range [-8388608,8388607].

@item Auto Pre-Increment/Pre-Decrement/Post-Increment/Post-Decrement
@samp{-@var{reg}},
@samp{+@var{reg}},
@samp{@var{reg}-} or
@samp{@var{reg}+}

This addressing mode is typically used to access a value at an address,
and simultaneously to increment/decrement the register pointing to that
address.
Thus @var{reg} may be any of the 24 bit registers @samp{X}, @samp{Y}, or
@samp{S}.
Pre-increment and post-decrement are not available for
register @samp{S} (only post-increment and pre-decrement are available).

@item Register Offset Direct
@samp{(@var{data-reg},@var{reg})}

@var{Reg} can be either @samp{X}, @samp{Y}, or @samp{S}.
@var{Data-reg}
must be one of the data registers @samp{D0}, @samp{D1} @dots{} @samp{D7}.
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then
the register value is treated as a signed value.
Otherwise it is treated as unsigned.

@item Register Offset Indirect
@samp{[@var{data-reg},@var{reg}]}

@var{Reg} can be either @samp{X} or @samp{Y}.
@var{Data-reg}
must be one of the data registers @samp{D0}, @samp{D1} @dots{} @samp{D7}.
If any of the registers @samp{D2} @dots{} @samp{D5} are specified, then
the register value is treated as a signed value.
Otherwise it is treated as unsigned.


@end table

For example:

@smallexample
	trap    #197
	bra     *+49
	bra     .L0
	jmp     0xFE0034
	jmp     [0xFD0012]
	inc.b   (4,x)
	dec.w   [4,y]
	clr.p   (-s)
	neg.l   (d0, s)
	com.b   [d1, x]
	jsr     (45, d0)
	psh     cch
@end smallexample

@node S12Z-Directives
@section Assembler Directives

@cindex assembler directives, S12Z

@node S12Z-opcodes
@section Opcodes

@cindex S12Z opcodes
@cindex opcodes, S12Z
@cindex instruction set, S12Z
