From 1872aaa0c8e06a4df1e62cd16240e5409d5d795c Mon Sep 17 00:00:00 2001 From: ketmar Date: Thu, 6 Sep 2012 08:49:16 +0000 Subject: [PATCH] urasm: it can save HoBetas now FossilOrigin-Name: 27d98ec0f855fc7529323f0b0041568bcde63b65f511e0c5b2b56f4b6263f139 --- src/urasm.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/src/urasm.c b/src/urasm.c index 88f7e97..a4e085b 100644 --- a/src/urasm.c +++ b/src/urasm.c @@ -1207,6 +1207,83 @@ static void saveRaw (const char *basename) { /////////////////////////////////////////////////////////////////////////////// +// HoBeta files +// +typedef struct __attribute__((packed)) __attribute__((gcc_struct)) { + char name[8]; + char type; + uint16_t start; + uint16_t len; + uint8_t zero; // always zero + uint8_t secLen; // length in sectors + uint16_t checksum; +} HOBHeader; + + +static uint16_t calcHobSum (const void *hdr) { + const uint8_t *buf = (const uint8_t *)hdr; + uint16_t res = 0; + // + for (unsigned int f = 0; f < 15; ++f) res += ((uint16_t)buf[f])*257+f; + return res; +} + + +static void saveHob (const char *basename) { + char *fname = malloc(strlen(basename)+16); + int start = 0, len; + HOBHeader hdr; + FILE *fo; + // + while (findChunkFrom(start, &start, &len)) { + sprintf(fname, "%s_%04X.%s", basename, start, "$C"); + fo = fopen(fname, "wb"); + if (!fo) { + fprintf(stderr, "ERROR: can't write file %s!\n", fname); + start += len; + } else { + printf("out: %s\n", fname); + memset(&hdr, 0, sizeof(hdr)); + memset(&hdr.name, 32, 8); + sprintf(hdr.name, "%c%04X", basename[0], start); + hdr.name[strlen(hdr.name)] = 32; + hdr.type = 'C'; + hdr.start = start; + hdr.len = len; + hdr.secLen = (len+255)/256; + hdr.checksum = calcHobSum(&hdr); + if (fwrite(&hdr, sizeof(hdr), 1, fo) != 1) { + fprintf(stderr, "ERROR: error writing file %s!\n", fname); + fclose(fo); + unlink(fname); + goto quit; + } + if (fwrite(memory+start, len, 1, fo) != 1) { + fprintf(stderr, "ERROR: error writing file %s!\n", fname); + fclose(fo); + unlink(fname); + goto quit; + } + start += len; + while (len%256) { + if (fwrite(&hdr.zero, 1, 1, fo) != 1) { + fprintf(stderr, "ERROR: error writing file %s!\n", fname); + fclose(fo); + unlink(fname); + goto quit; + } + ++len; + //fprintf(stderr, ":%d\n", len%256); + } + fclose(fo); + } + } +quit: + free(fname); +} + + +/////////////////////////////////////////////////////////////////////////////// // .dmb // static int saveDMB (const char *fname) { @@ -2559,6 +2636,7 @@ static struct option longOpts[] = { {"dmb", 0, NULL, 'b'}, {"none", 0, NULL, 'n'}, {"help", 0, NULL, 'h'}, + {"hob", 0, NULL, 'H'}, {NULL, 0, NULL, 0} }; @@ -2580,6 +2658,7 @@ static void usage (const char *pname) { " -r --raw write raw file(s)\n" " -b --dmb write DMB file\n" " -B --autodmb write DMB file with autostart\n" + " -H --hob write HoBeta code file(s)\n" " -n --none write nothing\n" " -h --help this help\n"); } @@ -2605,7 +2684,7 @@ int main (int argc, char *argv[]) { tapeLoaderName[0] = 0; // printf("urasm v%d.%d.%d, compile date: %s %s\n", VERSION_HI, VERSION_MID, VERSION_LO, __DATE__, __TIME__); - while ((c = getopt_long(argc, argv, "sStTbBrnh", longOpts, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "sStTbBrnhH", longOpts, NULL)) >= 0) { switch (c) { case 'S': /*optRunSNA = 1;*/ optSNA48 = 0; optWriteType = 's'; optWTChanged = 1; break; case 's': /*optRunSNA = 0;*/ optSNA48 = 1; optWriteType = 's'; optWTChanged = 1; break; @@ -2613,6 +2692,7 @@ int main (int argc, char *argv[]) { case 't': optRunTape = 0; optWriteType = 't'; optWTChanged = 1; break; case 'b': optRunTape = 0; optRunDMB = 0; optWriteType = 'd'; optWTChanged = 1; break; case 'B': optRunTape = 0; optRunDMB = 1; optWriteType = 'd'; optWTChanged = 1; break; + case 'H': optWriteType = 'H'; optWTChanged = 1; break; case 'r': case 'n': optWriteType = c; optWTChanged = 1; break; case 'h': usage(pname); res = 0; goto earlyerrquit; case '?': return 1; @@ -2668,6 +2748,7 @@ int main (int argc, char *argv[]) { case 't': saveTap(oc); break; case 'r': saveRaw(oc); break; case 'd': saveDMB(oc); break; + case 'H': saveHob(oc); break; } free(oc); } -- 2.11.4.GIT