@c Copyright (C) 2010-2021 Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.

@node XSTORMY16-Dependent
@chapter XStormy16 Dependent Features

@cindex XStormy16 support
@menu
* XStormy16 Syntax::               Syntax
* XStormy16 Directives::           Machine Directives
* XStormy16 Opcodes::              Pseudo-Opcodes
@end menu

@node XStormy16 Syntax
@section Syntax
@menu
* XStormy16-Chars::                Special Characters
@end menu

@node XStormy16-Chars
@subsection Special Characters

@cindex line comment character, XStormy16
@cindex XStormy16 line comment character
@samp{#} is the line comment character.  If a @samp{#} appears as the
first character of a line, the whole line is treated as a comment, but
in this case the line can also be a logical line number directive
(@pxref{Comments}) or a preprocessor control command
(@pxref{Preprocessing}).

@cindex comment character, XStormy16
@cindex XStormy16 comment character
A semicolon (@samp{;}) can be used to start a comment that extends
from wherever the character appears on the line up to the end of the
line.

@cindex line separator, XStormy16
@cindex statement separator, XStormy16
@cindex XStormy16 line separator

The @samp{|} character can be used to separate statements on the same
line.


@node XStormy16 Directives
@section XStormy16 Machine Directives

@cindex machine directives, XStormy16
@cindex XStormy16 machine directives
@table @code

@cindex @code{16bit_pointers} directive, XStormy16
@item .16bit_pointers
Like the @option{--16bit-pointers} command-line option this directive
indicates that the assembly code makes use of 16-bit pointers.

@cindex @code{32bit_pointers} directive, XStormy16
@item .32bit_pointers
Like the @option{--32bit-pointers} command-line option this directive
indicates that the assembly code makes use of 32-bit pointers.

@cindex @code{.no_pointers} directive, XStormy16
@item .no_pointers
Like the @option{--no-pointers} command-line option this directive
indicates that the assembly code does not makes use pointers.

@end table

@node XStormy16 Opcodes
@section XStormy16 Pseudo-Opcodes

@cindex XStormy16 pseudo-opcodes
@cindex pseudo-opcodes for XStormy16
@code{@value{AS}} implements all the standard XStormy16 opcodes.

@code{@value{AS}} also implements the following pseudo ops:

@table @code

@cindex @code{@@lo} pseudo-op, XStormy16
@item @@lo()
Computes the lower 16 bits of the given expression and stores it into
the immediate operand field of the given instruction.  For example:

    @samp{add r6, @@lo(here - there)}

computes the difference between the address of labels 'here' and
'there', takes the lower 16 bits of this difference and adds it to
register 6.

@cindex @code{@@hi} pseudo-op, XStormy16
@item @@hi()
Computes the higher 16 bits of the given expression and stores it into
the immediate operand field of the given instruction.  For example:

    @samp{addc r7, @@hi(here - there)}

computes the difference between the address of labels 'here' and
'there', takes the upper 16 bits of this difference, shifts it down 16
bits and then adds it, along with the carry bit, to the value in
register 7.

@end table
