Автоматизация цветовых эмуляторов GameBoy

Я пишу эмулятор цвета GameBoy на C, просто чтобы представить себя в этом мире, это не интерпретируется, ничего о динамической или статической перекомпиляции:P

Теперь я нахожусь в утомительной задаче реализации всех кодов операций процессора в коде C, я должен написать все это: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html и не хочу возьми их из другого эмулятора.

Вопрос в том, есть ли какой-нибудь способ автоматизации написания кодов операций? Может быть, это глупый вопрос, и он будет иметь глупый ответ, но я хочу работать как можно меньше.:)

3 ответа

Решение

Я делал подобные вещи раньше, и то, как я это делал, было с макросами, но, делая это таким образом, вы получаете множество дублирования кода, которое переполняет кэш процессора и замедляет работу. Если бы я делал это сегодня, я бы избавился от всей идиомы "переключатель кода / переходная таблица операций", за исключением непонятных / редких кодов операций, и написал бы общий код без ответвлений для всех обычных арифметических / логических операций, используя несколько небольших таблиц поиска на основе номер кода операции. Думайте что-то вроде:

operand1 = regs[operand1_table[opcode]];
operand2 = regs[operand2_table[opcode]];
res[ADD] = operand1+operand2;
res[SUB] = operand1-operand2;
res[OR] = operand1|operand2;
/* ... */
regs[dest_table[opcode]] = res[optype_table[opcode]];

Этот код, конечно, слишком упрощен, но может быть расширен для работы с операндами памяти и т. Д. Также обратите внимание, что инструкция перехода - это просто инструкция добавления с программным счетчиком в качестве одного из ее операндов.

Для дуг CISC, таких как Z80 (или вариант GB) или x86, вам также придется иметь дело с флагами кода состояния. Однако они могут быть выполнены в качестве второго набора вычислений, таких как res[...] = ...; те, что выше.

Я знаю, что это старый вопрос с ответом, но для справки, если у кого-то возникнет такая же проблема:

Я составил быстрый скрипт для разбора этой страницы документации и генерирования JSON с описанием кодов операций.

Вы можете просто загрузить этот JSON и сгенерировать из него исходный код вашего ассемблерного кода GB [dis], что должно явно сэкономить время, поскольку JSON легко манипулировать большинством языков сценариев.

Код и полученный JSON:

Вот почему до сих пор я делал только эмуляторы или статические перекомпиляторы для msp430, 6502 и большого пальца... меньше печатания. чтобы разрушить монотонность, я часто беру программу и игру, которую я хочу увидеть, и выполняю, пока она не достигнет кода операции, который я не реализовал, затем реализую этот код операции и попробуйте снова.

Что еще хуже, это то, что вам может потребоваться два или три эмулятора или две или три перезаписи этого эмулятора, прежде чем вы почувствуете, как вы могли бы сэкономить много печатать и / или как вы могли бы лучше разработать реформатор. б / логика. Пытаясь выполнить любимый ром, вы получаете случайный набор команд, который помещает вас в различные части таблицы кодов операций, и, когда вы повторно используете код для этих кодов операций, вы можете... возможно... сможете улучшить свой дизайн с меньшими затратами переписывает.

Как, вероятно, описывает Р., если вместо этого вы создадите электронную таблицу или другую таблицу, пригодную для анализа, вы можете написать и переписать генератор кода симулятора из этой таблицы. Здесь снова вы можете начать с малого, вам не нужно составлять полную таблицу, попробовать несколько разных вариантов кодов операций и посмотреть, не можете ли вы определить формат таблицы, который позволяет вашему анализатору генерировать код для симулятора. Позже вы можете добавить флаги и другие вещи и сделать весь процесс по мере его улучшения. Однако в конце дня, будь то таблица или фактический код, вам в конечном итоге придется ввести все эти коды операций.

Другие вопросы по тегам