Я бы сказал, что сначала вам нужно поработать над дизассемблером.Симулятор - это следующий шаг после дизассемблера.Например, дизассемблер x86 (или другие наборы команд переменной длины слова) должен следить за выполнением кода.Во-первых, он должен знать, основываясь на кодах операций, сколько байтов используется этой инструкцией, во-вторых, это ветвь и, если да, то какой, условный или безусловный, и реагировать соответственно.Симулятор делает все это плюс он имитирует регистры.Дизассемблер будет для образовательных целей, а не для полированной публикации на sourceforge.Достаточно, чтобы понять, как анализировать инструкции на уровне битов, вычислять смещения перехода.
Я бы начал с простого набора команд, такого как 12-битный рис, или 6502, или чего-то подобного (msp430 - это другоевозможный кандидат).Если вы идете с существующим набором инструкций для обучения написанию симулятора, вы можете использовать существующие инструментальные цепочки (ассемблеры и, возможно, компиляторы) для этой цели.Разделите задачу пополам.Для нового набора команд вам понадобится набор инструментов в какой-то момент или, по крайней мере, хороший дизассемблер, если вы хотите вручную написать машинный код (дизассемблер дважды проверяет, есть ли у вас машинный код, который вы хотели).Или вы можете иметь возможность в симуляторе выводить дизассемблированный код в порядке выполнения, который в любом случае хорош для отладки.
Сначала не беспокойтесь о прерываниях, но имейте в виду, что вам понадобится механизм остановкиПоток симуляции, сохранить состояние и повторно использовать симулятор для стольких тактов.Вы увидите множество симуляторов, по сути, по одному шагу каждой инструкции.Оценка количества тактов в каждой инструкции по аппаратным причинам либо для периодических прерываний, либо для другого смоделированного оборудования, которое должно быть синхронизировано с имитируемым процессором.Так что было бы неплохо начать с моделирования вашего образа жизни, а затем, при необходимости, придумать улучшения производительности.
Если вы не программировали с использованием конечных автоматов, я настоятельно рекомендую немного узнать о них и написать несколькотренировочные программы.
Я работаю над проектом и надеюсь опубликовать его, если я когда-нибудь закончу, может помочь с такими темами.Мои симуляторы набора команд в наши дни на самом деле написаны на языке проектирования аппаратного обеспечения (например, verilog, а не hdl, который я использую, но он конвертируется в verilog), а затем используют нечто вроде verilator с оболочкой C / C ++.Таким образом, работа, связанная с извлечением кодов операций и битов, выполняется языком, предназначенным для управления именно этим.А части, которые хотят имитировать периферию или предоставлять графический интерфейс или другие способы отображения происходящего, обрабатываются языком, разработанным для этого.Если вам довелось работать над проектом, в котором этот новый набор инструкций реализован в vhdl или verilog, я настоятельно рекомендую гибридный симулятор hdl plus с программным решением либо через VPI, если это коммерческий симулятор hdl, либо с помощью других более простых методов, если вы используете verilator.или икар верилог или гхдл или другие.(Икару может понадобиться реклама, такая как интерфейс vpi).Прелесть здесь в том, что вы ближе к реальному оборудованию, ошибки и бородавки и т. Д. В оборудовании могут быть найдены и устранены перед переходом на кремний, изменения или улучшения в оборудовании мгновенно реализуются в симуляции вместо того, чтобы выполнять сопоставлениеизменения или улучшения в симуляторе и т. д. У симуляторов hdl есть скриптовые языки или система C и т. д., которые отлично подходят для функциональной проверки оборудования, но вы не можете запустить его на кремнии.Если вы не одобряете использование этих инструментов и запускаете реальные двоичные файлы на смоделированной логике, и предоставляете уровень абстракции для реальных инструментов для загрузки, отладки или мониторинга (например, напишите бэкэнд в openocd для прохождения через хост к слою hdl simи поговорить с имитатором jtag на чипе, в зависимости от сложности этого проекта (вполне выполнимо, как я сделал это сам)).Эти реальные программы можно запускать как в симуляции, так и на кремнии, экономя время при написании тестов и создавая тестовое программное обеспечение задолго до того, как кремний прибудет, а не запускается после того, как он прибудет.Если это новый или иным образом набор инструкций для цепочки инструментов, вам придется потратить время на эту цепочку инструментов, по крайней мере, на ассемблер и компоновщик, и я бы сделал какой-то дизассемблер, а затем превратил бы этот дизассемблер или его части в первый вырез.на симуляторе.Что касается стандартных вещей, которые я видел в имитаторах наборов команд, то, по сути, мы думаем о единичном шаге, чтобы вы могли обрабатывать часы, прерывания и другое моделируемое оборудование.основная функция моделирования либо имитирует один тактовый цикл, который может быть не полной инструкцией (подход конечного автомата), либо основная функция моделирует одну инструкцию и возвращает модифицирующие регистры, флаги и память в соответствии с требованиями инструкции (и подсчет имитированных часов).В зависимости от того, насколько многофункциональным вы хотите, чтобы этот симулятор с самого начала выполнял чтение и запись ram / rom и регистрировал функции, чтобы вы могли в одном месте захватывать память и регистрировать изменения для отображения пользователю.Только доступ или, по крайней мере, изменение регистров и оперативной памяти через эти абстрактные функции.Кроме того, это просто тонна набора текста, чем сложнее набор команд, тем больше инструкций, тем больше строк кода для ввода.