// ページ区切り位置を計算して、pages, npages を変更する。 void Paginate() { Page *current_page = pages; size_t previous_end = 0; printf("text_length = %zu\n", text_length); do { if (current_page - pages == MAX_PAGES) { fprintf(stderr, "too many pages"); abort(); } previous_end = FillPage(previous_end, current_page, false); printf("page: start=%zu, end=%zu\n", current_page->start, current_page->end); current_page++; } while (previous_end < text_length); // この時点で current_page は最後の次の場所を指している。 npages = current_page - pages; }
BOOL flash_module(WORD page, WORD numpages, char *fn, char *name, BYTE flags) { int i; static WORD bytes_read; static WORD b, last_b = 0; static long addr; static WORD pages; pages = numpages; if(flags & 0x01) { prog_fres = f_open(&prog_file, fn, FA_READ); if(prog_fres == FR_OK) { printf("Flashing %s...", name); i = page; do { MAPPER_MAP1 = 0; FillPage(0xff, 0); prog_fres = f_read(&prog_file, (void *)0x4000, 8192, &bytes_read); addr = (((long)(i & 0x7FF)) << 13); b = flash_addr2block(addr); if(b != last_b) { if(!(flags & 0x04)) { flash_erase_block(b); } last_b = b; } flash_page(0, i); i++; pages--; } while((bytes_read == 8192)&&(pages)); f_close(&prog_file); printf(" OK!\n"); } else { printf("\nCouldn't open %s:\n-> Not flashed!\n", fn); return FALSE; } } pages = numpages; if(flags & 0x02) { prog_fres = f_open(&prog_file, fn, FA_READ); if(prog_fres == FR_OK) { printf("Verifying %s...", name); i = page; do { MAPPER_MAP1 = 0; FillPage(0xff, 0); prog_fres = f_read(&prog_file, (void *)0x4000, 8192, &bytes_read); // if(bytes_read != 0x2000) { // printf("Can't read 8192 bytes from file, but %d (error %d)\n", bytes_read, prog_fres); // } if(b=verify_page(0, i)) { // return 0 on good, address when wrong printf(" ERROR!\n",b); dump_hex((void*)(b&0xFFF0), 16); b ^= 0x2000; dump_hex((void*)(b&0xFFF0), 16); return FALSE; } i++; pages--; } while((bytes_read == 8192)&&(pages)); f_close(&prog_file); printf(" OK!\n"); } else { printf("\nCouldn't open %s:\n-> Not verified!\n", fn); return FALSE; } } return TRUE; }
void DrawPage(Page *page) { // 実際に描画するので第三引数に true を渡す。 FillPage(page->start, page, true); }