disassembler reserved space support.

This commit is contained in:
Kelvin Sherlock 2017-01-05 12:25:09 -05:00
parent 9d937e9c37
commit 43ac7ba514
3 changed files with 45 additions and 8 deletions

View File

@ -498,13 +498,52 @@ void disassembler::flush() {
void disassembler::check_labels() { void disassembler::check_labels() {
if ( _next_label >= 0 && _pc + _st >= _next_label) { if ( _next_label >= 0 && _pc + _st >= _next_label) {
//flush(); //flush(); // -- too recursive. see above.
if (_st) dump(); if (_st) dump();
_next_label = next_label(_pc); _next_label = next_label(_pc);
} }
} }
void disassembler::space(unsigned size) {
flush();
std::string line;
indent_to(line, kOpcodeTab);
line += "ds";
indent_to(line, kOperandTab);
while (size) {
uint32_t chunk;
if (_next_label == -1) chunk = size;
else {
chunk = _next_label - _pc;
chunk = std::min(chunk, size);
}
line.resize(kOperandTab);
line += std::to_string(chunk);
indent_to(line, kCommentTab);
line += "; ";
line += to_x(_pc, 4);
line.push_back(':');
line.push_back('\n');
fputs(line.c_str(), stdout);
_pc += chunk;
size -= chunk;
if (_next_label == _pc) _next_label = next_label(_pc);
}
}
void disassembler::operator()(const std::string &expr, unsigned size) { void disassembler::operator()(const std::string &expr, unsigned size) {
// todo -- what if label within size? // todo -- what if label within size?
@ -565,6 +604,8 @@ void disassembler::operator()(uint8_t byte) {
print(); print();
} }
void disassembler::print_prefix() { void disassembler::print_prefix() {
switch(_mode & 0xf000) { switch(_mode & 0xf000) {

View File

@ -19,6 +19,7 @@ class disassembler {
template<class T> template<class T>
void operator()(const T &t) { code(std::begin(t), std::end(t)); } void operator()(const T &t) { code(std::begin(t), std::end(t)); }
void space(unsigned bytes);
bool m() const { return _flags & 0x20; } bool m() const { return _flags & 0x20; }
bool x() const { return _flags & 0x10; } bool x() const { return _flags & 0x10; }

View File

@ -244,9 +244,7 @@ bool dump_obj(const char *name, int fd)
zrdz_disassembler d(read_sections(section_data), read_symbols(symbol_data)); zrdz_disassembler d(read_sections(section_data), read_symbols(symbol_data));
uint8_t op = REC_END; uint8_t op = REC_END;
unsigned section = SECT_CODE; // default section = CODE
unsigned line = 0; unsigned line = 0;
std::string file;
d.front_matter(std::string(oname.data())); d.front_matter(std::string(oname.data()));
@ -393,7 +391,7 @@ bool dump_obj(const char *name, int fd)
d.emit("", "longi", "off"); d.emit("", "longi", "off");
break; break;
case D_C_FILE: { case D_C_FILE: {
file = read_cstring(iter); std::string file = read_cstring(iter);
line = read_16(iter); line = read_16(iter);
std::string tmp = file + ", " + std::to_string(line); std::string tmp = file + ", " + std::to_string(line);
d.emit("", ".file", tmp); d.emit("", ".file", tmp);
@ -539,11 +537,8 @@ bool dump_obj(const char *name, int fd)
} }
case REC_SPACE: { case REC_SPACE: {
d.flush();
uint16_t count = read_16(iter); uint16_t count = read_16(iter);
// todo -- need to coordinate with label printer/disassembler. d.space(count);
d.emit("", "ds", d.to_x(count, 4, '$'));
d.set_pc(d.pc() + count);
break; break;
} }