	PAGE	"Macro Structures"
*    There are two data structures that are unique to macro definitions
*  and expansions: the macro definition and the macro frame (which is
*  created each time a macro is expanded).  The two structures are displayed
*  below:
*
*               Macro Frame Layout                 Macro Definition
*  Low Addrs +-----------------------+          +---------------------+ Hi Addrss
*            |  Pointer into macro   |          | Number of arguments |
*  MAC:DEF   +-     definition      -+          +---------------------+
*            |                       |          |   Definition text   |
*            +-----------------------+          :  terminated by null :
*            |   Value of SP after   |          :                     :
*  MAC:SP    +-    frame pushed     -+          +-                   -+
*            |                       |          |          0          |
*            +-----------------------+          +---------------------+ Low Addr
*            |  Address of previous  |
*  MAC:PREV  +-     macro frame     -+              Special Codes
*            |                       |           in Macro Definitions
*            +-----------------------+          =======================
*  MAC:ARGS  |  # of arg definitions |       There are two types of special
*            +-----------------------+     code bytes that are present in macro
* {MACFRAME} |      Pointer to       |     definitions: 1) argument references,
*  MAC:PTRS  +-    argument #0      -+     and 2) generated label references.
*            |        text  **       |     These special code bytes have the
*            +-----------------------+     sign bit set.  Their layouts are:
*            :                       :
*            :                       :            Argument Reference
*            +-----------------------+          +---------------------+
*            |      Pointer to       |          | 1 | 0 | Argument #  |
*            +-    argument #n      -+          +---------------------+
*            |        text **        |            7   6  5           0
*            +-----------------------+
*            |   Argument #0 text ** |            Genlabel Reference
*            :   terminated by null  :          +---------------------+
*            +-                     -+          | 1 | 1 | Genlabel #  |
*            |           0           |          +---------------------+
*            +-----------------------+            7   6  5           0
*            :                       :
	PAGE
*            :                       :     There may be 64 arguments and 64
*            +-----------------------+     generated labels per macro, numbered
*            |   Argument #n text ** |     0-63.  A generated label has the
*            :   terminated by null  :     form ":$n" where n is a hexadecimal
*            +-                     -+     number of up to 6 digits, unique
*            |           0           |     with respect to genlabel # and macro
*            +-----------------------+     invocation.
*            |  (extra)  0  (null)   |
*  Hi Addr   +-----------------------+
*
*
*     In macro definitions in the source code references to generated labels
*  and macro call arguments are done thusly:
*
*        Genlabels:  "^Lnn"
*                             (Where n is a decimal number 0-63)
*        Arguments:  "^nn"
*
*     In a macro call comma separate all arguments and the argument list
*  is terminated by the first unprotected blank, tab or CR.  The meta
*  brackets "{" "}" are used to "protect" items and ~ is used as a single
*  character meta protector.
*
*
*        ** Please note that items in the macro frame are allocated "backwards"
*           (word quantities are not flipped) because the frame was allocated
*           by pushing its contents on the stack.  All character strings are
*           stored backwards with a terminating null.  Macro definitions are
*           allocated in a normal forward manner.
*
*
