Автоматизация цветовых эмуляторов GameBoy - PullRequest
2 голосов
/ 25 марта 2011

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

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

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

Ответы [ 3 ]

6 голосов
/ 25 марта 2011

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

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[...] = ...; выше.

4 голосов
/ 12 февраля 2014

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

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

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

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

3 голосов
/ 25 марта 2011

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

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

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

...