- wdt_reset();
-
- /* Read data from file */
- size = file->read(file, buf, PAGESIZE);
-
- /* If we reached end of file exit */
- if (!size)
- break;
-
- /* Update checksum */
- rotating_update(buf, size, &rot);
-
- /* Fill the temporary buffer of the AVR */
- for (page_addr = 0; page_addr < size; page_addr += 2)
- fill_temp_buffer(buf[page_addr + 1] | (uint16_t)buf[page_addr] << 8, page_addr);
-
- /* Page write */
- prog_pagewrite(flash_addr);
-
- /* Update progess (if present) */
- if (progress)
- if (!progress(file->SeekPos, file->Size))
- break;
-
- flash_addr += size;
+ /* Current page memory */
+ page = fd->SeekPos / PAGEBUF;
+
+ /* Address in page memory */
+ page_addr = fd->SeekPos % PAGEBUF;
+
+ prog_loadPage(page);
+
+ wr_len = MIN(size, PAGEBUF - page_addr);
+ memcpy(page_buf + page_addr, buf, wr_len);
+
+ buf += wr_len;
+ fd->SeekPos += wr_len;
+ size -= wr_len;
+ total_write += wr_len;