Как мне научиться писать консольный эмулятор?
Возможный дубликат:
Как работают эмуляторы и как они написаны?
Я хотел бы попробовать написать базовый эмулятор геймбоя или, может быть, даже NES. Я знаю основы C и довольно хорошо разбираюсь в Java, поэтому я знаю необходимые основы программирования. Однако я не знаю, как люди обрабатывают все данные в C-программе и создают из нее эмулятор. Я знаю, что должен учиться из исходного кода, но довольно сложно увидеть кучу строк кода, не зная, почему они там и что они должны делать. С чего мне начать, если я хочу научиться писать такой эмулятор?
Я искал в Интернете, но я нашел только неясные учебники, которые содержат слишком много ошибок, чтобы разобраться самостоятельно. Где я должен начать?
3 ответа
Вы не Вы подражаете ТС. Вам вообще не нужно "обрабатывать" данные программы, вам нужно написать код, имитирующий процессор, графическое оборудование, устройства ввода и т. Д.
Хорошим первым шагом, вероятно, было бы написать эмулятор Z-Machine, который, хотя и не был консолью, на самом деле был первым распространенным "эмулятором". Он использовался для всех текстовых приключений (zork и т. Д.). Так как это текстово-ориентированный игровой формат, не нужно много подражать с точки зрения графики или звука, единственным устройством ввода является клавиатура, и вам не нужно беспокоиться о скорости выполнения / синхронизации.
Это очень хорошо задокументировано здесь: http://www.gnelson.demon.co.uk/zspec/preface.html
Это на самом деле проект, который я хочу осуществить на днях, просто так и не нашел время.
Консольный эмулятор - действительно большой проект, и я предсказываю, что для большинства из него это будет не очень весело; Вы должны получить много вещей прямо перед тем, как начнутся игры.
Возможно, было бы интереснее найти существующий проект с открытым исходным кодом, который пытается эмулировать консоль, и посмотреть, сможете ли вы найти какие-либо способы улучшить его.
Но если вы просто ищете очень образовательный проект, у меня есть другое предложение: напишите своего собственного интерпретатора Scheme или своего собственного переводчика FORTH. Оба они - минимальные, элегантные языки (и оба с неосновными правилами синтаксиса!). Вы можете написать свою собственную схему или FORTH с нуля и запускать программы в течение нескольких дней.
Это не игрушки, и написание их будет познавательным.
Представьте себе: получите копию SICP[1] и запустите программы в системе, которую вы написали сами! Или получить копию книги FORTH и решить проблемы в системе, которую вы написали сами!
Если вы заинтересованы в этих проектах, поищите в Google "написать интерпретатор схемы" и / или "написать интерпретатор FORTH".
PS Когда я только начинал работать с компьютерами, я провел много времени, взламывая FORTH, и это многому меня научило. Уроки, которые я извлек из этого, помогли мне на протяжении многих лет.
Вы, вероятно, начнете со сбора информации об оборудовании, которое хотите эмулировать. Процессор, пожалуй, самый большой и самый доступный, так что это разумная отправная точка.
Эмулятор ЦП в основном считывает байты программы, декодирует отдельные инструкции и выполняет их. Обычно вы выделяете большой массив для представления памяти устройства и некоторые переменные для представления регистров процессора. Вы моделируете выполнение инструкций, выполняя операции по одному на тех "регистрах"/ местах памяти.
Вам также нужно будет найти информацию о входах / выходах на устройстве, которое вы пытаетесь эмулировать - например, порты или области памяти, которые представляют ввод от определенных кнопок, адреса которых представляют экран и т. Д. На более новом устройстве (но, как правило, не большинство старых) у вас будет отдельный графический процессор, который вам нужно будет эмулировать. Вам нужно будет не только эмулировать этот процессор, но и то, как он подключен к основному процессору.