anchor.diff:        control_map[MOUSE_MOVE][0](x, y);
       }
     }
  +  void register_touchstart(TouchEvent e) {
  +    e.preventDefault();
  +    if (e.touches.length > 0) {
  +      Touch t = e.touches.first;
  +      int x = t.client.x-canvas.offsetLeft; int y = t.client.y-canvas.offsetTop;
  +      if (control_map.containsKey(TOUCH_START)) {
  +        control_map[TOUCH_START][0](x, y);
  +      }
  +    }
  +  }
  +  void register_touchmove(TouchEvent e) {
  +    e.preventDefault();
  +    if (e.touches.length > 0) {
  +      Touch t = e.touches.first;
  +      int x = t.client.x-canvas.offsetLeft; int y = t.client.y-canvas.offsetTop;
  +      if (control_map.containsKey(TOUCH_MOVE)) {
  +        control_map[TOUCH_MOVE][0](x, y);
  +      }
  +    }
  +  }
   
     void process_entity(int entity) {}
     void remove_entity(int e) {}
  
positive.code:     window.onKeyDown.listen(register_keydown);
      window.onKeyUp.listen(register_keyup);
      canvas.onMouseMove.listen(register_mousemove);
  
      playing_control_map = {
        KeyCode.LEFT: [moveLeft, stopLeft],
  
negative.code:     // also, need to actually add the mousemove/touchmove handlers
      //canvas.onMouseDown.listen(register_mousedown);
      //window.onMouseUp.listen(register_mouseup);
  
      //window.onDeviceMotion.listen(register_devicemotion);
  
  