ss_int24_t and ss_uint24_t are integers
[lsnes.git] / src / interface / disassembler.cpp
blob3acc29f8ea56662d48d2d58e1389df0371e92eb9
1 #include "interface/disassembler.hpp"
2 #include <stdexcept>
3 #include <iostream>
5 namespace
7 template<typename T, bool be> T fetch_generic(std::function<unsigned char()> fetchpc)
9 size_t b = sizeof(T);
10 T res = 0;
11 for(size_t i = 0; i < b; i++) {
12 size_t bit = 8 * (be ? (b - i - 1) : i);
13 res |= (static_cast<T>(fetchpc()) << bit);
15 return res;
19 disassembler::disassembler(const std::string& _name)
21 disasms()[name = _name] = this;
24 disassembler::~disassembler()
26 disasms().erase(name);
29 disassembler& disassembler::byname(const std::string& name)
31 if(disasms().count(name))
32 return *disasms()[name];
33 throw std::runtime_error("No such disassembler known");
36 std::set<std::string> disassembler::list()
38 std::set<std::string> r;
39 for(auto& i : disasms())
40 r.insert(i.first);
41 return r;
44 std::map<std::string, disassembler*>& disassembler::disasms()
46 static std::map<std::string, disassembler*> x;
47 return x;
50 template<> int8_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
52 return fetch_generic<int8_t, false>(fetchpc);
55 template<> uint8_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
57 return fetch_generic<uint8_t, false>(fetchpc);
60 template<> int16_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
62 return fetch_generic<int16_t, false>(fetchpc);
65 template<> uint16_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
67 return fetch_generic<uint16_t, false>(fetchpc);
70 template<> int32_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
72 return fetch_generic<int32_t, false>(fetchpc);
75 template<> uint32_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
77 return fetch_generic<uint32_t, false>(fetchpc);
80 template<> int64_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
82 return fetch_generic<int64_t, false>(fetchpc);
85 template<> uint64_t disassembler::fetch_le(std::function<unsigned char()> fetchpc)
87 return fetch_generic<uint64_t, false>(fetchpc);
90 template<> int8_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
92 return fetch_generic<int8_t, true>(fetchpc);
95 template<> uint8_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
97 return fetch_generic<uint8_t, true>(fetchpc);
100 template<> int16_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
102 return fetch_generic<int16_t, true>(fetchpc);
105 template<> uint16_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
107 return fetch_generic<uint16_t, true>(fetchpc);
110 template<> int32_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
112 return fetch_generic<int32_t, true>(fetchpc);
115 template<> uint32_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
117 return fetch_generic<uint32_t, true>(fetchpc);
120 template<> int64_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
122 return fetch_generic<int64_t, true>(fetchpc);
125 template<> uint64_t disassembler::fetch_be(std::function<unsigned char()> fetchpc)
127 return fetch_generic<uint64_t, true>(fetchpc);