mirror of
https://github.com/ksherlock/wdc-utils.git
synced 2024-12-30 13:29:18 +00:00
code/data
This commit is contained in:
parent
a2bc0d353c
commit
a8812f9d00
@ -338,6 +338,11 @@ void disassembler::reset() {
|
|||||||
_st = 0;
|
_st = 0;
|
||||||
}
|
}
|
||||||
void disassembler::dump() {
|
void disassembler::dump() {
|
||||||
|
|
||||||
|
if (!_st) return;
|
||||||
|
|
||||||
|
hexdump();
|
||||||
|
|
||||||
printf("\tbyte\t");
|
printf("\tbyte\t");
|
||||||
|
|
||||||
for (unsigned i = 0; i < _st; ++i) {
|
for (unsigned i = 0; i < _st; ++i) {
|
||||||
@ -352,6 +357,10 @@ void disassembler::dump() {
|
|||||||
void disassembler::dump(const std::string &expr, unsigned size) {
|
void disassembler::dump(const std::string &expr, unsigned size) {
|
||||||
if (_st) dump();
|
if (_st) dump();
|
||||||
|
|
||||||
|
for (_st = 0; _st < size; ++_st) _bytes[_st] = 0;
|
||||||
|
|
||||||
|
hexdump();
|
||||||
|
|
||||||
switch(size) {
|
switch(size) {
|
||||||
case 1: printf("\tbyte\t"); break;
|
case 1: printf("\tbyte\t"); break;
|
||||||
case 2: printf("\tword\t"); break;
|
case 2: printf("\tword\t"); break;
|
||||||
@ -360,24 +369,54 @@ void disassembler::dump(const std::string &expr, unsigned size) {
|
|||||||
default: printf("\t%d bytes\t", size);
|
default: printf("\t%d bytes\t", size);
|
||||||
}
|
}
|
||||||
printf("%s\n", expr.c_str());
|
printf("%s\n", expr.c_str());
|
||||||
_pc += _size;
|
_pc += _st;
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void disassembler::code(const std::string &expr, unsigned size) {
|
|
||||||
if (_st != 1 || size != _size) {
|
|
||||||
dump(expr, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
print(expr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void disassembler::flush() {
|
void disassembler::flush() {
|
||||||
if (_st) dump();
|
if (_st) dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void disassembler::data(uint8_t byte) {
|
||||||
|
if (_type == 0) {
|
||||||
|
flush();
|
||||||
|
_type = 1;
|
||||||
|
}
|
||||||
|
_bytes[_st++] = byte;
|
||||||
|
if (_st == 4) dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void disassembler::data(const std::string &expr, unsigned size) {
|
||||||
|
if (_type == 0 || _st) {
|
||||||
|
flush();
|
||||||
|
_type = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dump(expr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void disassembler::code(const std::string &expr, unsigned size) {
|
||||||
|
|
||||||
|
if (_type) { flush(); _type = 0; }
|
||||||
|
|
||||||
|
if (_st != 1 || size != _size) {
|
||||||
|
dump(expr, size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(int i = 0; i < size; ++i) _bytes[_st++] = 0;
|
||||||
|
print(expr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void disassembler::code(uint8_t byte) {
|
void disassembler::code(uint8_t byte) {
|
||||||
|
|
||||||
|
if (_type) { flush(); _type = 0; }
|
||||||
|
|
||||||
_bytes[_st++] = byte;
|
_bytes[_st++] = byte;
|
||||||
if (_st == 1) {
|
if (_st == 1) {
|
||||||
_op = byte;
|
_op = byte;
|
||||||
@ -460,7 +499,22 @@ void disassembler::print_suffix() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void disassembler::hexdump() {
|
||||||
|
// print pc and hexdump...
|
||||||
|
int i;
|
||||||
|
printf("%04x:", _pc);
|
||||||
|
for (i = 0; i < _st; ++i) {
|
||||||
|
printf(" %02x", _bytes[i]);
|
||||||
|
}
|
||||||
|
for ( ; i < 4; ++i) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void disassembler::print() {
|
void disassembler::print() {
|
||||||
|
|
||||||
|
hexdump();
|
||||||
|
|
||||||
printf("\t%.3s", &opcodes[_op * 3]);
|
printf("\t%.3s", &opcodes[_op * 3]);
|
||||||
|
|
||||||
print_prefix();
|
print_prefix();
|
||||||
@ -481,6 +535,9 @@ void disassembler::print() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void disassembler::print(const std::string &expr) {
|
void disassembler::print(const std::string &expr) {
|
||||||
|
|
||||||
|
hexdump();
|
||||||
|
|
||||||
printf("\t%.3s", &opcodes[_op * 3]);
|
printf("\t%.3s", &opcodes[_op * 3]);
|
||||||
|
|
||||||
print_prefix();
|
print_prefix();
|
||||||
|
@ -18,6 +18,11 @@ class disassembler {
|
|||||||
template<class T>
|
template<class T>
|
||||||
void code(const T &t) { code(std::begin(t), std::end(t)); }
|
void code(const T &t) { code(std::begin(t), std::end(t)); }
|
||||||
|
|
||||||
|
|
||||||
|
void data(uint8_t byte);
|
||||||
|
void data(const std::string &expr, unsigned size);
|
||||||
|
|
||||||
|
|
||||||
bool m() const { return _flags & 0x20; }
|
bool m() const { return _flags & 0x20; }
|
||||||
bool x() const { return _flags & 0x10; }
|
bool x() const { return _flags & 0x10; }
|
||||||
uint32_t pc() const { return _pc; }
|
uint32_t pc() const { return _pc; }
|
||||||
@ -32,7 +37,7 @@ class disassembler {
|
|||||||
else _flags &= ~0x10;
|
else _flags &= ~0x10;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_pc(uint32_t pc) { pc = _pc; }
|
void set_pc(uint32_t pc) { _pc = pc; }
|
||||||
|
|
||||||
void flush();
|
void flush();
|
||||||
|
|
||||||
@ -49,6 +54,8 @@ class disassembler {
|
|||||||
void print_prefix();
|
void print_prefix();
|
||||||
void print_suffix();
|
void print_suffix();
|
||||||
|
|
||||||
|
void hexdump();
|
||||||
|
|
||||||
unsigned _st = 0;
|
unsigned _st = 0;
|
||||||
uint8_t _op = 0;
|
uint8_t _op = 0;
|
||||||
unsigned _size = 0;
|
unsigned _size = 0;
|
||||||
@ -57,6 +64,8 @@ class disassembler {
|
|||||||
unsigned _flags = 0x30;
|
unsigned _flags = 0x30;
|
||||||
unsigned _pc = 0;
|
unsigned _pc = 0;
|
||||||
unsigned _arg = 0;
|
unsigned _arg = 0;
|
||||||
|
|
||||||
|
unsigned _type = 0; // code / data.
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -437,6 +437,7 @@ void dump_obj(const char *name, int fd)
|
|||||||
case REC_SECT: {
|
case REC_SECT: {
|
||||||
|
|
||||||
d.flush();
|
d.flush();
|
||||||
|
d.set_pc(0);
|
||||||
uint8_t sec = read_8(iter);
|
uint8_t sec = read_8(iter);
|
||||||
printf("\t.sect\t%d\n", sec);
|
printf("\t.sect\t%d\n", sec);
|
||||||
if (sec != section) {
|
if (sec != section) {
|
||||||
@ -510,7 +511,7 @@ void dump_obj(const char *name, int fd)
|
|||||||
|
|
||||||
|
|
||||||
// symbol info
|
// symbol info
|
||||||
|
#if 0
|
||||||
printf("\nSymbols\n");
|
printf("\nSymbols\n");
|
||||||
|
|
||||||
iter = symbol_data.begin();
|
iter = symbol_data.begin();
|
||||||
@ -541,7 +542,7 @@ void dump_obj(const char *name, int fd)
|
|||||||
printf("offset: %04x\n", offset);
|
printf("offset: %04x\n", offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user