+
+////////////////////////////////////////////////////////////////////////
+///////////////////// Quake Assembler Documentation ////////////////////
+////////////////////////////////////////////////////////////////////////
+Quake assembler is quite simple: it's just an annotated version of the binary
+produced by any existing QuakeC compiler, but made cleaner to use, (so that
+the location of various globals or strings are not required to be known).
+
+Constants:
+ Using one of the following valid constant typenames, you can declare
+ a constant {FLOAT,VECTOR,FUNCTION,FIELD,ENTITY}, all typenames are
+ proceeded by a colon, and the name (white space doesn't matter).
+
+ Examples:
+ FLOAT: foo 1
+ VECTOR: bar 1 2 1
+ STRING: hello "hello world"
+
+Comments:
+ Commenting assembly requires the use of either # or ; on the line
+ that you'd like to be ignored by the assembler. You can only comment
+ blank lines, and not lines assembly already exists on.
+
+ Examples:
+ ; this is allowed
+ # as is this
+ FLOAT: foo 1 ; this is not allowed
+ FLOAT: bar 2 # neither is this
+
+Functions:
+ Creating functions is the same as declaring a constant, simply use
+ FUNCTION followed by a colon, and the name (white space doesn't matter)
+ and start the statements for that function on the line after it
+
+ Examples:
+ FLOAT: foo 1
+ FLOAT: bar 2
+ FUNCTION: test1
+ ADD foo, bar, OFS_RETURN
+ RETURN
+
+ FUNCTION: test2
+ CALL0 test1
+ DONE
+
+Internal:
+ The Quake engine provides some internal functions such as print, to
+ access these you first must declare them and their names. To do this
+ you create a FUNCTION as you currently do. Adding a $ followed by the
+ number of the engine builtin (negated).
+
+ Examples:
+ FUNCTION: print $4
+ FUNCTION: error $3
+
+Misc:
+ There are some rules as to what your identifiers can be for functions
+ and constants. All indentifiers mustn't begin with a numeric digit,
+ identifiers cannot include spaces, or tabs; they cannot contain symbols,
+ and they cannot exceed 32768 characters. Identifiers cannot be all
+ capitalized either, as all capatilized identifiers are reserved by the
+ assembler.
+
+ Numeric constants cannot contain special notation such as `1-e10`, all
+ numeric constants have to be numeric, they can contain decmial points
+ and signs (+, -) however.
+
+ Constants cannot be assigned values of other constants, their value must
+ be fully expressed inspot of the declartion.
+
+ No two identifiers can be the same name, this applies for variables allocated
+ inside a function scope (despite it being considered local).
+
+ There exists one other keyword that is considered sugar, and that
+ is AUTHOR, this keyword will allow you to speciy the AUTHOR(S) of
+ the assembly being assembled. The string represented for each usage
+ of AUTHOR is wrote to the end of the string table. Simaler to the
+ usage of constants and functions the AUTHOR keyword must be proceeded
+ by a colon.
+
+ Examples:
+ AUTHOR: "Dale Weiler"
+ AUTHOR: "John Doe"
+
+ Colons exist for the sole reason of not having to use spaces after
+ keyword usage (however spaces are allowed). To understand the
+ following examples below are equivlent.
+
+ Example 1:
+ FLOAT:foo 1
+ Example 2:
+ FLOAT: foo 1
+ Example 3:
+ FLOAT: foo 2
+
+ variable amounts of whitespace is allowed anywhere (as it should be).
+ think of `:` as a delimiter (which is what it's used for during assembly).
+
+////////////////////////////////////////////////////////////////////////
+/////////////////////// Quake C Documentation //////////////////////////
+////////////////////////////////////////////////////////////////////////
+TODO ....