Я начал писать эмулятор DCPU-16, используя это спецификация v1.7. Я начал разрабатывать архитектуру, и мне не нравится тот факт, что я использую очень длинные операторы switch. Я впервые пишу эмулятор, и поэтому я не знаю, есть ли лучший способ сделать это. Пока переключатели не тот большой, из-за небольшого количества кодов операций DCPU (и факта, что я фактически еще не реализовал инструкции), я могу себе представить, если бы я писал эмулятор для большего набора команд, операторы switch были бы огромный.
Anywhom, вот мой код.
РЕДАКТИРОВАТЬ: я забыл объяснить мой вопрос:
Этот подход кажется мне разумным. Это, конечно, как я бы это сделал (я написал несколько эмуляторов процессора и аналогичных типов кода).
Ближайшая альтернатива — это набор указателей на функции, но некоторые из ваших случаев, вероятно, будут довольно простыми (например, cpu_regs.flags &= ~CARRY
или же if (cpu_regs.flags & CARRY) do_rel_jump(next_byte());
поэтому использование указателей на функции замедлит вас.
Вы можете объединить все «Операции не указаны» в одно место, что значительно сократит количество строк, но количество случаев, конечно, останется прежним [если вы не поместите его в default:
].
Других решений пока нет …