📄 aicasm_symbol.c
字号:
voidaic_print_include(FILE *dfile, char *include_file){ if (dfile == NULL) return; fprintf(dfile, "\n#include \"%s\"\n\n", include_file);}voidaic_print_reg_dump_types(FILE *ofile){ if (ofile == NULL) return; fprintf(ofile,"typedef int (%sreg_print_t)(u_int, u_int *, u_int);\n""typedef struct %sreg_parse_entry {\n"" char *name;\n"" uint8_t value;\n"" uint8_t mask;\n""} %sreg_parse_entry_t;\n""\n", prefix, prefix, prefix);}static voidaic_print_reg_dump_start(FILE *dfile, symbol_node_t *regnode){ if (dfile == NULL) return; fprintf(dfile,"static %sreg_parse_entry_t %s_parse_table[] = {\n", prefix, regnode->symbol->name);}static voidaic_print_reg_dump_end(FILE *ofile, FILE *dfile, symbol_node_t *regnode, u_int num_entries){ char *lower_name; char *letter; lower_name = strdup(regnode->symbol->name); if (lower_name == NULL) stop("Unable to strdup symbol name", EX_SOFTWARE); for (letter = lower_name; *letter != '\0'; letter++) *letter = tolower(*letter); if (dfile != NULL) { if (num_entries != 0) fprintf(dfile,"\n""};\n""\n"); fprintf(dfile,"int\n""%s%s_print(u_int regvalue, u_int *cur_col, u_int wrap)\n""{\n"" return (%sprint_register(%s%s, %d, \"%s\",\n"" 0x%02x, regvalue, cur_col, wrap));\n""}\n""\n", prefix, lower_name, prefix, num_entries != 0 ? regnode->symbol->name : "NULL", num_entries != 0 ? "_parse_table" : "", num_entries, regnode->symbol->name, regnode->symbol->info.rinfo->address); } fprintf(ofile,"#if AIC_DEBUG_REGISTERS\n""%sreg_print_t %s%s_print;\n""#else\n""#define %s%s_print(regvalue, cur_col, wrap) \\\n"" %sprint_register(NULL, 0, \"%s\", 0x%02x, regvalue, cur_col, wrap)\n""#endif\n""\n", prefix, prefix, lower_name, prefix, lower_name, prefix, regnode->symbol->name, regnode->symbol->info.rinfo->address);}static voidaic_print_reg_dump_entry(FILE *dfile, symbol_node_t *curnode){ int num_tabs; if (dfile == NULL) return; fprintf(dfile," { \"%s\",", curnode->symbol->name); num_tabs = 3 - (strlen(curnode->symbol->name) + 5) / 8; while (num_tabs-- > 0) fputc('\t', dfile); fprintf(dfile, "0x%02x, 0x%02x }", curnode->symbol->info.finfo->value, curnode->symbol->info.finfo->mask);}voidsymtable_dump(FILE *ofile, FILE *dfile){ /* * Sort the registers by address with a simple insertion sort. * Put bitmasks next to the first register that defines them. * Put constants at the end. */ symlist_t registers; symlist_t masks; symlist_t constants; symlist_t download_constants; symlist_t aliases; symlist_t exported_labels; symbol_node_t *curnode; symbol_node_t *regnode; DBT key; DBT data; int flag; u_int i; if (symtable == NULL) return; SLIST_INIT(®isters); SLIST_INIT(&masks); SLIST_INIT(&constants); SLIST_INIT(&download_constants); SLIST_INIT(&aliases); SLIST_INIT(&exported_labels); flag = R_FIRST; while (symtable->seq(symtable, &key, &data, flag) == 0) { symbol_t *cursym; memcpy(&cursym, data.data, sizeof(cursym)); switch(cursym->type) { case REGISTER: case SCBLOC: case SRAMLOC: symlist_add(®isters, cursym, SYMLIST_SORT); break; case MASK: case FIELD: case ENUM: case ENUM_ENTRY: symlist_add(&masks, cursym, SYMLIST_SORT); break; case CONST: symlist_add(&constants, cursym, SYMLIST_INSERT_HEAD); break; case DOWNLOAD_CONST: symlist_add(&download_constants, cursym, SYMLIST_INSERT_HEAD); break; case ALIAS: symlist_add(&aliases, cursym, SYMLIST_INSERT_HEAD); break; case LABEL: if (cursym->info.linfo->exported == 0) break; symlist_add(&exported_labels, cursym, SYMLIST_INSERT_HEAD); break; default: break; } flag = R_NEXT; } /* Register dianostic functions/declarations first. */ aic_print_file_prologue(ofile); aic_print_reg_dump_types(ofile); aic_print_file_prologue(dfile); aic_print_include(dfile, stock_include_file); SLIST_FOREACH(curnode, ®isters, links) { switch(curnode->symbol->type) { case REGISTER: case SCBLOC: case SRAMLOC: { symlist_t *fields; symbol_node_t *fieldnode; int num_entries; num_entries = 0; fields = &curnode->symbol->info.rinfo->fields; SLIST_FOREACH(fieldnode, fields, links) { if (num_entries == 0) aic_print_reg_dump_start(dfile, curnode); else if (dfile != NULL) fputs(",\n", dfile); num_entries++; aic_print_reg_dump_entry(dfile, fieldnode); } aic_print_reg_dump_end(ofile, dfile, curnode, num_entries); } default: break; } } /* Fold in the masks and bits */ while (SLIST_FIRST(&masks) != NULL) { char *regname; curnode = SLIST_FIRST(&masks); SLIST_REMOVE_HEAD(&masks, links); regnode = SLIST_FIRST(&curnode->symbol->info.finfo->symrefs); regname = regnode->symbol->name; regnode = symlist_search(®isters, regname); SLIST_INSERT_AFTER(regnode, curnode, links); } /* Add the aliases */ while (SLIST_FIRST(&aliases) != NULL) { char *regname; curnode = SLIST_FIRST(&aliases); SLIST_REMOVE_HEAD(&aliases, links); regname = curnode->symbol->info.ainfo->parent->name; regnode = symlist_search(®isters, regname); SLIST_INSERT_AFTER(regnode, curnode, links); } /* Output generated #defines. */ while (SLIST_FIRST(®isters) != NULL) { symbol_node_t *curnode; u_int value; char *tab_str; char *tab_str2; curnode = SLIST_FIRST(®isters); SLIST_REMOVE_HEAD(®isters, links); switch(curnode->symbol->type) { case REGISTER: case SCBLOC: case SRAMLOC: fprintf(ofile, "\n"); value = curnode->symbol->info.rinfo->address; tab_str = "\t"; tab_str2 = "\t\t"; break; case ALIAS: { symbol_t *parent; parent = curnode->symbol->info.ainfo->parent; value = parent->info.rinfo->address; tab_str = "\t"; tab_str2 = "\t\t"; break; } case MASK: case FIELD: case ENUM: case ENUM_ENTRY: value = curnode->symbol->info.finfo->value; tab_str = "\t\t"; tab_str2 = "\t"; break; default: value = 0; /* Quiet compiler */ tab_str = NULL; tab_str2 = NULL; stop("symtable_dump: Invalid symbol type " "encountered", EX_SOFTWARE); break; } fprintf(ofile, "#define%s%-16s%s0x%02x\n", tab_str, curnode->symbol->name, tab_str2, value); free(curnode); } fprintf(ofile, "\n\n"); while (SLIST_FIRST(&constants) != NULL) { symbol_node_t *curnode; curnode = SLIST_FIRST(&constants); SLIST_REMOVE_HEAD(&constants, links); fprintf(ofile, "#define\t%-8s\t0x%02x\n", curnode->symbol->name, curnode->symbol->info.cinfo->value); free(curnode); } fprintf(ofile, "\n\n/* Downloaded Constant Definitions */\n"); for (i = 0; SLIST_FIRST(&download_constants) != NULL; i++) { symbol_node_t *curnode; curnode = SLIST_FIRST(&download_constants); SLIST_REMOVE_HEAD(&download_constants, links); fprintf(ofile, "#define\t%-8s\t0x%02x\n", curnode->symbol->name, curnode->symbol->info.cinfo->value); free(curnode); } fprintf(ofile, "#define\tDOWNLOAD_CONST_COUNT\t0x%02x\n", i); fprintf(ofile, "\n\n/* Exported Labels */\n"); while (SLIST_FIRST(&exported_labels) != NULL) { symbol_node_t *curnode; curnode = SLIST_FIRST(&exported_labels); SLIST_REMOVE_HEAD(&exported_labels, links); fprintf(ofile, "#define\tLABEL_%-8s\t0x%02x\n", curnode->symbol->name, curnode->symbol->info.linfo->address); free(curnode); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -