
Kazakh
Недавно, я нашел у своего друга сокровище - 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++, потому-что скомпилированные бинарные файлы высоко оптимизированы, что приводит к повышению производительности, что крайне важно для эмуляции в реальном времени.
Жақында мен досымнан Қазына таптым - Game Boy Advance. Бірақ содан кейін мен оның Pokemon ойындарын компьютерімде көрдім, өйткені оның картридждері жоқ. Осы сәттен бастап мен эмуляторды жасау қаншалықты қиын деп ойладым.
CHIP-8-бағдарламалау тілі және ода тек 35 Нұсқаулық бар, оларды операциялық кодтар деп те атайды. Берілген тілге еліктеу үшін біз барлық 35 нұсқаулықты орындай алатын CHIP-8 аудармашысын жасауымыз керек. Мүмкіндіктер тізімін веб-сайттан көре аласыз https://johnearnest.github.io/Octo/docs/chip8ref.pdf
CHIP-8 жүйесінде әрқайсысы 8 бит (1 байт) алатын 16 регистр бар. Бағдарлама есептегіші, 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++ ретінде пайдалануды ұсынамын, себебі құрастырылған бинарлық файлдар жоғары оңтайландырылған, нәтижесінде өнімділік жақсарады, бұл нақты уақыттағы эмуляция үшін өте маңызды.