   # A **Block** is the only node that can serve as the root.
   compileRoot: ->
     o = {namespace: new Namespace}
-    o.namespace.createBuiltinFunc "printc", new Type("func", [intType], voidType), stdlib.printc
-    o.namespace.createBuiltinFunc "prints", new Type("func", [stringType], voidType), stdlib.prints
-    code = @compileStatement o
-    codes = [code, "set [0x8ffe], 0\n"]
+    codes = []
+    codes.push "; stdlib"
+    codes.push o.namespace.createBuiltinFunc "printc", new Type("func", [intType], voidType), stdlib.printc
+    codes.push o.namespace.createBuiltinFunc "prints", new Type("func", [stringType], voidType), stdlib.prints
+    codes.push "; main"
+    codes.push @compileStatement o
+    codes.push "; exit"
+    codes.push "set [0x8ffe], 0"
+    codes.push ""
 
     for variable in o.namespace.extraAsm
       codes.push variable.asm

    # good news, guys: you're parameter types are now known!
    for codeNode in callType.findRoot().codeNodes
      codeNode.compileFunc o
    codes = ("set push, #{arg.access}" for arg in args)
    codes.push "jsr [#{funcVariable.label}]"
    return codes.join("\n")

  # Tag this invocation as creating a new instance.

  leftType.linkTo rightType

class Variable
  constructor: (@localOffset, @type, @namespace) ->
  access: ->
    positive = (@localOffset + 0x10000) % 0x10000
    "[z+0x#{positive.toString 16}]"

class Namespace
  constructor: (@parent)->
