anchor.diff:    begin
       UsbAsp25_Read(hUSBdev, 0, 0, buffer, sizeof(buffer));
       Application.ProcessMessages;
  +
       if MainForm.ButtonCancel.Tag <> 0 then
         begin
           LogPrint(STR_USER_CANCEL, clRed);
  
positive.code:   Address := StartAddress;
    MainForm.ProgressBar.Max := ChipSize div ChunkSize;
  
    try
      RomStream.Clear;
  
      while Address < ChipSize do
      begin
        if ChunkSize > (ChipSize - Address) then ChunkSize := ChipSize - Address;
  
        if ChipSize > 16777216 then
          BytesRead := BytesRead + UsbAsp25_Read32bitAddr(hUSBDev, $13, Address, datachunk, ChunkSize)
        else
          BytesRead := BytesRead + UsbAsp25_Read(hUSBDev, $03, Address, datachunk, ChunkSize);
  
        RomStream.WriteBuffer(datachunk, chunksize);
        Inc(Address, ChunkSize);
  
        MainForm.ProgressBar.Position := MainForm.ProgressBar.Position + 1;
        Application.ProcessMessages;
        if MainForm.ButtonCancel.Tag <> 0 then
        begin
          LogPrint(STR_USER_CANCEL, clRed);
          Break;
        end;
      end;
  
    finally
    end;
  
    if BytesRead <> ChipSize then
      LogPrint(STR_WRONG_BYTES_READ, clRed)
    else
      LogPrint(STR_DONE);
    MainForm.ProgressBar.Position := 0;
  end;
  
  
negative.code:   Address := StartAddress;
    MainForm.ProgressBar.Max := DataSize div ChunkSize;
  
    while Address < DataSize do
    begin
      if ChunkSize > (DataSize - Address) then ChunkSize := DataSize - Address;
  
      if DataSize > FLASH_SIZE_128MBIT then
          BytesRead := BytesRead + UsbAsp25_Read32bitAddr(hUSBDev, $13, Address, datachunk, ChunkSize)
        else
          BytesRead := BytesRead + UsbAsp25_Read(hUSBDev, $03, Address, datachunk, ChunkSize);
  