Пишем эмулятор CHIP-8

Недавно, я нашел у своего друга сокровище - Game Boy Advance. Но затем я увидел его играя Pokemon Red на своём компьютере, потому-что картриджей у него не было. С этого момента мне стало интересно, насколько сложно сделать СВОЙ эмулятор.

CHIP-8 является языком программирования и имеет всего 35 инструкций, их также называют кодами операций. Чтобы эмулировать данный язык, нам надо создать интерпретатор для CHIP-8 который может выполнить все 35 инструкций. Список функций можете посмотреть на сайте https://johnearnest.github.io/Octo/docs/chip8ref.pdf

ЦП и Память

В системе CHIP-8 есть 16 регистров, каждый занимающий 8 бит (1 байт). Счетчик программ, 16 битный индексный регистр, заполнитель кода операции и указатель стека, у каждого размер 16 бит. Память это 4 Килобайта где первые 512 байта занимает интерпретатор, а все программы, написанные на CHIP-8 начинаются с локации 512. Требуется минимум 16-уровневый указатель стека, который используется для хранения мест возврата из регистра счетчика программ.

Таймеры

В CHIP-8 есть два таймера которые отсчитывают от 60 до 0. Таймер задержки используется для событий в программе и его значение может быть указано и прочитано. Таймер звука издает звук, когда она достигает нуля. После каждого исполнения операции, оба таймера уменьшаются на 1.

Ввод

В CHIP-8 есть 16 кнопок (0x0-0xF) которые обычно переводят на клавиатуру таким образом:

1 2 3 C        1 2 3 4
4 5 6 D   --\  Q W E R
7 8 9 E   --/  A S D F
A 0 B F        Z X C V

Обычно, кнопки 2, 4, 6 и 8 используются для направлений.

Имплементация

Вы можете найти мою не полную имплементацию на языке Python по ссылке GitHub вместе с файлами ROM. Я рекомендую использовать более быстрые языки программирования как Rust или C/C++, потому-что скомпилированные бинарные файлы высоко оптимизированы, что приводит к повышению производительности, что крайне важно для эмуляции в реальном времени.

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

Авторизуйтесь чтобы оставить комментарий

Обалдеть! Это круто!

Ответить