#include "opcode-handler-directory.h" #include "handler/load-opcode-handler-container.h" #include "handler/store-opcode-handler-container.h" #include "handler/transfer-opcode-handler-container.h" #include "handler/maths-opcode-handler-container.h" #include "handler/bitwise-opcode-handler-container.h" #include "handler/status-opcode-handler-container.h" #include "handler/compare-opcode-handler-container.h" #include "handler/stack-opcode-handler-container.h" #include "handler/branch-opcode-handler-container.h" #include "handler/jump-opcode-handler-container.h" #include "handler/system-opcode-handler-container.h" #include "../utils.h" namespace emu_6502 { OpcodeHandlerDirectory::OpcodeHandlerDirectory() : handler_containers{}, handlers{} { handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); handler_containers.push_back(make_unique()); init_handlers(); } void OpcodeHandlerDirectory::init_handlers() { for (auto& hc : handler_containers) { for (auto& h : hc->get_handlers()) { handlers.insert({h.first, h.second}); } } } void OpcodeHandlerDirectory::execute(uint8_t opcode, Machine& machine) { auto func = handlers.find(opcode); if (func == handlers.end()) throw runtime_error("No appropriate handler for opcode 0x" + uint_to_hex(opcode)); func->second(machine); } }