CHIP-8 (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:06, 23 января 2016.
CHIP-8
Класс языка:

алгоритмический, интерпретируемый

Появился в:

1970-e

Автор:

Джозеф Уэйсбекер

Расширение файлов:

.c8

Сайт:

chip8.com

CHIP-8 — интерпретируемый язык программирования, разработанный Джозефом Уэйсбекером (англ. Joseph Weisbecker) для коммерческих 8-ми разрядных микрокомпьютеров RCA COSMAC VIP и Telmac 1800, в середине 70-х. Все программы CHIP-8 запускаются на виртуальной машине CHIP-8. Сделано это было для облегчения создания игр для компьютеров.

TELMAC 1800 и COSMAC VIP имели процессор CDP-1802 (как и приставка RCA Studio II). В комплекте с ними шла кассета с 12 играми (1977 год). Оригинальное разрешение экрана CHIP-8 составляло 64x32 пикселя. Выпускались компьютеры с разрешением 64x48 или 64x64, например у TELMAC была вторая версия интерпретатора - CHIP-82 для "высокого разрешения". Правда, в наше время не найдено ни одной программы, использующей это проемущество, так что, CHIP8 использует только режим 64x32.

CHIP-8 приложения

Простота языка позволила без особых затруднений написать игры класса Pong, Brix, а позже Invaders и Tank. Некоторые из них имели размер в районе 256 байт! Из-за маленького объёма памяти (COSMAC VIP – 2Кб, TELMAC – 4Кб), CHIP-8 был очень компактным и занимал всего 512 байт. Интерпретатор обрабатывал менее 40 инструкций, отвечающих за арифметический операции, а так же работу с графикой и звуком.

Спустя почти 12 лет CHIP-8 стал использоваться в некоторых графических калькуляторах. Увидели свет такие "современные игры" как Tetris и Pac-Man.

CHIP-8 сегодня

CHIP-8 портировали на многие платформы, от современных, до самых примитивных: DOS, Windows, Linux, Atari XL/XE, Atari Lynx, калькуляторы TI, Commodore 64, GameBoy, Coleco ADAM, MSX, ColecoVision, ZX Spectrum, Sega Master System. Список далеко не полный.

У CHIP-8 есть потомок под названием SCHIP (Super Chip), разработанный Эриком Брюнсе (Erik Bryntse). В 1990 году был создан CHIP-48, интерпретатор CHIP-8 для графического калькулятора HP-84. Теперь программирование игр упростилось. Его расширения для CHIP-8 и известно как SCHIP, который предоставляет большее разрешение и несколько дополнительных опкодов, облегчающих написание программ. CHIP-8 не был бы так известен сейчас, если бы не разработали CHIP-48.

Дэвид Винтер (David Winter), написавший эмулятор, дизассемблер и документацию по S/CHIP-8 стал одним из тех, кто популяризировал CHIP-8 в наши дни. Он же адаптировал многие хиты прошлых лет для интерпретатора.

Описание виртуальной машины

Память

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

Регистры

CHIP-8 имеет 16 восьмибитных регистров общего назначения. Это регистры V0 – VF. Регистр VF представляет собой флаг переноса - специальный флаг, устанавливаемый в результате арифметического переноса или сдвига со старшего значащего бита, и индикатор столкновения спрайтов. Адресный регистр I используется для хранения адресов памяти.

Стек

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

Таймеры

Также существует два восьмибитных таймера: задержки и звука. Оба таймера с частотой 60 Гц уменьшают своё значение, пока не достигнут нуля.

  • Таймер задержки: этот таймер используется для работы с событиями в приложениях. В него можно писать, и из него можно читать.
  • Звуковой таймер: этот таймер используется для звуковых эффектов. При ненулевом значении издаётся звук "БИП".

Ввод

Ввод осуществляется с помощью 16 клавиш. В оригинальной приставке клавиши имеют коды от 0h до Fh. За обработку вводка отвечают три опкода. Один пропускает инструкцию при нажатии определенной клавиши, другой делает то же самое, если определенная клавиша не была нажата. Третий ожидать нажатия клавиши и затем сохраняет её в один из регистров данных.

Графика

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

Инструкции CHIP-8

CHIP-8 содержит 35 инструкций (опкодов) длиной по 2 байта, записанных в big-endian. Ниже представлен список опкодов в шестнадцатеричном виде со следующими обозначениями:

NNN – Адрес
NN – 8-битная константа
N – 4-битная константа
X и Y – номер 4-битного регистра
Инструкция Описание
0NNN Перейти на машинный код RCA 1802 по адресу NNN. Эта инструкция была только в самой первой реализации CHIP-8
00E0 Очистить экран
00EE Возврат из подпрограммы
1NNN Перейти по адресу NNN
2NNN Вызов подпрограммы по адресу NNN
3XNN Пропустить следующую инструкцию, если VX = NN
4XNN Пропустить следующую инструкцию, если VX != NN
5XY0 Пропустить следующую инструкцию, если VX = VY
6XNN Загрузить в регистр VX число NN
7XNN Загрузить в регистр VX сумму VX и NN
8XY0 Присвоить регистру VX значение VY
8XY1 Выполнить операцию логическое “ИЛИ” над значениями регистров VX и VY, результат сохранить в VX
8XY2 Выполнить операцию логическое “И” над значениями регистров VX и VY, результат сохранить в VX
8XY3 Выполнить операцию исключающее “ИЛИ” над значениями регистров VX и VY, результат сохранить в VX
8XY4 Значения VX и VY суммируются. Если результат больше, чем 255 , то VF установить в 1, иначе 0. Только младшие 8 бит результата сохраняются в VX
8XY5 Y вычитается из VX, результат сохранить в VX. Если VX >= VY, то VF установить в 1, иначе 0
8XY6 Операция сдвига вправо на 1 бит. Сдвигается регистр VX. Если младший бит (самый правый) регистра VX равен 1, то VF = 1, иначе VF = 0
8XY7 Если VY >= VX, то VF = 1, иначе 0. Тогда VX вычитается из VY, и результат сохраняется в VX
8XYE Операция сдвига влево на 1 бит. Сдвигается регистр VX. Если младший бит (самый правый) регистра VX равен 1, то VF = 1, иначе VF = 0
9XY0 Пропустить следующую инструкцию, если VX != VY
ANNN Значение регистра I устанавливается в NNN
BNNN Перейти по адресу NNN + V0
CXNN VX = (Случайное число от 0 до 255) & NN
DXYN Нарисовать на экране спрайт. Эта инструкция считывает N байт по адресу в регистре I и рисует их на экране в виде спрайта с координатами VX, VY
EX9E Пропустить следующую инструкцию если клавиша, номер которой хранится в регистре VX, нажата
EXA1 Пропустить следующую инструкцию если клавиша, номер которой хранится в регистре VX, не нажата
FX07 Регистру VX присваивается значение таймера задержки
FX0A Ждать нажатия любой клавиши. Как только клавиша будет нажата, записать ее номер в регистр VX и перейти к выполнению следующей инструкции
FX15 Установить значение таймера задержки равным значению регистра VX
FX18 Установить значение звукового таймера равным значению регистра VX
FX1E Присвоить регистру I сумму I и VX
FX29 Используется для вывода на экран символов встроенного шрифта размером 4x5 пикселей. Команда загружает в регистр I адрес спрайта, значение которого находится в VX. Например, нам надо вывести на экран цифру 5. Для этого загружаем в VX число 5. Потом команда LD F, VX загрузит адрес спрайта, содержащего цифру 5, в регистр I
FX33 Сохранить значение регистра VX в двоично-десятичном представлении по адресам I, I+1 и I+2
FX55 Сохранить значения регистров от V0 до VX в памяти, начиная с адреса в I
FX65 Загрузить значения регистров от V0 до VX из памяти, начиная с адреса в I

Инструкции SCHIP

SCHIP (Super CHIP) использует все инструкции CHIP-8 (кроме 0NNN), а так же добавляет следующие:

Инструкция Описание
00CN Прокрутить экран на N строк вниз
00FB Прокрутить экран на 4 (2) пикселя вправо в режиме 128x64 (64x32)
00FC Прокрутить экран на 4 (2) пикселя влево в режиме 128x64 (64x32)
00FD Завершить программу
00FE Установить разрешение экрана 64x32
00FF Установить разрешение экрана 128x64
DXY0 Аналогично инструкции DXYN , но рисует спрайты 8x16 (16x16) в режиме 64x32 (128x64)
FX30 Аналогично инструкции FX20 , но загружает спрайты 8x10
FX75 Сохранить регистры V0 … VX в пользовательских флагах RPL
FX85 Загрузить регистры V0 … VX из пользовательских флагов RPL

Дополнительные ресурсы

  • David Winter's CHIP-8 – Эмулятор, утилиты и игры.
  • Let's Emu : CHIP-8 Emulator – Список CHIP-8 и SCHIP эмуляторов.
  • BytePusher – Минималистичная виртуальная машина, вдохновлённая CHIP-8.
  • OChip8 – Браузерный эмулятор CHIP-8