\input texinfo               @c             -*- Texinfo -*-
@setfilename gasp.info
@c
@c This file documents the assembly preprocessor "GASP"
@c
@c Copyright 1994, 1995, 2000 Free Software Foundation, Inc.
@c
@c    Permission is granted to copy, distribute and/or modify this document
@c    under the terms of the GNU Free Documentation License, Version 1.1
@c    or any later version published by the Free Software Foundation;
@c    with no Invariant Sections, with no Front-Cover Texts, and with no
@c    Back-Cover Texts.  A copy of the license is included in the
@c    section entitled "GNU Free Documentation License".

@ifinfo
@format
START-INFO-DIR-ENTRY
* gasp: (gasp).                     The GNU Assembler Preprocessor
END-INFO-DIR-ENTRY
@end format
@end ifinfo

@syncodeindex ky cp
@syncodeindex fn cp

@finalout
@setchapternewpage odd
@settitle GASP
@titlepage
@c FIXME boring title
@title GASP, an assembly preprocessor
@subtitle for GASP version 1
@sp 1
@subtitle March 1994
@author Roland Pesch
@page

@tex
{\parskip=0pt \hfill Cygnus Support\par
}
@end tex

@vskip 0pt plus 1filll
Copyright @copyright{} 1994, 1995, 2000 Free Software Foundation, Inc.

      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.1
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, with no Front-Cover Texts, and with no
      Back-Cover Texts.  A copy of the license is included in the
      section entitled "GNU Free Documentation License".

@end titlepage

@ifinfo
Copyright @copyright{} 1994, 1995, 2000 Free Software Foundation, Inc.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries a copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).
@end ignore

      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.1
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, with no Front-Cover Texts, and with no
      Back-Cover Texts.  A copy of the license is included in the
      section entitled "GNU Free Documentation License".


@node Top
@top GASP

GASP is a preprocessor for assembly programs.

This file describes version 1 of GASP.

Steve Chamberlain wrote GASP; Roland Pesch wrote this manual.

@menu
* Overview::                    What is GASP?
* Invoking GASP::               Command line options.
* Commands::                    Preprocessor commands.
* GNU Free Documentation License::  GNU Free Documentation License
* Index::                       Index.
@end menu
@end ifinfo

@node Overview
@chapter What is GASP?

The primary purpose of the @sc{gnu} assembler is to assemble the output of
other programs---notably compilers.  When you have to hand-code
specialized routines in assembly, that means the @sc{gnu} assembler is
an unfriendly processor: it has no directives for macros, conditionals,
or many other conveniences that you might expect.

In some cases you can simply use the C preprocessor, or a generalized
preprocessor like @sc{m4}; but this can be awkward, since none of these
things are designed with assembly in mind.

@sc{gasp} fills this need.  It is expressly designed to provide the
facilities you need with hand-coded assembly code.  Implementing it as a
preprocessor, rather than part of the assembler, allows the maximum
flexibility: you can use it with hand-coded assembly, without paying a
penalty of added complexity in the assembler you use for compiler
output.

Here is a small example to give the flavor of @sc{gasp}.  This input to
@sc{gasp}

@cartouche
@example
        .MACRO  saveregs from=8 to=14
count   .ASSIGNA \from
        ! save r\from..r\to
        .AWHILE  \&count LE \to
        mov     r\&count,@@-sp
count   .ASSIGNA  \&count + 1
        .AENDW
        .ENDM

        saveregs from=12

bar:    mov     #H'dead+10,r0
foo     .SDATAC "hello"<10>
        .END
@end example
@end cartouche

@noindent
generates this assembly program:

@cartouche
@example
        ! save r12..r14
        mov     r12,@@-sp
        mov     r13,@@-sp
        mov     r14,@@-sp

bar:    mov     #57005+10,r0
foo:    .byte   6,104,101,108,108,111,10
@end example
@end cartouche

@node Invoking GASP
@chapter Command Line Options

@c FIXME!  Or is there a simpler way, calling from GAS option?
The simplest way to use @sc{gasp} is to run it as a filter and assemble
its output.  In Unix and its ilk, you can do this, for example:

@c FIXME! GASP filename suffix convention?
@example
$ gasp prog.asm | as -o prog.o
@end example

Naturally, there are also a few command-line options to allow you to
request variations on this basic theme.  Here is the full set of
possibilities for the @sc{gasp} command line.

@example
gasp  [ -a | --alternate ]
      [ -c @var{char} | --commentchar @var{char} ]
      [ -d | --debug ]  [ -h | --help ] [ -M | --mri ]
      [ -o @var{outfile} | --output @var{outfile} ]
      [ -p | --print ]  [ -s | --copysource ]
      [ -u | --unreasonable ]  [ -v | --version ]
      @var{infile} @dots{}
@end example

@ftable @code
@item @var{infile} @dots{}
@c FIXME! Why not stdin as default infile?
The input file names.  You must specify at least one input file; if you
specify more, @sc{gasp} preprocesses them all, concatenating the output
in the order you list the @var{infile} arguments.

Mark the end of each input file with the preprocessor command
@code{.END}.  @xref{Other Commands,, Miscellaneous commands}.

