По сути просто пишем эмулфтор для платформы chip8.
Тесты вязты тут
Описание инструкций тут
- 16 регистров каждый по 8 бит
- Один адресный регистр размером в 12 бит
- 4 килобайта памяти
- Стек на 16 последних адресов возврата
- Адрес следующей команды на исполнение
Каждая инструкция состоит из 16 бит. Всего инструкций 34. Условно разделить их можно на несколько категорий
3XNN
Done
Пропустить следующую инструкцию если vX == NN
.
4XNN
Done
Пропустить следующую инструкцию если vX != NN
.
5XY0
Done
Пропустить следующую инструкцию если vX == vY
.
9XY0
Done
Пропустить следующую инструкцию если vX != vY
.
EX9E
Done
Пропустить следующую инструкцию если клавиша в 4 младших битах регистра vX
нажата.
EXA1
Done
Пропустить следующую инструкцию если клавиша в 4 младших битах регистра vX
отжата.
6XNN
Done
Установить в регистр vX
значение NN
.
8XY0
Done
Установить в регистр vX
значение регистра vY
.
ANNN
Done
Установить адресному регистру I
значение NNN
.
CXNN
Done
Установить в регистр vX
случайное значение с маской NN
через AND
.
FX07
Done
Установить в регистр vX
значение таймера задержки.
FX55
Done
Записать значения регистров с v0
до vX
в память начиная с адресса в I
.
FX65
Done
Загрузить значения регистров с v0
до vX
значениями из памяти начиная с адресса в I
.
FX33
Done
Записать значение в регистре vx
в виде двоично-десятичного кода(BCD) по адресам I
, I + 1
и I + 2
.
7XNN
Done
Прибавить в регистр vX
значение NN
.
8XY1
Done
Установить в регистр vX
значение vX OR vY
.
8XY2
Done
Установить в регистр vX
значение vX AND vY
.
8XY3
Done
Установить в регистр vX
значение vX XOR vY
.
FX1E
Done
Прибавить в адресный регистр I
значение регистра vX
.
8XY4
Done
Прибавить в регистр vX
значение регистра vY
. В регистр vF
установить 1 если случилось переполнение, в противном случае установить 0.
8XY5
Done
Вычесть из регистра vX
значение регистра vY
. В регистр vF
установить 0 если случилось антипереполнение, в противном случае установить 1.
8XY6
Done
Установить в регистр vX
значение регистра vY
и сдвинуть значение регистра vX
на 1 бит вправо. В регистр vF
установить значение вытесненного бита.
8XY7
Done
Установить в регистр vX
значение результата vY - vX
. В регистр vF
установить 0 если случилось антипереполнение, в противном случае установить 1.
8XYE
Done
Установить в регистр vX
значение регистра vY
и сдвинуть значение регистра vX
на 1 бит влево. В регистр vF
установить значение вытесненного бита.
00E0
Done
Очистка экрана. Очищает буффер экрана и гасит каждый пиксель.
DXYN
Done
Написовать спрайт размером 8 x N
пикселей начиная с позиции vX
, vY
. Данные спрайта храняться в памяти в виде последовательности байт по адресам I
..I + N
. Каждый байт это один ряд пикселей. Каждый ряд отрисовывается друг под другом путем выполнения XOR с текущими значениями пикселей. Если в процессе отрисовки любой пиксель был переведен из состояния 1 в 0, то в vF
нужно записаться 1, в противном случае 0.
FX15
Done
Установить в таймер задержки значение из регистра vX
.
FX18
Done
Установить в таймер звука значение из регистра vX
.
FX0A
Done
Дождаться нажатия и отжатия любой клавиши. Установить в регистр vX
значение этой клавиши.
1NNN
Done
Перейти на адрес 0xNNN
.
2NNN
Done
Положить на стек адрес возврата и перейти к выполнению подпрограммы по адресу 0xNNN
.
00EE
Done
Вернуться из подпрограммы на адрес сверху стека.
BNNN
Done
Перейти на адресс NNN + v0
.
Когда интерпритатор доходит до инструкции ожидания нажатия клавиши, он переходит в состояние ожидания. Платформа должна отдать последнюю нажатую и отжатую клавишу в промежутке между вызовами функции запроса нажатой клавиши интерпритатором. Если до запроса последней клавиши была нажата какая-то клавиша, то ее нужно пропустить и дождаться следующей.