protected void update(int x, int y, Tile tile) {
		if( tile.nextAutoUpdateTime > stepNumber ) return;
		if( tile.vm == null ) return;
		
		final int srcIdx = cellIdx(x,y);
		tile = tiles[srcIdx] = tile.thaw();
		
		short moveFlags = tile.vm.fetch(ForthVM.MOVEMENT_REG);
		int moveX = x, moveY = y;
		if( (moveFlags & 0x0001) != 0 ) ++moveX;
		if( (moveFlags & 0x0002) != 0 ) ++moveY;
		if( (moveFlags & 0x0004) != 0 ) --moveX;
		if( (moveFlags & 0x0008) != 0 ) --moveY;
		tile.vm.put(ForthVM.MOVEMENT_REG, (short)0);
		
		if( moveX != x || moveY != y ) {
			final int destIdx = cellIdx(moveX,moveY);
			Tile destTile = tiles[destIdx];
			if( (destTile.flags & Tile.FLAG_SOLID) == 0 ) {
				// We can swap them!
				tiles[srcIdx] = destTile;
				tiles[destIdx] = tile;
			}
		}
		
		tile.nextAutoUpdateTime = stepNumber+1;
		tile.vm.step(16);
	}