Введение в эмуляцию: эмулятор CHIP-8

На нашем замечательном сайте никогда не было технических подробностей о том, что же на самом деле представляют собой эмуляторы. Как они работают, какие приемы программирования используются при их написании, что такое интерпретаторы и регистры процессора, опкоды, как осуществляется видео вывод, и многое другое. 
Цель преследуется простая: донести до пользователей хоть немного информации о принципах эмуляции, дать им начальное понимание того, как имитируется работа некой игровой платформы на современных домашних компьютерах. Надеюсь, вам это будет интересно.
В качестве примера я решил взять игровую систему из середины 70-х прошлого века: CHIP-8.


Строго говоря, CHIP-8 не является реальным железом – это небольшой интерпретируемый язык программирования, который лежит в основе игровых систем того времени. Скорее, он представляет собой виртуальную машину (наподобие JVM). Однако в нем есть всё, что необходимо для начала изучения принципов работы эмуляторов. К тому же, система на основе CHIP-8 является очень простой и как нельзя лучше подходит для образовательных целей. Для простоты представим, что CHIP-8 – это железная платформа, имеющая свой ЦП и набор команд, которые мы и будем эмулировать.  
При написании эмулятора любой системы необходимо найти как можно больше технической информации об эмулируемой платформе. Итак, для начала немного теории. 

Регистры.
Регистр процессора - это блок ячеек памяти, образующий сверхбыструю оперативную память (СОЗУ) внутри процессора; используется самим процессором и большой частью недоступен программисту: например, при выборке из памяти очередной команды она помещается в регистр команд,  к которому программист обратиться не может.
Существуют также так называемые регистры общего назначения (РОН), представляющие собой часть регистров процессора, использующихся без ограничения в арифметических операциях.
CHIP-8 имеет 16 восьмибитных регистров общего назначения. Это регистры V0 – VF. Регистр VF представляет собой флаг переноса - специальный флаг, устанавливаемый в результате арифметического переноса или сдвига со старшего значащего бита, и индикатор столкновения спрайтов.
Адресный регистр I используется для хранения адресов памяти.
Также существует еще два восьмибитных таймера: задержки и звука. Оба таймера с частотой 60 Гц уменьшают свое значение, пока не достигнут нуля. Когда значение звукового таймера достигает нуля, издается звук (да, в CHIP-8 был всего один звук – BEEP!).

Память.
CHIP-8 имеет 4 кБ основной памяти, в которой хранятся шрифты, загружается игра и т.д. Первый 512 байт памяти (адреса с 0x000h до 0x200h) зарезервированы – в них хранится оригинальный интерпретатор CHIP-8. Так что игре доступен диапазон памяти 0x200h – 0xFFFh, т.е. 3584 байт. Напомню, что в программировании при работе с памятью (и не только) принято использовать числа в шестнадцатеричном представлении. Что это и как с этим работать – подскажет Википедия.

Стек.
Стек используется для сохранения адреса возврата при завершении выполнения подпрограммы. У оригинальной версии приставки размер стека составляет 12 уровней вложения подпрограмм. Поскольку мы не ограничены в ресурсах, будем использовать 16 уровней вложений.

Графика.
Приставки на основе CHIP-8 имели монохромный дисплей с разрешением 64x32 пикселя. Вывод осуществляется спрайтами, которые всегда имеют ширину 8 пикселей и высоту от 1 до 15.  Если при рисовании один спрайт накладывается на другой, в точке наложения цвет инвертируется, а регистр VF принимает значение 1. Иначе он принимает значение 0.

Устройство ввода.
Ввод осуществляется с помощью 16 клавиш. В оригинальной приставке клавиши имеют коды от 0h до Fh.

Далее займемся непосредственно написанием ядра эмулятора и разбором опкодов. Последующие статьи будут иметь много специфичных подробностей касаемо программирования, писать будем на С++, а вывод графики и звука осуществим через SDL - небольшую мультимедийную библиотеку. В завершении мы напишем наш собственный, очень простой эмулятор CHIP-8, который однако будет обладать достаточно высокой совместимостью. На сегодня это всё.

Продолжение:
2 часть
0

Комментарии 2

  1. Vochatrak
    Vochatrak от 24 октября 2013 23:15
    Нужная и интересная статья.
  2. Kuro
    Kuro от 20 октября 2013 15:42
    Очень хорошая статья, жду следующих с нетерпением))
Добавить комментарий

Оставить комментарий