X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fpcode.c;h=dc8360e8ca74c0fa1d522d174611975f72a6e494;hb=7621eff72ff61f576c7a04d730ff6aba083b4a8a;hp=206add78693c7b705aedf0bbce2e2a88ca85140f;hpb=3e896c0ba619568082bc9e952265022cad9fe911;p=fw%2Fsdcc diff --git a/src/pic16/pcode.c b/src/pic16/pcode.c index 206add78..dc8360e8 100644 --- a/src/pic16/pcode.c +++ b/src/pic16/pcode.c @@ -4034,18 +4034,46 @@ typedef struct DBdata struct DBdata DBd; static int DBd_init = -1; -static int DB_prev = -1; + +/*-----------------------------------------------------------------*/ +/* Initialiase "DB" data buffer */ +/*-----------------------------------------------------------------*/ +void pic16_initDB(void) +{ + DBd_init = -1; +} + + +/*-----------------------------------------------------------------*/ +/* Flush pending "DB" data to a pBlock */ +/* */ +/* ptype - type of p pointer, 'f' file pointer, 'p' pBlock pointer */ +/*-----------------------------------------------------------------*/ +void pic16_flushDB(char ptype, void *p) +{ + if (DBd.count>0) { + if(ptype == 'p') + pic16_addpCode2pBlock(((pBlock *)p),pic16_newpCodeAsmDir("DB", "%s", DBd.buffer)); + else + if(ptype == 'f') + fprintf(((FILE *)p), "\tdb\t%s\n", DBd.buffer); + else { + /* sanity check */ + fprintf(stderr, "PIC16 port error: could not emit initial value data\n"); + } + + DBd.count = 0; + DBd.buffer[0] = '\0'; + } +} + /*-----------------------------------------------------------------*/ /* Add "DB" directives to a pBlock */ /*-----------------------------------------------------------------*/ -void pic16_emitDB(pBlock *pb, char c) +void pic16_emitDB(char c, char ptype, void *p) { int l; - char *frm, tbuf[8]; - char frm_alnum[]="%c"; - char frm_other[]="0x%02x"; - if (DBd_init<0) { // we need to initialize @@ -4055,55 +4083,33 @@ void pic16_emitDB(pBlock *pb, char c) } l = strlen(DBd.buffer); + sprintf(DBd.buffer+l,"%s0x%02x", (DBd.count>0?", ":""), c & 0xff); - if(isprint( c ))frm = frm_alnum; - else frm = frm_other; - sprintf(tbuf, frm, c & 0xff); - - if(!isprint(DB_prev)) { - if(isprint(c)) - if(DBd.count)strcat(DBd.buffer, ", \""); - else strcat(DBd.buffer, "\""); - else if(DBd.count) strcat(DBd.buffer, ", "); - } else - if(!isprint(c))strcat(DBd.buffer, "\", "); - - strcat(DBd.buffer, tbuf); + DBd.count++; + if (DBd.count>=16) + pic16_flushDB(ptype, p); +} -#if 0 - if (DBd.count>0) { - sprintf(DBd.buffer+l,", 0x%02x", c & 0xff); - } else { - sprintf(DBd.buffer,"0x%02x", c & 0xff); - } -#endif +void pic16_emitDS(char *s, char ptype, void *p) +{ + int l; - DBd.count++; - DB_prev = c; - - if (DBd.count>=16) { - if(isprint(c))strcat(DBd.buffer, "\""); - pic16_addpCode2pBlock(pb,pic16_newpCodeAsmDir("DB", "%s", DBd.buffer)); + if (DBd_init<0) { + // we need to initialize + DBd_init = 0; DBd.count = 0; DBd.buffer[0] = '\0'; - DB_prev = 0; } -} -/*-----------------------------------------------------------------*/ -/* Flush pending "DB" data to a pBlock */ -/*-----------------------------------------------------------------*/ -void pic16_flushDB(pBlock *pb) -{ - if (DBd.count>0) - { - if(isprint(DB_prev))strcat(DBd.buffer, "\""); - pic16_addpCode2pBlock(pb,pic16_newpCodeAsmDir("DB", "%s", DBd.buffer)); - DBd.count = 0; - DBd.buffer[0] = '\0'; - } + l = strlen(DBd.buffer); + sprintf(DBd.buffer+l,"%s%s", (DBd.count>0?", ":""), s); + + DBd.count++; //=strlen(s); + if (DBd.count>=16) + pic16_flushDB(ptype, p); } + /*-----------------------------------------------------------------*/ /*-----------------------------------------------------------------*/ void pic16_pCodeConstString(char *name, char *value) @@ -4125,9 +4131,9 @@ void pic16_pCodeConstString(char *name, char *value) pic16_addpCode2pBlock(pb,pic16_newpCodeLabel(name,-1)); do { - pic16_emitDB(pb, *value); + pic16_emitDB(*value, 'p', (void *)pb); }while (*value++); - pic16_flushDB(pb); + pic16_flushDB('p', (void *)pb); } /*-----------------------------------------------------------------*/