@item -a
@itemx --alternate
Use alternative macro syntax.  @xref{Alternate,, Alternate macro
syntax}, for a discussion of how this syntax differs from the default
@sc{gasp} syntax.

@cindex comment character, changing
@cindex semicolon, as comment
@cindex exclamation mark, as comment
@cindex shriek, as comment
@cindex bang, as comment
@cindex @code{!} default comment char
@cindex @code{;} as comment char
@item -c '@var{char}'
@itemx --commentchar '@var{char}'
Use @var{char} as the comment character.  The default comment character
is @samp{!}.  For example, to use a semicolon as the comment character,
specify @w{@samp{-c ';'}} on the @sc{gasp} command line.  Since
assembler command characters often have special significance to command
shells, it is a good idea to quote or escape @var{char} when you specify
a comment character.

For the sake of simplicity, all examples in this manual use the default
comment character @samp{!}.

@item -d
@itemx --debug
Show debugging statistics.  In this version of @sc{gasp}, this option
produces statistics about the string buffers that @sc{gasp} allocates
internally.  For each defined buffersize @var{s}, @sc{gasp} shows the
number of strings @var{n} that it allocated, with a line like this:

@example
strings size @var{s} : @var{n}
@end example

@noindent
@sc{gasp} displays these statistics on the standard error stream, when
done preprocessing.

@item -h
@itemx --help
Display a summary of the @sc{gasp} command line options.

@item -M
@itemx --mri
Use MRI compatibility mode.  Using this option causes @sc{gasp} to
accept the syntax and pseudo-ops used by the Microtec Research
@code{ASM68K} assembler.

@item -o @var{outfile}
@itemx --output @var{outfile}
Write the output in a file called @var{outfile}.  If you do not use the
@samp{-o} option, @sc{gasp} writes its output on the standard output
stream.

@item -p
@itemx --print
Print line numbers.  @sc{gasp} obeys this option @emph{only} if you also
specify @samp{-s} to copy source lines to its output.  With @samp{-s
-p}, @sc{gasp} displays the line number of each source line copied
(immediately after the comment character at the beginning of the line).

@item -s
@itemx --copysource
Copy the source lines to the output file.  Use this option
to see the effect of each preprocessor line on the @sc{gasp} output.
@sc{gasp} places a comment character (@samp{!} by default) at
the beginning of each source line it copies, so that you can use this
option and still assemble the result.

@item -u
@itemx --unreasonable
Bypass ``unreasonable expansion'' limit.  Since you can define @sc{gasp}
macros inside other macro definitions, the preprocessor normally
includes a sanity check.  If your program requires more than 1,000
nested expansions, @sc{gasp} normally exits with an error message.  Use
this option to turn off this check, allowing unlimited nested
expansions.

@item -v
@itemx --version
Display the @sc{gasp} version number.
@end ftable

@node Commands
@chapter Preprocessor Commands

@sc{gasp} commands have a straightforward syntax that fits in well with
assembly conventions.  In general, a command extends for a line, and may
have up to three fields: an optional label, the command itself, and
optional arguments to the command.  You can write commands in upper or
lower case, though this manual shows them in upper case.  @xref{Syntax
Details,, Details of the GASP syntax}, for more information.

@menu
* Conditionals::
* Loops::
* Variables::
* Macros::
* Data::
* Listings::
* Other Commands::
* Syntax Details::
* Alternate::
@end menu

@node Conditionals
@section Conditional assembly

The conditional-assembly directives allow you to include or exclude
portions of an assembly depending on how a pair of expressions, or a
pair of strings, compare.

The overall structure of conditionals is familiar from many other
contexts.  @code{.AIF} marks the start of a conditional, and precedes
assembly for the case when the condition is true.   An optional
@code{.AELSE} precedes assembly for the converse case, and an
@code{.AENDI} marks the end of the condition.

@c FIXME! Why doesn't -u turn off this check?
You may nest conditionals up to a depth of 100; @sc{gasp} rejects
nesting beyond that, because it may indicate a bug in your macro
structure.

@c FIXME! Why isn't there something like cpp's -D option?  Conditionals
@c        would be much more useful if there were.
Conditionals are primarily useful inside macro definitions, where you
often need different effects depending on argument values.
@xref{Macros,, Defining your own directives}, for details about defining
macros.

@ftable @code
@item .AIF @var{expra} @var{cmp} @var{exprb}
@itemx .AIF "@var{stra}" @var{cmp} "@var{strb}"

The governing condition goes on the same line as the @code{.AIF}
preprocessor command.  You may compare either two strings, or two
expressions.

When you compare strings, only two conditional @var{cmp} comparison
operators are available: @samp{EQ} (true if @var{stra} and @var{strb}
are identical), and @samp{NE} (the opposite).

When you compare two expressions, @emph{both expressions must be
absolute} (@pxref{Expressions,, Arithmetic expressions in GASP}).  You
can use these @var{cmp} comparison operators with expressions:

@ftable @code
@item EQ
Are @var{expra} and @var{exprb} equal?  (For strings, are @var{stra} and
@var{strb} identical?)

