This language allows one to write scripts to control the movement of the
files. It is a stack VM, with three registers (x, y, data) accessible via
special purpose instructions. Two of these registers (x and y) control
the screen position of the controlled sprite on screen, while the
third one (data) is private to the thread and can be used to keep
some internal data throughout the lifetime of the thread.
For instance, a simple script to move a file down 1 pixel at a time is:

      pushy                     pushes the y coordinate on the stack
      push 1                    pushes the value 1
      add                       adds y and 1, and pushes the result on the stack
      popy                      pops the stack top and sets the y coordinate
      end                       notify the VM this thread is done

When using the parser (from a config file), instructions must be on a single
line, separated by semicolons (';'). Some instructions need a parameter, some
not. Instruction and parameter are separated by free blank space.
Example:
      weapon1 = pushy; push 1; add; popy; end


      nop
No parameter.
Does nothing.

      end
No parameter.
Ends the current script. Empties stack, and resets the instruction pointer
to the start of the script.

      yield
No parameter.
Stops execution, but retains all the state (including stack and instruction
pointer) for next execution.

      pushtime
No parameter.
Pushes the current time on the stack.

      pushx
No parameter.
Pushes the x screen position on the stack.

      pushy
No parameter.
Pushes the y screen position on the stack.

      popx
No parameter.
Sets the x screen position to the value of the top of the stack and pops it.

      popy
No parameter.
Sets the y screen position to the value of the top of the stack and pops it.

      push <number>
1 paramter: the value to push.
Pushes a value on the stack.

      pop
No parameter.
Pops a value off the stack, doing nothing with it.

      add
No parameter.
Pops the two topmost stack slots, adds them, and pushes the result.

      sub
No parameter.
Pops the two topmost stack slots, substract the topmost from the other,
and pushes the result.

      mul
No parameter.
Pops the two topmost stack slots, multiplies them, and pushes the result.

      div
No parameter.
Pops the two topmost stack slots, divide the other by the topmost,
and pushes the result.

      mod
No parameter.
Pops the two topmost stack slots, divide the other by the topmost,
and pushes the remainder.

      sin
No parameter.
Pops the topmost stack slot, multiplies it by the sine of the new topmost
stack slot, which it pops, and pushes the result.

      cos
No parameter.
Pops the topmost stack slot, multiplies it by the cosine of the new topmost
stack slot, which it pops, and pushes the result.

      rand
No parameter.
Pops the topmost stack slot, and pushes a random number between 0 and this
value-1 (both inclusive).

      ajz <number>
1 parameter: the address to jump to (zero based).
Pops the topmost stack slot, and jumps (absolute) to this address if it is zero.

      rjz <number>
1 parameter: the amount to jump of (in instructions).
Pops the topmost stack slot, and jumps (relative) by the given amount if it is
zero.

      pushd
No parameter.
Pushes the thread data register on the stack.

      popd
No parameter.
Sets the thread data register to the value of the top of the stack and pops it.

      puship
No parameter.
Pushes the current instruction pointer (zero based)

      peek
No parameter.
Pops the topmost stack slot, and pushes the instruction (opcode first, parameter
second) or the instruction pointed by this value.

      poke
No parameter.
Pops the topmost stack slot as an instruction parameter, another one as an
instruction, and a third one as the address, and writes the given pair
instruction/parameter at the address.

      pushw
No parameter.
Pushes the screen width.

      pushh
No parameter.
Pushes the screen height.

      neg
No parameter.
Pops the topmost stack slot, negates it, and pushes it back.


