diff --git a/README.md b/README.md
index d9c8c77..347efc3 100644
--- a/README.md
+++ b/README.md
@@ -9,4 +9,4 @@
* -lst / -lst=(file.lst): generate disassembly text from result (file or stdout)
* -opcodes / -opcodes=(file.s): dump all available opcodes (file or stdout)
* -vice (file.vs): export a vice symbol file
-
## Features
* **Code**
* **Comments**
* **Labels**
* **Directives**
* **Macros**
* **Expressions**
### Code
Code is any valid mnemonic/opcode and addressing mode. At the moment only one opcode per line is assembled.
### Comments
Comments are currently line based and both ';' and '//' are accepted as delimiters.
### Expressions
Anywhere a number can be entered it can also be interpreted as a full expression, for example:
```
Get123:
bytes Get1-*, Get2-*, Get3-*
Get1:
lda #1
rts
Get2:
lda #2
rts
Get3:
lda #3
rts
```
Would yield 3 bytes where the address of a label can be calculated by taking the address of the byte plus the value of the byte.
### Labels
Labels come in two flavors: **Addresses** (PC based) or **Values** (Evaluated from an expression). An address label is simply placed somewhere in code and a value label is follwed by '**=**' and an expression. All labels are rewritable so it is fine to do things like NumInstance = NumInstance+1. Value assignments can be prefixed with '.const' or '.label' but is not required to be prefixed by anything.
*Local labels* exist inbetween *global labels* and gets discarded whenever a new global label is added. The syntax for local labels are one of: prefix with period, at-sign, exclamation mark or suffix with $, as in: **.local** or **!local** or **@local** or **local$**. Both value labels and address labels can be local labels.
```
Function: ; global label
ldx #32
.local_label ; local label
dex
bpl .local_label
rts
Next_Function: ; next global label, the local label above is now erased.
rts
```
### Directives
Directives are assembler commands that control the code generation but that does not generate code by itself. Some assemblers prefix directives with a period (.org instead of org) so a leading period is accepted but not required for directives.
* [**ORG**](#org) (same as **PC**): Set the current compiling address.
* [**LOAD**](#load) Set the load address for binary formats that support it.
* [**SECTION**](#section) Start a relative section
* [**LINK**](#link) Link a relative section at this address
* [**XDEF**](#xdef) Make a label available globally
* [**INCOBJ**](#incobj) Include an object file (.o65) to this file
* [**ALIGN**](#align) Align the address to a multiple by filling with 0s
* [**MACRO**](#macro) Declare a macro
* [**EVAL**](#eval) Log an expression during assembly.
* [**BYTES**](#bytes) Insert comma separated bytes at this address (same as **BYTE** or **DC.B**)
* [**WORDS**](#words) Insert comma separated 16 bit values at this address (same as **WORD** or **DC.W**)
* [**TEXT**](#text) Insert text at this address
* [**INCLUDE**](#include) Include another source file and assemble at this address
* [**INCBIN**](#incbin) Include a binary file at this address
* [**CONST**](#const) Assign a value to a label and make it constant (error if reassigned with other value)
* [**LABEL**](#label) Decorative directive to assign an expression to a label
* [**INCSYM**](#incsym) Include a symbol file with an optional set of wanted symbols.
* [**POOL**](#pool) Add a label pool for temporary address labels
* [**#IF / #ELSE / #IFDEF / #ELIF / #ENDIF**](#conditional) Conditional assembly
* [**STRUCT**](#struct) Hierarchical data structures (dot separated sub structures)
* [**REPT**](#rept) Repeat a scoped block of code a number of times.
* [**INCDIR**](#incdir) Add a directory to look for binary and text include files in.
* [**MERLIN**](#merlin) A variety of directives and label rules to support Merlin assembler sources
**ORG**
```
org $2000
(or pc $2000)
```
Sets the current assembler address to this address
**SECTION**
```
section Code
Start:
lda #Data
sta $ff
rts
section BSS
Data:
byte 1,2,3,4
```
Starts a relative section. Relative sections require a name and sections that share the same name will be linked sequentially. The labels will be evaluated at link time.
**XDEF**
Used in files assembled to object files to share a label globally. All labels that are not xdef'd are still processed but protected so that other objects can use the same label name without colliding. **XDEF ** must be specified before the label is defined, such as at the top of the file.
**INCOBJ**
Include an object file for linking into this file.
**LINK**
Link a set of relative sections (sharing the same name) at this address
The following lines will place all sections named Code sequentially at location $1000, followed by all sections named BSS:
```
org $1000
link Code
link BSS
```
There is currently object file support (use -obj argument to generate), currently doing a lot of testing to make sure it works as expected. At this time all labels from object files are globally visible causing potential confusion if two files share the same name labels and XDEF is intended to mark labels as global to protect file scope labels.
**LOAD**
```
load $2000
```
For c64 .prg files this prefixes the binary file with this address.
**ALIGN**
```
align $100
```
Add bytes of 0 up to the next address divisible by the alignment
**MACRO**
See the 'Macro' section below
**EVAL**
Example:
```
eval Current PC: *
```
Might yield the following in stdout:
```
Eval (15): Current PC : "*" = $2010
```
When eval is encountered on a line print out "EVAL (\) \: \ = \" to stdout. This can be useful to see the size of things or debugging expressions.
**BYTES**
Adds the comma separated values on the current line to the assembled output, for example
```
RandomBytes:
bytes NumRandomBytes
{
bytes 13,1,7,19,32
NumRandomBytes = * - !
}
```
**byte** or **dc.b** are also recognized.
**WORDS**
Adds comma separated 16 bit values similar to how **BYTES** work. **word** or **dc.w** are also recognized.
**TEXT**
Copies the string in quotes on the same line. The plan is to do a petscii conversion step. Use the modifier 'petscii' or 'petscii_shifted' to convert alphabetic characters to range.
Example:
```
text petscii_shifted "This might work"
```
**INCLUDE**
Include another source file. This should also work with .sym files to import labels from another build. The plan is for x65 to export .sym files as well.
Example:
```
include "wizfx.s"
```
**INCBIN**
Include binary data from a file, this inserts the binary data at the current address.
Example:
```
incbin "wizfx.gfx"
```
**CONST**
Prefix a label assignment with 'const' or '.const' to cause an error if the label gets reassigned.
```
const zpData = $fe
```
**LABEL**
Decorative directive to assign an expression to a label, label assignments are followed by '=' and an expression.
These two assignments do the same thing (with different values):
```
label zpDest = $fc
zpDest = $fa
```
**INCSYM**
Include a symbol file with an optional set of wanted symbols.
Open a symbol file and extract a set of symbols, or all symbols if no set was specified. Local labels will be discarded if possible.
```
incsym Part1_Init, Part1_Update, Part1_Exit "part1.sym"
```
**POOL**
Add a label pool for temporary address labels. This is similar to how stack frame variables are assigned in C.
A label pool is a mini stack of addresses that can be assigned as temporary labels with a scope ('{' and '}'). This can be handy for large functions trying to minimize use of zero page addresses, the function can declare a range (or set of ranges) of available zero page addresses and labels can be assigned within a scope and be deleted on scope closure. The format of a label pool is: "pool start-end, start-end" and labels can then be allocated from that range by '