diff --git a/src/fileio.c b/src/fileio.c index 799439b1..f22ee8e0 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -72,6 +72,8 @@ char *fileio_fmtstr(FILEFMT format) { return "ELF"; case FMT_IMM: return "in-place immediate"; + case FMT_EEGG: + return "R-number list"; case FMT_BIN: return "0b-binary byte list"; case FMT_DEC: @@ -101,6 +103,8 @@ int fileio_fmtchr(FILEFMT format) { return 'e'; case FMT_IMM: return 'm'; + case FMT_EEGG: + return 'R'; case FMT_BIN: return 'b'; case FMT_DEC: @@ -114,7 +118,6 @@ int fileio_fmtchr(FILEFMT format) { } } - FILEFMT fileio_format(char c) { switch (c) { case 'a': @@ -131,6 +134,8 @@ FILEFMT fileio_format(char c) { return FMT_ELF; case 'm': return FMT_IMM; + case 'R': + return FMT_EEGG; case 'b': return FMT_BIN; case 'd': @@ -149,6 +154,7 @@ typedef enum { LAST_SEG = 2, } Segorder_t; + static void print_ihex_extended_addr(int n_64k, FILE *outf) { unsigned char hi = (n_64k >> 8); unsigned char lo = n_64k; @@ -1199,10 +1205,15 @@ static int b2num(const char *filename, FILE *f, const AVRMEM *mem, Segment_t *se prefix = "0b"; base = 2; break; + + case FMT_EEGG: + prefix = ""; + base = 'r'; + break; } for (int i = segp->addr; i < segp->addr + segp->len; i++) { - char cbuf[20]; + char cbuf[81]; if (i > 0) { if (putc(',', f) == EOF) @@ -1218,7 +1229,7 @@ static int b2num(const char *filename, FILE *f, const AVRMEM *mem, Segment_t *se if (fputs(prefix, f) == EOF) goto writeerr; } - str_utoa(num, cbuf, base); + str_utoa(num, cbuf, base); if (fputs(cbuf, f) == EOF) goto writeerr; } @@ -1601,6 +1612,7 @@ int fileio_segments(int oprwv, const char *filename, FILEFMT format, case FMT_DEC: case FMT_OCT: case FMT_BIN: + case FMT_EEGG: thisrc = fileio_num(&fio, fname, f, mem, seglist+i, format); break; diff --git a/src/libavrdude.h b/src/libavrdude.h index 8164e1a4..33d22f69 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -989,6 +989,7 @@ typedef enum { FMT_IHEX, FMT_RBIN, FMT_IMM, + FMT_EEGG, FMT_HEX, FMT_DEC, FMT_OCT, diff --git a/src/strutil.c b/src/strutil.c index 54fe5ff4..05d23eb2 100644 --- a/src/strutil.c +++ b/src/strutil.c @@ -310,6 +310,30 @@ char *str_utoa(unsigned n, char *buf, int base) { unsigned q; char *cp; + if(base == 'r') { + const char *units = "IVXLCDMFTYHSNabcdefghijkl"; + const char *rep[10] = {"", "a", "aa", "aaa", "ab", "b", "ba", "baa", "baaa", "ac"}; + + if(n == 0) { + strcpy(buf, "0"); + return buf; + } + + int i = 0; + for(unsigned u = n; u; u /= 10) + i++; + for(*buf = 0; i > 0; i--) { + unsigned u = n; + for(int j=1; j 36) { *buf = 0; return buf;