diff --git a/tools/blkup.c b/tools/blkup.c index fb09ad2..39cbcf5 100644 --- a/tools/blkup.c +++ b/tools/blkup.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "common.h" @@ -30,29 +31,43 @@ int main(int argc, char **argv) char s[0x40]; char buf[1024] = {0}; sendcmdp(fd, ": _ 1024 0 DO KEY DUP .x I BLK( + C! LOOP ;"); + sendcmdp(fd, ": Z BLK( 1024 0 FILL ;"); int returncode = 0; while (fread(buf, 1, 1024, fp)) { - sendcmd(fd, "_"); + bool allzero = true; for (int i=0; i<1024; i++) { - putchar('.'); - fflush(stdout); - write(fd, &buf[i], 1); - usleep(1000); // let it breathe - mread(fd, s, 2); // read hex pair - s[2] = 0; // null terminate - unsigned char c = strtol(s, NULL, 16); - if (c != buf[i]) { - // mismatch! - fprintf(stderr, "Mismatch at bno %d (%d) %d != %d.\n", blkno, i, buf[i], c); - // we don't exit now because we need to "consume" our whole program. - returncode = 1; + if (buf[i] != 0) { + allzero = false; + break; } - usleep(1000); // let it breathe } - readprompt(fd); - if (returncode) break; - memset(buf, 0, 1024); + if (allzero) { + sendcmdp(fd, "Z"); + putchar('Z'); + fflush(stdout); + } else { + sendcmd(fd, "_"); + for (int i=0; i<1024; i++) { + putchar('.'); + fflush(stdout); + write(fd, &buf[i], 1); + usleep(1000); // let it breathe + mread(fd, s, 2); // read hex pair + s[2] = 0; // null terminate + unsigned char c = strtol(s, NULL, 16); + if (c != buf[i]) { + // mismatch! + fprintf(stderr, "Mismatch at bno %d (%d) %d != %d.\n", blkno, i, buf[i], c); + // we don't exit now because we need to "consume" our whole program. + returncode = 1; + } + usleep(1000); // let it breathe + } + readprompt(fd); + if (returncode) break; + memset(buf, 0, 1024); + } sprintf(s, "%d BLK> ! BLK!", blkno); sendcmdp(fd, s); blkno++;