Декодирование 68 тыс. Инструкций
Вопрос
Я пишу интерпретированный эмулятор 68K как личный/образовательный проект. Прямо сейчас я пытаюсь разработать простой, общий механизм декодирования.
Насколько я понимаю, первых двух байтов каждой инструкции достаточно, чтобы уникально идентифицировать операцию (за двумя редкими исключениями) и количество слов, оставшихся для чтения, если таковые имеются.
Вот что я хотел бы достичь на своей фазе декодирования:
1. read two bytes
2. determine which instruction it is
3. extract the operands
4. pass the opcode and the operands on to the execute phase
Я не могу просто перенести первые два байта в таблицу поиска, как я мог с первыми несколькими битами в арке RISC, потому что операнды «на пути». Как я могу сделать часть 2
в целом?
В целом, мой вопрос: Как удалить изменчивость операндов из процесса декодирования?
Больше фона:
Вот частичная таблица из Раздела 8.2 справочного руководства программиста:
Table 8.2. Operation Code Map
Bits 15-12 Operation
0000 Bit Manipulation/MOVEP/Immediate
0001 Move Byte
...
1110 Shift/Rotate/Bit Field
1111 Coprocessor Interface...
Для меня это имело большой смысл, но затем я смотрю на битовые узоры для каждой инструкции и замечаю, что нет ни одной инструкции, где биты 15-12-0001, 0010 или 0011. Должен быть какой-то большой кусок картинки что мне не хватает.
Этот Декодирование Z80 Opcodes Сайт явно объясняет декодирование, что я не нашел в справочном руководстве по программисту 68K или по Googling.
Решение
Я решил просто создать таблицу поиска со всеми возможными шаблонами для каждой инструкции. Это была моя первая идея, но я отказался от этого как «расточительного, неэлегантного». Теперь я принимаю это как «очень быстро».