anchor.diff:              ChildNode := Pointer(ChildNodeInfo and NODEPTR_CLEAN_MASK);
             {$endif}
   
  -          // (parent:3, mask, parentmask, tile) + test
  -          ParentBits := ParentBits or (ChildNode.NodeInfo and Integer($ff00ff00));
  -          if (ParentBits and (ParentBits shl 8) = 0) then
  -            goto nextchild_continue;
  -
  -          // path
  +          // child node info (without heuristics data)
  +          Child{NodeInfo} := ChildNode.NodeInfo and Integer($ff00ff00);
  +          ParentBits := ParentBits or Child{NodeInfo};
  +          if (ParentBits and (Child shl 8) = 0) then goto nextchild_continue;
  +
  +          // child path
             TileWeights := Store.Info.TileWeights[ParentBits and 1];
  -          Path := TileWeights[NodeInfo shr 24] + TileWeights[ParentBits shr 24];
  -          if (Path > PATHLESS_TILE_WEIGHT) then
  -            goto nextchild_continue;
  +          Path := TileWeights[NodeInfo shr 24];
  +          Inc(Path, TileWeights[ParentBits shr 24]);
  +          if (Path > PATHLESS_TILE_WEIGHT) then goto nextchild_continue;
             Path := Store.Current.Path + (Path shr 1);
   
  +          // heuristed flag
             {$ifdef CPUX86}
  -          // todo optimize
  -//          ChildNodeInfo := //Cell.NodePtr;
  -          ChildNode := Pointer(Cell.NodePtr and NODEPTR_CLEAN_MASK);
  -          Cell.NodePtr := Cell.NodePtr or NODEPTR_FLAG_HEURISTED;
  +            ChildNode := Pointer(Cell.NodePtr);
  +            Cell.NodePtr := Cardinal(ChildNode) + NODEPTR_FLAG_HEURISTED;
  +            ChildNode := Pointer(Cardinal(ChildNode) and NODEPTR_CLEAN_MASK);
             {$else}
  -          Cell.NodePtr := ChildNodeInfo or NODEPTR_FLAG_HEURISTED;
  +            Cell.NodePtr := ChildNodeInfo + NODEPTR_FLAG_HEURISTED;
             {$endif}
             ChildNode.Path := Path;
             ChildNode.NodeInfo := ParentBits;
   
           heuristics_data:
             // (dX, dY) = ChildNode.Coordinates - Store.Info.FinishPoint;
  -          (*dX := Cardinal(ChildNode.Coordinates);
  +         (* dX := Cardinal(ChildNode.Coordinates);
             dY := Word(dX);
             dX := dX shr 16;
             Mask := Cardinal(Store.Info.FinishPoint);
             dY := dY - Word(Mask);
  -          dX := dX - (Mask shr 16);*)
  -          dX := 0;
  -          dY := 0;
  +          dX := dX - (Mask shr 16);
   
             // Way
             Mask := 2*Byte(dY > 0);
  
positive.code:          end;
         end;
      }
     (* PBufferHigh := @{$ifdef CPUX86}Store.{$endif}Buffer[(NodeInfo shr COUNTER_OFFSET) and $f];
      PBufferBase := @{$ifdef CPUX86}Store.{$endif}Buffer[1];
      PBufferCurrent := @{$ifdef CPUX86}Store.{$endif}Buffer[0];
      while (PBufferBase <> PBufferHigh) do
      begin
        ChildNode := PBufferBase^;
        {$ifNdef CPUX86}ChildSortValue := ChildNode.SortValue;{$endif}
  
        Left := PBufferCurrent^;
        if (Left.SortValue > {$ifNdef CPUX86}ChildSortValue{$else}ChildNode.SortValue{$endif}) then
        begin
         repeat
            PMapNodeBuffer(PBufferCurrent)[1] := Left;
            if (PBufferCurrent = @{$ifdef CPUX86}Store.{$endif}Buffer[0]) then Break;
  
            Dec(PBufferCurrent);
            Left := PBufferCurrent^;
            if (Left.SortValue > {$ifNdef CPUX86}ChildSortValue{$else}ChildNode.SortValue{$endif}) then Continue;
            Inc(PBufferCurrent);
            Break;
          until (False);
  
negative.code: 
        PBufferCurrent := PBufferBase;
        Inc(PBufferBase);
      end;
  
      // insert sorted nodes
      // todo
  