CHIP-8 (язык программирования)
Последнее изменение этой страницы: 02:06, 23 января 2016.
Класс языка: |
алгоритмический, интерпретируемый |
---|---|
Появился в: |
1970-e |
Автор: |
Джозеф Уэйсбекер |
Расширение файлов: |
.c8 |
Сайт: |
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
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.