Как мне научиться писать эмулятор консоли?

Возможный дубликат:
Как эмуляторы работают и как они написаны?

Я бы хотел попробовать написать базовый эмулятор gameboy или, может быть, даже NES. Я знаю основы C и неплохо разбираюсь в Java, поэтому знаю необходимые основы программирования. Однако я не знаю, как люди обрабатывают все данные в программе на языке C и создают из нее эмулятор. Я знаю, что должен учиться на исходниках, но довольно сложно увидеть кучу строк кода, не зная, почему они там и что они должны делать. С чего начать, если я хочу научиться писать такой эмулятор?

Я искал в Интернете, но нашел только непонятные руководства, которые содержат слишком много ошибок, чтобы я мог их исправить. С чего мне начать?


person ZimZim    schedule 21.06.2012    source источник
comment
У меня есть набор симуляторов github.com/dwelch67. Сначала вам нужно выучить язык ассемблера для целевого процессора. , затем поработайте над дизассемблером, который дизассемблирует в порядке выполнения, в какой-то момент вы можете просто начать превращать его в симулятор набора команд. Затем вам нужно сделать эмуляторы для всей периферии. Поэтому вам понадобятся хорошие документы для эмулируемой системы.   -  person old_timer    schedule 22.06.2012
comment
Другой подход - статический двоичный транслятор SBT. dwelch.com/ipod/asteroids.htm - это то, что я сделал для ipod (классический ) С тех пор у меня еще много работы над этим, но нигде не опубликовано. Хороший учебник по теме. gtoal.com/sbt вы также можете выполнять динамический перевод, переводить на лету, а не статический . Я бы не стал пробовать динамику, пока вы не научитесь делать статику.   -  person old_timer    schedule 22.06.2012


Ответы (3)


Вы этого не сделаете. Вы эмулируете ТС. Вам вообще не нужно «обрабатывать» программные данные, вам нужно будет написать код, имитирующий ЦП, графическое оборудование, устройства ввода и т. Д.

Хорошим первым шагом, вероятно, было бы написать эмулятор Z-Machine, который, хотя и не был консолью, на самом деле был первым широко распространенным «эмулятором». Он использовался для всех текстовых приключений инфокомитета (зорк и т. Д.). Поскольку это текстовый формат игры, эмулировать не так много графики или звука, единственным устройством ввода является клавиатура, и вам не нужно беспокоиться о скорости выполнения / синхронизации.

Это очень хорошо задокументировано здесь: http://www.gnelson.demon.co.uk/zspec/preface.html

На самом деле, я собираюсь заняться этим проектом на днях, но у меня никогда не было времени.

person Tyler Eaves    schedule 21.06.2012
comment
Одна вещь, которая меня всегда интересовала, - это где именно можно найти спецификации для конкретной системы. Некоторые системы, как вы упомянули, очень хорошо документированы, но как насчет такого проекта, как Dolphin Emu? Действительно ли Nintendo представляет архитектуру своей консоли для всеобщего обозрения? - person voithos; 21.06.2012
comment
Много-много тяжелой работы и обратного проектирования. Иногда начиная, например, с распиновка на микросхемах, иногда доходит до наклеивания датчиков на фактическое оборудование во время работы системы. - person Tyler Eaves; 21.06.2012

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

Эмулятор ЦП в основном считывает байты программы, декодирует отдельные инструкции и выполняет их. Обычно вы выделяете большой массив для представления памяти устройства и некоторые переменные для представления регистров процессора. Вы имитируете выполнение инструкций, выполняя операции по одной над этими «регистрами» / ячейками памяти.

Вам также нужно будет найти информацию о вводе-выводе на устройстве, которое вы пытаетесь эмулировать - например, порты или области памяти, которые представляют ввод от определенных кнопок, адреса которых представляют экран и т. Д. На более новом устройстве ( но, как правило, не большинство старых) у вас также будет отдельный графический процессор, который вам нужно будет эмулировать. Вам нужно будет не только эмулировать этот процессор, но и то, как он подключен к основному процессору.

person Jerry Coffin    schedule 21.06.2012

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

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

Но если вы просто ищете очень образовательный проект, у меня есть другое предложение: напишите свой собственный интерпретатор схемы или напишите свой собственный интерпретатор FORTH. Оба они - минималистичные, элегантные языки (и оба с неосновными правилами синтаксиса!). Вы можете написать свою собственную схему или FORTH с нуля и запускать программы за считанные дни.

Это не игрушки, и писать их будет полезно.

Только представьте: получить копию SICP [1] и запустить программы в системе, которую вы написали сами! Или получить копию ПЕРВОЙ книги и решать задачи в системе, которую вы написали сами!

Если вас интересуют эти проекты, выполните поиск в Google по запросу «напишите интерпретатор схемы» и / или «напишите интерпретатор FORTH».

P.S. Когда я только начинал работать с компьютерами, я много времени проводил в FORTH, и это меня многому научило. Уроки, которые я извлек из этого, помогли мне на протяжении многих лет.

[1] http://sicpebook.wordpress.com/

person steveha    schedule 21.06.2012