#include "opcode-handler-directory.h" #include "handler/flag-opcode-handler.h" #include "handler/register-opcode-handler.h" #include "handler/lda-opcode-handler.h" #include "handler/ldx-opcode-handler.h" #include "handler/stx-opcode-handler.h" #include "handler/sty-opcode-handler.h" #include "handler/stack-opcode-handler.h" #include #include OpcodeHandlerDirectory::OpcodeHandlerDirectory(shared_ptr program, shared_ptr reg_man, shared_ptr memory) { handlers = make_unique>>(); register_handler(make_shared(FlagOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(RegisterOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(LdaOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(LdxOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(StxOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(StyOpcodeHandler(program, reg_man, memory))); register_handler(make_shared(StackOpcodeHandler(program, reg_man, memory))); } void OpcodeHandlerDirectory::register_handler(shared_ptr handler) { for (auto opcode: *handler->get_handled_opcodes()) { handlers->insert({opcode, handler}); } } shared_ptr OpcodeHandlerDirectory::get_handler(uint8_t opcode) { if (handlers->find(opcode) == handlers->end()) { stringstream stream; stream << "No handler registered for opcode 0x" << hex << opcode; throw runtime_error(stream.str()); } return handlers->at(opcode); }