1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-23 15:58:05 +11:00

tools/uploadb: make it much much faster

By uploading a BASIC loop and then run it, we can reduce the serial
communication to pure content which greatly reduces the overhead and make
the process much much faster.
This commit is contained in:
Virgil Dupras 2019-12-11 09:24:40 -05:00
parent b40b39f45c
commit 7907687abf
3 changed files with 33 additions and 13 deletions

View File

@ -17,3 +17,10 @@ void sendcmd(int fd, char *cmd)
usleep(1000);
}
// Send a cmd and also read the "> " prompt
void sendcmdp(int fd, char *cmd)
{
char junk[2];
sendcmd(fd, cmd);
read(fd, &junk, 2);
}

View File

@ -1,2 +1,3 @@
void sendcmd(int fd, char *cmd);
void sendcmdp(int fd, char *cmd);

View File

@ -7,6 +7,8 @@
/* Push specified file to specified device **running the BASIC shell** and verify
* that the sent contents is correct.
*
* Note: running this will clear the current BASIC listing on the other side.
*/
int main(int argc, char **argv)
@ -24,6 +26,11 @@ int main(int argc, char **argv)
fseek(fp, 0, SEEK_END);
unsigned int bytecount = ftell(fp);
fprintf(stderr, "memptr: 0x%04x bytecount: 0x%04x.\n", memptr, bytecount);
if (!bytecount) {
// Nothing to read
fclose(fp);
return 0;
}
if (memptr+bytecount > 0xffff) {
fprintf(stderr, "memptr+bytecount out of range.\n");
fclose(fp);
@ -31,35 +38,40 @@ int main(int argc, char **argv)
}
rewind(fp);
int fd = open(argv[1], O_RDWR|O_NOCTTY);
char s[0x10];
char s[0x20];
sprintf(s, "m=0x%04x", memptr);
sendcmd(fd, s);
read(fd, s, 2); // read prompt
sendcmdp(fd, s);
// Send program
sendcmdp(fd, "clear");
sendcmdp(fd, "1 getc");
sendcmdp(fd, "2 puth a");
sendcmdp(fd, "3 poke m a");
sendcmdp(fd, "4 m=m+1");
sprintf(s, "5 if m<0x%04x goto 1", memptr+bytecount);
sendcmdp(fd, s);
sendcmd(fd, "run");
int returncode = 0;
while (fread(s, 1, 1, fp)) {
putchar('.');
fflush(stdout);
unsigned char c = s[0];
sendcmd(fd, "getc");
write(fd, &c, 1);
read(fd, s, 2); // read prompt
sendcmd(fd, "puth a");
usleep(1000); // let it breathe
read(fd, s, 2); // read hex pair
s[2] = 0; // null terminate
unsigned char c2 = strtol(s, NULL, 16);
read(fd, s, 2); // read prompt
if (c != c2) {
// mismatch!
unsigned int pos = ftell(fp);
fprintf(stderr, "Mismatch at byte %d! %d != %d.\n", pos, c, c2);
return 1;
// we don't exit now because we need to "consume" our whole program.
returncode = 1;
}
sendcmd(fd, "poke m a");
read(fd, s, 2); // read prompt
sendcmd(fd, "m=m+1");
read(fd, s, 2); // read prompt
}
printf("Done!\n");
return 0;
fclose(fp);
return returncode;
}