+void pic16_dump_gsection(FILE *of, set *sections)
+{
+ regs *r;
+ sectName *sname;
+
+ for(sname = setFirstItem(sections); sname; sname = setNextItem(sections)) {
+ if(!strcmp(sname->name, "access"))continue;
+ fprintf(of, "\n\n%s\tudata\n", sname->name);
+
+ for(r=setFirstItem(sname->regsSet); r; r=setNextItem(sname->regsSet)) {
+#if 0
+ fprintf(stderr, "%s:%d emitting variable %s for section %s (%p)\n", __FILE__, __LINE__,
+ r->name, sname->name, sname);
+#endif
+ fprintf(of, "%s\tres\t%d\n", r->name, r->size);
+ statistics.udsize += r->size;
+ }
+ }
+}
+
+
+/* forward declaration */
+void pic16_printIval(symbol * sym, sym_link * type, initList * ilist, char ptype, void *p);
+extern void pic16_pCodeConstString(char *name, char *value);
+
+void pic16_dump_isection(FILE *of, set *section, int fix)
+{
+ static int abs_isection_no=0;
+ symbol *s, *sprev;
+ unsigned int init_addr, i;
+ symbol **slist;
+
+ /* put all symbols in an array */
+ if (!elementsInSet(section)) return;
+ slist = Safe_calloc(elementsInSet(section), sizeof(symbol *));
+ s = slist[0]; i = 0;
+ for(sprev = setFirstItem(section); sprev; sprev = setNextItem(section)) {
+ slist[i] = sprev; i++;
+ }
+
+ if(!i) {
+ if(slist)Safe_free(slist);
+ return;
+ }
+
+ /* sort symbols according to their address */
+ qsort(slist, i, sizeof(symbol *), symCompare);
+
+ pic16_initDB();
+
+ if(!fix) {
+ fprintf(of, "\n\n\tidata\n");
+ for(s = setFirstItem(section); s; s = setNextItem(section)) {
+
+ if(s->ival) {
+ fprintf(of, "%s", s->rname);
+ pic16_printIval(s, s->type, s->ival, 'f', (void *)of);
+ pic16_flushDB('f', (void *)of);
+ } else {
+ if (IS_ARRAY (s->type) && IS_CHAR (s->type->next)
+ && SPEC_CVAL (s->etype).v_char) {
+
+// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, s->rname);
+ pic16_pCodeConstString(s->rname , SPEC_CVAL (s->etype).v_char);
+ } else {
+ assert(0);
+ }
+ }
+
+ }
+ } else {
+ unsigned int j=0;
+ symbol *s1;
+
+ sprev = NULL;
+ init_addr = SPEC_ADDR(slist[j]->etype);
+ fprintf(of, "\n\nistat_%s_%02d\tidata\t0X%04X\n", moduleName, abs_isection_no++, init_addr);
+
+ for(j=0;j<i;j++) {
+ s = slist[j];
+ if(j < i-1)s1 = slist[j+1]; else s1 = NULL;
+
+ init_addr = SPEC_ADDR(s->etype);
+
+ if(sprev && (init_addr > (SPEC_ADDR(sprev->etype) + getSize(sprev->etype)))) {
+ fprintf(of, "\nistat_%s_%02d\tidata\t0X%04X\n", moduleName, abs_isection_no++, init_addr);
+ }
+
+ if(s->ival) {
+ fprintf(of, "%s", s->rname);
+ pic16_printIval(s, s->type, s->ival, 'f', (void *)of);
+ pic16_flushDB('f', (void *)of);
+ } else {
+ if (IS_ARRAY (s->type) && IS_CHAR (s->type->next)
+ && SPEC_CVAL (s->etype).v_char) {
+
+// fprintf(stderr, "%s:%d printing code string from %s\n", __FILE__, __LINE__, s->rname);
+ pic16_pCodeConstString(s->rname , SPEC_CVAL (s->etype).v_char);
+ } else {
+ assert(0);
+ }
+ }
+
+
+ sprev = s;
+ }
+ }
+ Safe_free(slist);
+}
+
+