@item NE
Are @var{expra} and @var{exprb} different?  (For strings, are @var{stra}
and @var{strb} different?

@item LT
Is @var{expra} less than @var{exprb}?  (Not allowed for strings.)

@item LE
Is @var{expra} less than or equal to @var{exprb}?  (Not allowed for strings.)

@item GT
Is @var{expra} greater than @var{exprb}?  (Not allowed for strings.)

@item GE
Is @var{expra} greater than or equal to @var{exprb}?  (Not allowed for
strings.)
@end ftable

@item .AELSE
Marks the start of assembly code to be included if the condition fails.
Optional, and only allowed within a conditional (between @code{.AIF} and
@code{.AENDI}).

@item .AENDI
Marks the end of a conditional assembly.
@end ftable

@node Loops
@section Repetitive sections of assembly

Two preprocessor directives allow you to repeatedly issue copies of the
same block of assembly code.

@ftable @code
@item .AREPEAT @var{aexp}
@itemx .AENDR
If you simply need to repeat the same block of assembly over and over a
fixed number of times, sandwich one instance of the repeated block
between @code{.AREPEAT} and @code{.AENDR}.  Specify the number of
copies as @var{aexp} (which must be an absolute expression).  For
example, this repeats two assembly statements three times in succession:

@cartouche
@example
        .AREPEAT        3
        rotcl   r2
        div1    r0,r1
        .AENDR
@end example
@end cartouche

@item .AWHILE @var{expra} @var{cmp} @var{exprb}
@itemx .AENDW
@itemx .AWHILE @var{stra} @var{cmp} @var{strb}
@itemx .AENDW
To repeat a block of assembly depending on a conditional test, rather
than repeating it for a specific number of times, use @code{.AWHILE}.
@code{.AENDW} marks the end of the repeated block.  The conditional
comparison works exactly the same way as for @code{.AIF}, with the same
comparison operators (@pxref{Conditionals,, Conditional assembly}).

Since the terms of the comparison must be absolute expression,
@code{.AWHILE} is primarily useful within macros.  @xref{Macros,,
Defining your own directives}.
@end ftable

@cindex loops, breaking out of
@cindex breaking out of loops
You can use the @code{.EXITM} preprocessor directive to break out of
loops early (as well as to break out of macros).  @xref{Macros,,
Defining your own directives}.

@node Variables
@section Preprocessor variables

You can use variables in @sc{gasp} to represent strings, registers, or
the results of expressions.

You must distinguish two kinds of variables: 
@enumerate
@item
Variables defined with @code{.EQU} or @code{.ASSIGN}.  To evaluate this
kind of variable in your assembly output, simply mention its name.  For
example, these two lines define and use a variable @samp{eg}:

@cartouche
@example
eg     .EQU   FLIP-64
       @dots{}
       mov.l  eg,r0
@end example
@end cartouche

@emph{Do not use} this kind of variable in conditional expressions or
while loops; @sc{gasp} only evaluates these variables when writing
assembly output.

@item
Variables for use during preprocessing.  You can define these
with @code{.ASSIGNC} or @code{.ASSIGNA}.  To evaluate this
kind of variable, write @samp{\&} before the variable name; for example,

@cartouche
@example
opcit  .ASSIGNA  47
       @dots{}
       .AWHILE  \&opcit GT 0
       @dots{}
       .AENDW
@end example
@end cartouche

@sc{gasp} treats macro arguments almost the same way, but to evaluate
them you use the prefix @samp{\} rather than @samp{\&}.
@xref{Macros,, Defining your own directives}.
@end enumerate

@ftable @code
@item @var{pvar} .EQU @var{expr}
@c FIXME!  Anything to beware of re GAS directive of same name?
Assign preprocessor variable @var{pvar} the value of the expression
@var{expr}.  There are no restrictions on redefinition; use @samp{.EQU}
with the same @var{pvar} as often as you find it convenient.

@item @var{pvar} .ASSIGN @var{expr}
Almost the same as @code{.EQU}, save that you may not redefine
@var{pvar} using @code{.ASSIGN} once it has a value.
@c FIXME!!  Supposed to work this way, apparently, but on 9feb94 works
@c          just like .EQU

@item @var{pvar} .ASSIGNA @var{aexpr}
Define a variable with a numeric value, for use during preprocessing.
@var{aexpr} must be an absolute expression.  You can redefine variables
with @code{.ASSIGNA} at any time.

@item @var{pvar} .ASSIGNC "@var{str}"
Define a variable with a string value, for use during preprocessing.
You can redefine variables with @code{.ASSIGNC} at any time.

@item @var{pvar} .REG (@var{register})
Use @code{.REG} to define a variable that represents a register.  In
particular, @var{register} is @emph{not evaluated} as an expression.
You may use @code{.REG} at will to redefine register variables.
@end ftable

All these directives accept the variable name in the ``label'' position,
that is at the left margin.  You may specify a colon after the variable
name if you wish; the first example above could have started @samp{eg:}
with the same effect.

@c pagebreak makes for better aesthetics---ensures macro and expansion together
@page
@node Macros
@section Defining your own directives

The commands @code{.MACRO} and @code{.ENDM} allow you to define macros
that generate assembly output.  You can use these macros with a syntax
similar to built-in @sc{gasp} or assembler directives.  For example,
this definition specifies a macro @code{SUM} that adds together a range of
consecutive registers:

@cartouche
@example
        .MACRO  SUM FROM=0, TO=9
        ! \FROM \TO
        mov     r\FROM,r10
COUNT   .ASSIGNA        \FROM+1
        .AWHILE \&COUNT LE \TO
        add     r\&COUNT,r10
COUNT   .ASSIGNA        \&COUNT+1
        .AENDW
        .ENDM
@end example
@end cartouche

@noindent
With that definition, @samp{SUM 0,5} generates this assembly output:

@cartouche
@example
        ! 0 5
        mov     r0,r10
        add     r1,r10
        add     r2,r10
        add     r3,r10
        add     r4,r10
        add     r5,r10
@end example
@end cartouche

@ftable @code
@item .MACRO @var{macname}
@itemx .MACRO @var{macname} @var{macargs} @dots{}
Begin the definition of a macro called @var{macname}.  If your macro
definition requires arguments, specify their names after the macro name,
separated by commas or spaces.  You can supply a default value for any
macro argument by following the name with @samp{=@var{deflt}}.  For
example, these are all valid @code{.MACRO} statements:

@table @code
@item .MACRO COMM
Begin the definition of a macro called @code{COMM}, which takes no
arguments.

@item .MACRO PLUS1 P, P1
@itemx .MACRO PLUS1 P P1
Either statement begins the definition of a macro called @code{PLUS1},
which takes two arguments; within the macro definition, write
@samp{\P} or @samp{\P1} to evaluate the arguments.

@item .MACRO RESERVE_STR P1=0 P2
Begin the definition of a macro called @code{RESERVE_STR}, with two
arguments.  The first argument has a default value, but not the second.
After the definition is complete, you can call the macro either as
@samp{RESERVE_STR @var{a},@var{b}} (with @samp{\P1} evaluating to
@var{a} and @samp{\P2} evaluating to @var{b}), or as @samp{RESERVE_STR
,@var{b}} (with @samp{\P1} evaluating as the default, in this case
@samp{0}, and @samp{\P2} evaluating to @var{b}).
@end table

When you call a macro, you can specify the argument values either by
position, or by keyword.  For example, @samp{SUM 9,17} is equivalent to
@samp{SUM TO=17, FROM=9}.  Macro arguments are preprocessor variables
similar to the variables you define with @samp{.ASSIGNA} or
@samp{.ASSIGNC}; in particular, you can use them in conditionals or for
loop control.  (The only difference is the prefix you write to evaluate
the variable: for a macro argument, write @samp{\@var{argname}}, but for
a preprocessor variable, write @samp{\&@var{varname}}.)

@item @var{name} .MACRO
@itemx @var{name} .MACRO ( @var{macargs} @dots{} )
@c FIXME check: I think no error _and_ no args recognized if I use form
@c       NAME  .MACRO   ARG ARG
An alternative form of introducing a macro definition: specify the macro
name in the label position, and the arguments (if any) between
parentheses after the name.  Defaulting rules and usage work the same
way as for the other macro definition syntax.

@item .ENDM
Mark the end of a macro definition.

@item .EXITM
Exit early from the current macro definition, @code{.AREPEAT} loop, or
@code{.AWHILE} loop.

@cindex number of macros executed
@cindex macros, count executed
@item \@@
@sc{gasp} maintains a counter of how many macros it has
executed in this pseudo-variable; you can copy that number to your
output with @samp{\@@}, but @emph{only within a macro definition}.

@item LOCAL @var{name} [ , @dots{} ]
@emph{Warning: @code{LOCAL} is only available if you select ``alternate
macro syntax'' with @samp{-a} or @samp{--alternate}.}  @xref{Alternate,,
Alternate macro syntax}.

Generate a string replacement for each of the @var{name} arguments, and
replace any instances of @var{name} in each macro expansion.  The
replacement string is unique in the assembly, and different for each
separate macro expansion.  @code{LOCAL} allows you to write macros that
define symbols, without fear of conflict between separate macro expansions.
@end ftable

@node Data
@section Data output

In assembly code, you often need to specify working areas of memory;
depending on the application, you may want to initialize such memory or
not.  @sc{gasp} provides preprocessor directives to help you avoid
repetitive coding for both purposes.

You can use labels as usual to mark the data areas.

@menu
* Initialized::
* Uninitialized::
@end menu

@node Initialized
@subsection Initialized data

These are the @sc{gasp} directives for initialized data, and the standard
@sc{gnu} assembler directives they expand to:

@ftable @code
@item .DATA @var{expr}, @var{expr}, @dots{}
@itemx .DATA.B @var{expr}, @var{expr}, @dots{}
@itemx .DATA.W @var{expr}, @var{expr}, @dots{}
@itemx .DATA.L @var{expr}, @var{expr}, @dots{}
Evaluate arithmetic expressions @var{expr}, and emit the corresponding
@code{as} directive (labelled with @var{lab}).  The unqualified
@code{.DATA} emits @samp{.long}; @code{.DATA.B} emits @samp{.byte};
@code{.DATA.W} emits @samp{.short}; and @code{.DATA.L} emits
@samp{.long}.

For example, @samp{foo .DATA 1,2,3} emits @samp{foo: .long 1,2,3}.

@item .DATAB @var{repeat}, @var{expr}
@itemx .DATAB.B @var{repeat}, @var{expr}
@itemx .DATAB.W @var{repeat}, @var{expr}
@itemx .DATAB.L @var{repeat}, @var{expr}
@c FIXME! Looks like gasp accepts and ignores args after 2nd.
Make @code{as} emit @var{repeat} copies of the value of the expression
@var{expr} (using the @code{as} directive @code{.fill}).
@samp{.DATAB.B} repeats one-byte values; @samp{.DATAB.W} repeats
two-byte values; and @samp{.DATAB.L} repeats four-byte values.
@samp{.DATAB} without a suffix repeats four-byte values, just like
@samp{.DATAB.L}.

@c FIXME! Allowing zero might be useful for edge conditions in macros.
@var{repeat} must be an absolute expression with a positive value.

@item .SDATA "@var{str}" @dots{}
String data.  Emits a concatenation of bytes, precisely as you specify
them (in particular, @emph{nothing is added to mark the end} of the
string).  @xref{Constants,, String and numeric constants}, for details
about how to write strings.  @code{.SDATA} concatenates multiple
arguments, making it easy to switch between string representations.  You
can use commas to separate the individual arguments for clarity, if you
choose.

@item .SDATAB @var{repeat}, "@var{str}" @dots{}
Repeated string data.  The first argument specifies how many copies of
the string to emit; the remaining arguments specify the string, in the
same way as the arguments to @code{.SDATA}.

@item .SDATAZ "@var{str}" @dots{}
Zero-terminated string data.  Just like @code{.SDATA}, except that
@code{.SDATAZ} writes a zero byte at the end of the string.

@item .SDATAC "@var{str}" @dots{}
Count-prefixed string data.  Just like @code{.SDATA}, except that
@sc{gasp} precedes the string with a leading one-byte count.  For
example, @samp{.SDATAC "HI"} generates @samp{.byte 2,72,73}.  Since the
count field is only one byte, you can only use @code{.SDATAC} for
strings less than 256 bytes in length.
@end ftable

@node Uninitialized
@subsection Uninitialized data

@c FIXME!  .space different on some platforms, notably HPPA.  Config?
Use the @code{.RES}, @code{.SRES}, @code{.SRESC}, and @code{.SRESZ}
directives to reserve memory and leave it uninitialized.  @sc{gasp}
resolves these directives to appropriate calls of the @sc{gnu}
@code{as} @code{.space} directive.

@ftable @code
@item .RES @var{count}
@itemx .RES.B @var{count}
@itemx .RES.W @var{count}
@itemx .RES.L @var{count}
Reserve room for @var{count} uninitialized elements of data.  The
suffix specifies the size of each element: @code{.RES.B} reserves
@var{count} bytes, @code{.RES.W} reserves @var{count} pairs of bytes,
and @code{.RES.L} reserves @var{count} quartets.  @code{.RES} without a
suffix is equivalent to @code{.RES.L}.

@item .SRES @var{count}
@itemx .SRES.B @var{count}
@itemx .SRES.W @var{count}
@itemx .SRES.L @var{count}
@c FIXME!  This is boring.  Shouldn't it at least have a different
@c         default size?  (e.g. the "S" suggests "string", for which .B
@c         would be more appropriate)
@code{.SRES} is a synonym for @samp{.RES}.

@item .SRESC @var{count}
@itemx .SRESC.B @var{count}
@itemx .SRESC.W @var{count}
@itemx .SRESC.L @var{count}
Like @code{.SRES}, but reserves space for @code{@var{count}+1} elements.

@item .SRESZ @var{count}
@itemx .SRESZ.B @var{count}
@itemx .SRESZ.W @var{count}
@itemx .SRESZ.L @var{count}
Like @code{.SRES}, but reserves space for @code{@var{count}+1} elements.
@end ftable

@node Listings
@section Assembly listing control

The @sc{gasp} listing-control directives correspond to
related @sc{gnu} @code{as} directives.

@ftable @code
@item .PRINT LIST
@itemx .PRINT NOLIST
Print control.  This directive emits the @sc{gnu} @code{as} directive
@code{.list} or @code{.nolist}, according to its argument.  @xref{List,,
@code{.list}, as.info, Using as}, for details on how these directives
interact.

@item .FORM LIN=@var{ln}
@itemx .FORM COL=@var{cols}
@itemx .FORM LIN=@var{ln} COL=@var{cols}
Specify the page size for assembly listings: @var{ln} represents the
number of lines, and @var{cols} the number of columns.  You may specify
either page dimension independently, or both together.  If you do not
specify the number of lines, @sc{gasp} assumes 60 lines; if you do not
specify the number of columns, @sc{gasp} assumes 132 columns.
(Any values you may have specified in previous instances of @code{.FORM}
do @emph{not} carry over as defaults.)  Emits the @code{.psize}
assembler directive.

@item .HEADING @var{string}
Specify @var{string} as the title of your assembly listings.  Emits
@samp{.title "@var{string}"}.

@item .PAGE
Force a new page in assembly listings.  Emits @samp{.eject}.
@end ftable

@node Other Commands
@section Miscellaneous commands

@ftable @code
@item .ALTERNATE
Use the alternate macro syntax henceforth in the assembly.
@xref{Alternate,, Alternate macro syntax}.

@item .ORG
@c FIXME!  This is very strange, since _GAS_ understands .org
This command is recognized, but not yet implemented.  @sc{gasp}
generates an error message for programs that use @code{.ORG}.

@item .RADIX @var{s}
@c FIXME no test cases in testsuite/gasp
@sc{gasp} understands numbers in any of base two, eight, ten, or
sixteen.  You can encode the base explicitly in any numeric constant
(@pxref{Constants,, String and numeric constants}).  If you write
numbers without an explicit indication of the base, the most recent
@samp{.RADIX @var{s}} command determines how they are interpreted.
@var{s} is a single letter, one of the following:

@table @code
@item .RADIX B
Base 2.

@item .RADIX Q
Base 8.

@item .RADIX D
Base 10.  This is the original default radix.

@item .RADIX H
Base 16.
@end table

You may specify the argument @var{s} in lower case (any of @samp{bqdh})
with the same effects.

@item .EXPORT @var{name}
@itemx .GLOBAL @var{name}
@c FIXME! No test cases in testsuite/gasp
Declare @var{name} global (emits @samp{.global @var{name}}).  The two
directives are synonymous.

@item .PROGRAM
No effect: @sc{gasp} accepts this directive, and silently ignores it.

@item .END
Mark end of each preprocessor file.  @sc{gasp} issues a warning if it
reaches end of file without seeing this command.

@item .INCLUDE "@var{str}"
Preprocess the file named by @var{str}, as if its contents appeared
where the @code{.INCLUDE} directive does.  @sc{gasp} imposes a maximum
limit of 30 stacked include files, as a sanity check.
@c FIXME!  Why is include depth not affected by -u?

@item .ALIGN @var{size}
@c FIXME! Why is this not utterly pointless?
Evaluate the absolute expression @var{size}, and emit the assembly
instruction @samp{.align @var{size}} using the result.
@end ftable

@node Syntax Details
@section Details of the GASP syntax

Since @sc{gasp} is meant to work with assembly code, its statement
syntax has no surprises for the assembly programmer.

@cindex whitespace
@emph{Whitespace} (blanks or tabs; @emph{not} newline) is partially
significant, in that it delimits up to three fields in a line.  The
amount of whitespace does not matter; you may line up fields in separate
lines if you wish, but @sc{gasp} does not require that.

@cindex fields of @sc{gasp} source line
@cindex label field
The @emph{first field}, an optional @dfn{label}, must be flush left in a
line (with no leading whitespace) if it appears at all.  You may use a
colon after the label if you wish; @sc{gasp} neither requires the colon
nor objects to it (but will not include it as part of the label name).

@cindex directive field
The @emph{second field}, which must appear after some whitespace,
contains a @sc{gasp} or assembly @dfn{directive}.

@cindex argument fields
Any @emph{further fields} on a line are @dfn{arguments} to the
directive; you can separate them from one another using either commas or
whitespace.

@menu
* Markers::
* Constants::
* Symbols::
* Expressions::
* String Builtins::
@end menu

@node Markers
@subsection Special syntactic markers

@sc{gasp} recognizes a few special markers: to delimit comments, to
continue a statement on the next line, to separate symbols from other
characters, and to copy text to the output literally.  (One other
special marker, @samp{\@@}, works only within macro definitions;
@pxref{Macros,, Defining your own directives}.)

@cindex comments
The trailing part of any @sc{gasp} source line may be a @dfn{comment}.
A comment begins with the first unquoted comment character (@samp{!} by
default), or an escaped or doubled comment character (@samp{\!} or
@samp{!!} by default), and extends to the end of a line.  You can
specify what comment character to use with the @samp{-c} option
(@pxref{Invoking GASP,, Command Line Options}).  The two kinds of
comment markers lead to slightly different treatment:

@table @code
@item !
A single, un-escaped comment character generates an assembly comment in
the @sc{gasp} output.  @sc{gasp} evaluates any preprocessor variables
(macro arguments, or variables defined with @code{.ASSIGNA} or
@code{.ASSIGNC}) present.  For example, a macro that begins like this

@example
        .MACRO  SUM FROM=0, TO=9
        ! \FROM \TO
@end example

@noindent
issues as the first line of output a comment that records the
values you used to call the macro.

@c comments, preprocessor-only
@c preprocessor-only comments
@c GASP-only comments
@item \!
@itemx !!
Either an escaped comment character, or a double comment character,
marks a @sc{gasp} source comment.  @sc{gasp} does not copy such comments
to the assembly output.
@end table

@cindex continuation character
@kindex +
To @emph{continue a statement} on the next line of the file, begin the
second line with the character @samp{+}.

@cindex literal copy to output
@cindex copying literally to output
@cindex preprocessing, avoiding
@cindex avoiding preprocessing
Occasionally you may want to prevent @sc{gasp} from preprocessing some
particular bit of text.  To @emph{copy literally} from the @sc{gasp}
source to its output, place @samp{\(} before the string to copy, and
@samp{)} at the end.  For example, write @samp{\(\!)} if you need the
characters @samp{\!} in your assembly output.

@cindex symbol separator
@cindex text, separating from symbols
@cindex symbols, separating from text
To @emph{separate a preprocessor variable} from text to appear
immediately after its value, write a single quote (@code{'}).  For
example, @samp{.SDATA "\P'1"} writes a string built by concatenating the
value of @code{P} and the digit @samp{1}.  (You cannot achieve this by
writing just @samp{\P1}, since @samp{P1} is itself a valid name for a
preprocessor variable.)

@node Constants
@subsection String and numeric constants

There are two ways of writing @dfn{string constants} in @sc{gasp}: as
literal text, and by numeric byte value.  Specify a string literal
between double quotes (@code{"@var{str}"}).  Specify an individual
numeric byte value as an absolute expression between angle brackets
(@code{<@var{expr}>}.  Directives that output strings allow you to
specify any number of either kind of value, in whatever order is
convenient, and concatenate the result.  (Alternate syntax mode
introduces a number of alternative string notations; @pxref{Alternate,,
Alternate macro syntax}.)

@c Details of numeric notation, e.g. base prefixes
You can write @dfn{numeric constants} either in a specific base, or in
whatever base is currently selected (either 10, or selected by the most
recent @code{.RADIX}).

To write a number in a @emph{specific base}, use the pattern
@code{@var{s}'@var{ddd}}: a base specifier character @var{s}, followed
by a single quote followed by digits @var{ddd}.  The base specifier
character matches those you can specify with @code{.RADIX}: @samp{B} for
base 2, @samp{Q} for base 8, @samp{D} for base 10, and @samp{H} for base
16.  (You can write this character in lower case if you prefer.)

@c FIXME! What are rules for recognizing number in deflt base?  Whatever
@c        is left over after parsing other things??

@node Symbols
@subsection Symbols

@sc{gasp} recognizes symbol names that start with any alphabetic character,
@samp{_}, or @samp{$}, and continue with any of the same characters or
with digits.  Label names follow the same rules.

@node Expressions
@subsection Arithmetic expressions in GASP

@cindex absolute expressions
@cindex relocatable expressions
There are two kinds of expressions, depending on their result:
@dfn{absolute} expressions, which resolve to a constant (that is, they
do not involve any values unknown to @sc{gasp}), and @dfn{relocatable}
expressions, which must reduce to the form

@example
@var{addsym}+@var{const}-@var{subsym}
@end example

@noindent
where @var{addsym} and @var{subsym} are assembly symbols of unknown
value, and @var{const} is a constant.

Arithmetic for @sc{gasp} expressions follows very similar rules to C.
You can use parentheses to change precedence; otherwise, arithmetic
primitives have decreasing precedence in the order of the following
list.

@enumerate
@item
Single-argument @code{+} (identity), @code{-} (arithmetic opposite), or
@code{~} (bitwise negation).  @emph{The argument must be an absolute
expression.}

@item
@code{*} (multiplication) and @code{/} (division).  @emph{Both arguments
must be absolute expressions.}

@item
@code{+} (addition) and @code{-} (subtraction).  @emph{At least one argument
must be absolute.}
@c FIXME!  Actually, subtraction doesn't check for this.

@item
@code{&} (bitwise and).  @emph{Both arguments must be absolute.}

@item
@c FIXME!  I agree ~ is a better notation than ^ for xor, but is the
@c         improvement worth differing from C?
@code{|} (bitwise or) and @code{~} (bitwise exclusive or; @code{^} in
C).  @emph{Both arguments must be absolute.}
@end enumerate

@node String Builtins
@subsection String primitives

You can use these primitives to manipulate strings (in the argument
field of @sc{gasp} statements):

@ftable @code
@item .LEN("@var{str}")
Calculate the length of string @code{"@var{str}"}, as an absolute
expression.  For example, @samp{.RES.B .LEN("sample")} reserves six
bytes of memory.

@item .INSTR("@var{string}", "@var{seg}", @var{ix})
Search for the first occurrence of @var{seg} after position @var{ix} of
@var{string}.  For example, @samp{.INSTR("ABCDEFG", "CDE", 0)} evaluates
to the absolute result @code{2}.

The result is @code{-1} if @var{seg} does not occur in @var{string}
after position @var{ix}.

@item .SUBSTR("@var{string}",@var{start},@var{len})
The substring of @var{string} beginning at byte number @var{start} and
extending for @var{len} bytes.
@end ftable

@node Alternate
@section Alternate macro syntax

If you specify @samp{-a} or @samp{--alternate} on the @sc{gasp} command
line, the preprocessor uses somewhat different syntax.  This syntax is
reminiscent of the syntax of Phar Lap macro assembler, but it
is @emph{not} meant to be a full emulation of Phar Lap or similar
assemblers.  In particular, @sc{gasp} does not support directives such
as @code{DB} and @code{IRP}, even in alternate syntax mode.

In particular, @samp{-a} (or @samp{--alternate}) elicits these
differences:

@table @emph
@item Preprocessor directives
You can use @sc{gasp} preprocessor directives without a leading @samp{.}
dot.  For example, you can write @samp{SDATA} with the same effect as
@samp{.SDATA}.

@item LOCAL
One additional directive, @code{LOCAL}, is available.  @xref{Macros,,
Defining your own directives}, for an explanation of how to use
@code{LOCAL}.

@need 2000
@item String delimiters
You can write strings delimited in these other ways besides
@code{"@var{string}"}:

@table @code
@item '@var{string}'
You can delimit strings with single-quote charaters.

@item <@var{string}>
You can delimit strings with matching angle brackets.
@end table

@item single-character string escape
To include any single character literally in a string (even if the
character would otherwise have some special meaning), you can prefix the
character with @samp{!} (an exclamation mark).  For example, you can
write @samp{<4.3 !> 5.4!!>} to get the literal text @samp{4.3 > 5.4!}.

@item Expression results as strings
You can write @samp{%@var{expr}} to evaluate the expression @var{expr}
and use the result as a string.  
@end table

@node GNU Free Documentation License
@chapter GNU Free Documentation License

                GNU Free Documentation License
                
                   Version 1.1, March 2000

 Copyright (C) 2000  Free Software Foundation, Inc.
  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other
written document "free" in the sense of freedom: to assure everyone
the effective freedom to copy and redistribute it, with or without
modifying it, either commercially or noncommercially.  Secondarily,
this License preserves for the author and publisher a way to get
credit for their work, while not being considered responsible for
modifications made by others.

This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.


1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work that contains a
notice placed by the copyright holder saying it can be distributed
under the terms of this License.  The "Document", below, refers to any
such manual or work.  Any member of the public is a licensee, and is
addressed as "you".

A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (For example, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.

The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.

A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, whose contents can be viewed and edited directly and
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup has been designed to thwart or discourage
subsequent modification by readers is not Transparent.  A copy that is
not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML designed for human modification.  Opaque formats include
PostScript, PDF, proprietary formats that can be read and edited only
by proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML produced by some word processors for output
purposes only.

The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.


2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.


3. COPYING IN QUANTITY

If you publish printed copies of the Document numbering more than 100,
and the Document's license notice requires Cover Texts, you must enclose
the copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a publicly-accessible computer-network location containing a complete
Transparent copy of the Document, free of added material, which the
general network-using public has access to download anonymously at no
charge using public-standard network protocols.  If you use the latter
option, you must take reasonably prudent steps, when you begin
distribution of Opaque copies in quantity, to ensure that this
Transparent copy will remain thus accessible at the stated location
until at least one year after the last time you distribute an Opaque
copy (directly or through your agents or retailers) of that edition to
the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.


4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct
   from that of the Document, and from those of previous versions
   (which should, if there were any, be listed in the History section
   of the Document).  You may use the same title as a previous version
   if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
   responsible for authorship of the modifications in the Modified
   Version, together with at least five of the principal authors of the
   Document (all of its principal authors, if it has less than five).
C. State on the Title page the name of the publisher of the
   Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
   adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
   giving the public permission to use the Modified Version under the
   terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
   and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section entitled "History", and its title, and add to
   it an item stating at least the title, year, new authors, and
   publisher of the Modified Version as given on the Title Page.  If
   there is no section entitled "History" in the Document, create one
   stating the title, year, authors, and publisher of the Document as
   given on its Title Page, then add an item describing the Modified
   Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
   public access to a Transparent copy of the Document, and likewise
   the network locations given in the Document for previous versions
   it was based on.  These may be placed in the "History" section.
   You may omit a network location for a work that was published at
   least four years before the Document itself, or if the original
   publisher of the version it refers to gives permission.
K. In any section entitled "Acknowledgements" or "Dedications",
   preserve the section's title, and preserve in the section all the
   substance and tone of each of the contributor acknowledgements
   and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
   unaltered in their text and in their titles.  Section numbers
   or the equivalent are not considered part of the section titles.
M. Delete any section entitled "Endorsements".  Such a section
   may not be included in the Modified Version.
N. Do not retitle any existing section as "Endorsements"
   or to conflict in title with any Invariant Section.

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.

You may add a section entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.


5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections entitled "History"
in the various original documents, forming one section entitled
"History"; likewise combine any sections entitled "Acknowledgements",
and any sections entitled "Dedications".  You must delete all sections
entitled "Endorsements."


6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.


7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, does not as a whole count as a Modified Version
of the Document, provided no compilation copyright is claimed for the
compilation.  Such a compilation is called an "aggregate", and this
License does not apply to the other self-contained works thus compiled
with the Document, on account of their being thus compiled, if they
are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one quarter
of the entire aggregate, the Document's Cover Texts may be placed on
covers that surround only the Document within the aggregate.
Otherwise they must appear on covers around the whole aggregate.


8. TRANSLATION

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License provided that you also include the
original English version of this License.  In case of a disagreement
between the translation and the original English version of this
License, the original English version will prevail.


9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License.  Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License.  However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.


10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.


ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

@smallexample
    Copyright (c)  YEAR  YOUR NAME.
    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.1
    or any later version published by the Free Software Foundation;
    with the Invariant Sections being LIST THEIR TITLES, with the
    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".
@end smallexample

If you have no Invariant Sections, write "with no Invariant Sections"
instead of saying which ones are invariant.  If you have no
Front-Cover Texts, write "no Front-Cover Texts" instead of
"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.

@node Index
@unnumbered Index

@printindex cp

@contents
@bye
