From c1eb07ee5555f6cd3710bd09bbb5651216999c37 Mon Sep 17 00:00:00 2001 From: ketmar Date: Fri, 7 Sep 2012 12:52:31 +0000 Subject: [PATCH] urasm: zasdiff fixup format FossilOrigin-Name: 69506366cd5bc68d5a757ed97e70932dc75b939ba1063741758cf2a231ff06fc --- src/urasm.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/src/urasm.c b/src/urasm.c index ea2a4fd..059546c 100644 --- a/src/urasm.c +++ b/src/urasm.c @@ -34,6 +34,41 @@ }) +//////////////////////////////////////////////////////////////////////////////// +static char *strprintfVA (const char *fmt, va_list vaorig) { + char *buf = NULL; + int olen, len = 128; + // + buf = malloc(len); + if (buf == NULL) { fprintf(stderr, "\nFATAL: out of memory!\n"); abort(); } + for (;;) { + char *nb; + va_list va; + // + va_copy(va, vaorig); + olen = vsnprintf(buf, len, fmt, va); + va_end(va); + if (olen >= 0 && olen < len) return buf; + if (olen < 0) olen = len*2-1; + nb = realloc(buf, olen+1); + if (nb == NULL) { fprintf(stderr, "\nFATAL: out of memory!\n"); abort(); } + buf = nb; + len = olen+1; + } +} + + +static __attribute((format(printf,1,2))) char *strprintf (const char *fmt, ...) { + char *buf = NULL; + va_list va; + // + va_start(va, fmt); + buf = strprintfVA(fmt, va); + va_end(va); + return buf; +} + + /////////////////////////////////////////////////////////////////////////////// // global variables // @@ -1141,11 +1176,12 @@ static MAYBE_UNUSED SourceLine *findNextInstruction (const char *name) { // writers // static int optWriteFixups = 0; -static int optFixupType = 0; // 0: text file; 1: zas file +static int optFixupType = 0; // 0: text file; 1: zas file; 2: difzas static int optRunTape = 1; static int optRunDMB = 1; static int optTapExt = 0; /* set '.tap' extension (but don't write tape; this for inline tape blocks) */ static int optSNA48 = 1; +static char *optOutputDir = NULL; /////////////////////////////////////////////////////////////////////////////// @@ -1153,17 +1189,26 @@ static void writeFixups (void) { // void writeFixupList (FILE *fo, int cnt, const char *lbl, int (*chk)(const FixupItem *)) { if (cnt > 0) { + int prevaddr = 0; + // fprintf(fo, "%s:\n", lbl); fprintf(fo, " dw %d ; count\n", cnt); for (const FixupItem *fx = fixlisthead; fx != NULL; fx = fx->next) { - if (chk(fx)) fprintf(fo, " dw #%04X\n", fx->opaddr); + if (chk(fx)) { + fprintf(fo, " dw #%04X\n", fx->opaddr-prevaddr); + if (optFixupType == 2) { + prevaddr = fx->opaddr; + } + } } } } // if (optFixupType == 0) { - FILE *fo = fopen("zfixuptable.txt", "w"); + char *fname = strprintf("%s/%s", optOutputDir, "zfixuptable.txt"); + FILE *fo = fopen(fname, "w"); // + free(fname); if (fo == NULL) fatal("can't write fixup file"); fprintf(fo, "; addr dadr sz\n"); for (const FixupItem *fx = fixlisthead; fx != NULL; fx = fx->next) { @@ -1171,10 +1216,12 @@ static void writeFixups (void) { fprintf(fo, "%c #%04x #%04x %d\n", type[fx->fixuptype], fx->opaddr, fx->opdestaddr, fx->size); } fclose(fo); - } else if (optFixupType == 1) { - FILE *fo = fopen("zfixuptable.zas", "w"); + } else { + char *fname = strprintf("%s/%s", optOutputDir, "zfixuptable.zas"); + FILE *fo = fopen(fname, "w"); int cntw = 0, cntwl = 0, cntwh = 0, cntbl = 0, cntbh = 0; // + free(fname); if (fo == NULL) fatal("can't write fixup file"); for (const FixupItem *fx = fixlisthead; fx != NULL; fx = fx->next) { if (fx->fixuptype == UR_FIXUP_WORD) { ++cntw; continue; } @@ -1262,12 +1309,12 @@ static int fWriteWord (FILE *fo, uint16_t w, uint8_t *bxor) { // .sna // static int saveSna (const char *fname, int as48) { - char *fn = malloc(strlen(fname)+16); + char *fn;// = malloc(strlen(fname)+16); uint8_t regs[27]; FILE *fo; char abuf[32]; // - sprintf(fn, "%s.sna", fname); + fn = strprintf("%s/%s.sna", optOutputDir, fname); fo = fopen(fn, "wb"); free(fn); if (!fo) { fprintf(stderr, "ERROR: can't write SNA file: %s.sna\n", fname); return -1; } @@ -1336,12 +1383,13 @@ error: // bin chunks // static void saveRaw (const char *basename) { - char *fname = malloc(strlen(basename)+16); + char *fname = NULL;// = malloc(strlen(basename)+16); int start = 0, len; FILE *fo; // while (findChunkFrom(start, &start, &len)) { - sprintf(fname, "%s_%04X.%s", basename, start, optTapExt?"tap":"bin"); + if (fname != NULL) free(fname); + fname = strprintf("%s/%s_%04X.%s", optOutputDir, basename, start, (optTapExt ? "tap" : "bin")); fo = fopen(fname, "wb"); if (!fo) { fprintf(stderr, "ERROR: can't write file %s!\n", fname); @@ -1357,7 +1405,7 @@ static void saveRaw (const char *basename) { } start += len; } - free(fname); + if (fname != NULL) free(fname); } @@ -1385,13 +1433,14 @@ static uint16_t calcHobSum (const void *hdr) { static void saveHob (const char *basename) { - char *fname = malloc(strlen(basename)+16); + char *fname = NULL;//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"); + if (fname != NULL) free(fname); + fname = strprintf("%s/%s_%04X.%s", optOutputDir, basename, start, "$C"); fo = fopen(fname, "wb"); if (!fo) { fprintf(stderr, "ERROR: can't write file %s!\n", fname); @@ -1434,7 +1483,7 @@ static void saveHob (const char *basename) { } } quit: - free(fname); + if (fname != NULL) free(fname); } @@ -1442,12 +1491,12 @@ quit: // .dmb // static int saveDMB (const char *fname) { - char *fn = malloc(strlen(fname)+16); + char *fn;// = malloc(strlen(fname)+16); int start = 0, len; uint16_t pcnt = 0; FILE *fo; // - sprintf(fn, "%s.dmb", fname); + fn = strprintf("%s/%s.dmb", optOutputDir, fname); fo = fopen(fn, "wb"); free(fn); if (!fo) { fprintf(stderr, "ERROR: can't write DMB file: %s.dmb\n", fname); return -1; } @@ -1551,13 +1600,13 @@ static void saveTapCargador (FILE *fo) { static void saveTap (const char *basename) { - char *fname = malloc(strlen(basename)+16); + char *fname;// = malloc(strlen(basename)+16); char blkname[128]; int start = 0, len, f; uint8_t bxor; FILE *fo; // - sprintf(fname, "%s.tap", basename); + fname = strprintf("%s/%s.tap", optOutputDir, basename); fo = fopen(fname, "wb"); free(fname); if (!fo) { fprintf(stderr, "ERROR: can't write file %s.tap!\n", basename); return; } @@ -2832,6 +2881,7 @@ static struct option longOpts[] = { {"org", required_argument, NULL, 600}, {"define", required_argument, NULL, 601}, {"defzero", required_argument, NULL, 602}, + {"outdir", required_argument, NULL, 660}, // {"sna", 0, NULL, 's'}, {"sna128", 0, NULL, 'S'}, @@ -2874,6 +2924,7 @@ static void usage (const char *pname) { " --org xxx set ORG\n" " --define val perform 'val EQU 1'\n" " --defzero val perform 'val EQU 0'\n" + " --outdir dir output dir for resulting files (default: current)\n" ); } @@ -2919,6 +2970,8 @@ int main (int argc, char *argv[]) { if (optarg != NULL) { if (strcmp(optarg, "asm") == 0 || strcmp(optarg, "zas") == 0) { optFixupType = 1; + } else if (strcmp(optarg, "asmdiff") == 0 || strcmp(optarg, "zasdiff") == 0) { + optFixupType = 2; } else { fprintf(stderr, "FATAL: invalid fixup type: '%s'\n", optarg); return 1; @@ -2950,6 +3003,10 @@ int main (int argc, char *argv[]) { values[defcount] = strdup("0"); ++defcount; break; + case 660: // outdir + if (optOutputDir != NULL) free(optOutputDir); + optOutputDir = strdup(optarg); + break; } } // @@ -2971,6 +3028,8 @@ int main (int argc, char *argv[]) { goto earlyerrquit; } // + if (optOutputDir == NULL) optOutputDir = strdup("."); + // registerInstructions(); registerFunctions(); // @@ -3026,5 +3085,6 @@ earlyerrquit: free(defines[f]); } if (defines != NULL) { free(values); free(defines); } + if (optOutputDir != NULL) free(optOutputDir); return res?1:0; } -- 2.11.4.GIT