wdc-utils/disassembler.h

62 lines
1.1 KiB
C
Raw Normal View History

2016-12-25 05:04:17 +00:00
#ifndef __disassembler_h__
#define __disassembler_h__
#include <stdint.h>
#include <string>
class disassembler {
public:
disassembler() = default;
2016-12-25 17:38:12 +00:00
void code(uint8_t byte);
void code(const std::string &expr, unsigned size);
2016-12-25 05:04:17 +00:00
template<class Iter>
2016-12-25 17:38:12 +00:00
void code(Iter begin, Iter end) { while (begin != end) code(*begin++); }
2016-12-25 05:04:17 +00:00
template<class T>
2016-12-25 17:38:12 +00:00
void code(const T &t) { code(std::begin(t), std::end(t)); }
2016-12-25 05:04:17 +00:00
bool m() const { return _flags & 0x20; }
bool x() const { return _flags & 0x10; }
uint32_t pc() const { return _pc; }
void set_m(bool x) {
if (x) _flags |= 0x20;
2016-12-25 07:42:28 +00:00
else _flags &= ~0x20;
2016-12-25 05:04:17 +00:00
}
void set_x(bool x) {
if (x) _flags |= 0x10;
2016-12-25 07:42:28 +00:00
else _flags &= ~0x10;
2016-12-25 05:04:17 +00:00
}
void set_pc(uint32_t pc) { pc = _pc; }
void flush();
private:
void reset();
void dump();
void dump(const std::string &expr, unsigned size);
void print();
void print(const std::string &expr);
void print_prefix();
void print_suffix();
unsigned _st = 0;
uint8_t _op = 0;
unsigned _size = 0;
unsigned _mode = 0;
uint8_t _bytes[4];
unsigned _flags = 0x30;
unsigned _pc = 0;
unsigned _arg = 0;
};
#endif