bug fixes, etc.

This commit is contained in:
Kelvin Sherlock 2017-01-05 14:14:22 -05:00
parent 43ac7ba514
commit e72d835c48
4 changed files with 30 additions and 51 deletions

View File

@ -1,5 +1,5 @@
LINK.o = $(LINK.cc) LINK.o = $(LINK.cc)
CXXFLAGS = -std=c++11 -g CXXFLAGS = -std=c++11 -g -Wall
CCFLAGS = -g CCFLAGS = -g
OBJS = dumpobj.o disassembler.o zrdz_disassembler.o OBJS = dumpobj.o disassembler.o zrdz_disassembler.o
@ -12,7 +12,7 @@ ifeq ($(MSYSTEM),MINGW64)
endif endif
dumpobj : $(OBJS) wdcdumpobj : $(OBJS)
disassembler.o : disassembler.cpp disassembler.h disassembler.o : disassembler.cpp disassembler.h

View File

@ -186,9 +186,6 @@ std::vector<symbol> read_symbols(const std::vector<uint8_t> &symbol_data) {
bool dump_obj(const char *name, int fd) bool dump_obj(const char *name, int fd)
{ {
static const char *kSections[] = { "PAGE0", "CODE", "KDATA", "DATA", "UDATA" };
static const char *kTypes[] = { "S_UND", "S_ABS", "S_REL", "S_EXP", "S_REG", "S_FREG" };
Mod_head h; Mod_head h;
ssize_t ok; ssize_t ok;
@ -275,9 +272,6 @@ bool dump_obj(const char *name, int fd)
// todo -- move all this stuff to a separate function. // todo -- move all this stuff to a separate function.
uint8_t size = read_8(iter); uint8_t size = read_8(iter);
char buffer[32];
std::vector<std::string> stack; std::vector<std::string> stack;
// todo -- need to keep operation for precedence? // todo -- need to keep operation for precedence?
@ -348,25 +342,6 @@ bool dump_obj(const char *name, int fd)
case REC_DEBUG: case REC_DEBUG:
{ {
static const char *debugs[] = {
"D_C_FILE",
"D_C_LINE",
"D_C_SYM",
"D_C_STAG",
"D_C_ETAG",
"D_C_UTAG",
"D_C_MEMBER",
"D_C_EOS",
"D_C_FUNC",
"D_C_ENDFUNC",
"D_C_BLOCK",
"D_C_ENDBLOCK",
"D_LONGA_ON",
"D_LONGA_OFF",
"D_LONGI_ON",
"D_LONGI_OFF",
};
d.flush(); d.flush();
uint16_t size = read_16(iter); uint16_t size = read_16(iter);
@ -404,17 +379,17 @@ bool dump_obj(const char *name, int fd)
} }
case D_C_BLOCK: { case D_C_BLOCK: {
uint16_t block = read_16(iter); uint16_t block = read_16(iter);
d.emit("",".block", std::to_string(line)); d.emit("",".block", std::to_string(block));
break; break;
} }
case D_C_ENDBLOCK: { case D_C_ENDBLOCK: {
uint16_t line = read_16(iter); uint16_t block = read_16(iter);
d.emit("",".endblock", std::to_string(line)); d.emit("",".endblock", std::to_string(block));
break; break;
} }
case D_C_FUNC: { case D_C_FUNC: {
uint16_t arg = read_16(iter); uint16_t arg = read_16(iter);
d.emit("",".function", std::to_string(line)); d.emit("",".function", std::to_string(arg));
break; break;
} }
case D_C_ENDFUNC: { case D_C_ENDFUNC: {
@ -555,27 +530,13 @@ bool dump_obj(const char *name, int fd)
} }
d.back_matter(); unsigned f = 0;
if (flags._S) f |= 0x01;
d.back_matter(f);
if (iter != data.end() || op != REC_END) errx(EX_DATAERR, "%s records ended early", name); if (iter != data.end() || op != REC_END) errx(EX_DATAERR, "%s records ended early", name);
#if 0
if (flags._S) {
printf("; sections\n");
for (auto &s : sections) {
printf("; %-20s %02x %02x %04x %04x\n",
s.name.c_str(), s.number, s.flags, s.size, s.org);
}
printf(";\n");
printf("; symbols\n");
for (auto &s : symbols) {
printf("; %-20s %02x %02x %02x %08x\n",
s.name.c_str(), s.type, s.flags, s.section, s.offset);
}
}
#endif
return true; return true;
} }

View File

@ -123,7 +123,7 @@ void zrdz_disassembler::front_matter(const std::string &module) {
} }
void zrdz_disassembler::back_matter() { void zrdz_disassembler::back_matter(unsigned flags) {
flush(); flush();
_section = -1; _section = -1;
@ -148,6 +148,24 @@ void zrdz_disassembler::back_matter() {
} }
if (flags & 0x01) {
fputs("; sections\n", stdout);
for (const auto &e : _sections) {
if (!e.valid) continue;
printf("; %-20s %02x %02x %04x %04x\n",
e.name.c_str(), e.number, e.flags, e.size, e.org);
}
fputs(";\n", stdout);
fputs("; symbols\n", stdout);
for (const auto &s : _symbols) {
printf("; %-20s %02x %02x %02x %08x\n",
s.name.c_str(), s.type, s.flags, s.section, s.offset);
}
putchar('\n');
}
emit("", "endmod"); emit("", "endmod");
putchar('\n'); putchar('\n');
@ -243,7 +261,7 @@ void zrdz_disassembler::set_section(int section) {
return; return;
} }
auto &e = _sections[section]; auto &e = _sections[section];
if (!e.valid) { if (section >5 && !e.valid) {
warnx("Invalid section %d", section); warnx("Invalid section %d", section);
return; return;
} }

View File

@ -35,7 +35,7 @@ public:
void set_section(int); void set_section(int);
void front_matter(const std::string &module_name); void front_matter(const std::string &module_name);
void back_matter(); void back_matter(unsigned flags);
std::string location_name(unsigned section, uint32_t offset) const; std::string location_name(unsigned section, uint32_t offset) const;
std::string symbol_name(unsigned entry) const; std::string symbol_name(unsigned entry) const;