ЧИП-8 - CHIP-8

Скриншот Понг реализовано в ЧИП-8
Telmac 1800 запуск игры CHIP-8 Space Intercept (Джозеф Вайсбекер, 1978)

ЧИП-8 является интерпретированный язык программирования, разработан Джозеф Вайсбекер. Первоначально он использовался на COSMAC VIP и Telmac 1800 8 бит микрокомпьютеры в середине 1970-х гг. ЧИП-8 программы работают на ЧИП-8 виртуальная машина. Это было сделано для того, чтобы видеоигры чтобы их было легче программировать для этих компьютеров.

Примерно через пятнадцать лет после появления CHIP-8 появились производные интерпретаторы для некоторых моделей графические калькуляторы (с конца 1980-х годов эти карманные устройства во многих отношениях обладают большей вычислительной мощностью, чем большинство микрокомпьютеров середины 1970-х для любителей).

Активное сообщество пользователей и разработчиков существовало в конце 1970-х, начиная с информационного бюллетеня ARESCO «VIPer», первые три выпуска которого раскрывали машинный код интерпретатора CHIP-8.[1]

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

На CHIP-8 портирован ряд классических видеоигр, например Понг, Космические захватчики, Тетрис, и Pac-Man. Есть также такие приложения, как генератор случайных лабиринтов и Игра жизни Конвея. Сообщается, что эти программы помещены в всеобщее достояние, и его легко найти на Интернет.

Расширения и варианты CHIP-8

В течение 1970-х и 1980-х годов пользователи CHIP-8 делились программами CHIP-8, а также изменениями и расширениями интерпретатора CHIP-8 в информационном бюллетене пользователей COSMAC VIP, журнале VIPER. Эти расширения включали CHIP-10 и Hi-Res CHIP-8, которые обеспечивали более высокое разрешение, чем стандартное 64x32, и CHIP-8C и CHIP-8X, которые расширяли возможности монохромного дисплея для поддержки ограниченного цвета, среди других функций.[2] Эти расширения были в основном обратно совместимы, так как они были основаны на исходном интерпретаторе, хотя некоторые из них были перепрофилированы и редко использовали коды операций для новых инструкций.[3]

В 1979 г. Электроника Австралия опубликовал серию статей о создании компьютерного комплекта, подобного COSMAC VIP, на основе Motorola 6800 архитектура.[4] Этот компьютер, DREAM 6800, поставлялся со своей собственной версией CHIP-8. Информационный бюллетень, подобный VIPER, называется DREAMER.[5], использовался для обмена играми CHIP-8 для этого интерпретатора. В 1981 г. Electronics Today International (ETI) опубликовала серию статей о создании компьютера ETI-660, который также был очень похож на VIP (и использовал тот же микропроцессор). ETI запускала обычные колонки ETI-660 и обычные CHIP-8.[6] до 1985 года.

В 1990 году был создан интерпретатор CHIP-8 под названием CHIP-48 для HP-48 графические калькуляторы так игры можно было легче программировать. Позднее Эрик Бринце создал еще один интерпретатор на основе CHIP-48, названный SCHIP, S-CHIP или Super-Chip. SCHIP расширил язык CHIP-8 за счет большего разрешения и нескольких дополнительных кодов операций, призванных облегчить программирование.[7] Если бы не развитие интерпретатора CHIP-48, CHIP-8 не был бы сегодня так широко известен.[нужна цитата ]

Эмулятор, дизассемблер и расширенная техническая документация Дэвида Винтера популяризировали CHIP-8 / SCHIP на многих других платформах. Он выложил полный список недокументированных кодов операций и функций.[8], и был распространен на многих форумах любителей. Многие эмуляторы использовали эти работы как отправную точку.

Однако CHIP-48 слегка изменил семантику некоторых кодов операций, и SCHIP продолжал использовать эту новую семантику в дополнение к изменению других кодов операций. Многие онлайн-ресурсы о CHIP-8 распространяют эту новую семантику, поэтому многие современные игры CHIP-8 не обратная совместимость с исходным интерпретатором CHIP-8 для COSMAC VIP, даже если они специально не используют новые расширения SCHIP.[9]

ЧИП-8 сегодня

Практически для каждой платформы есть реализация CHIP-8, а также некоторые инструменты разработки. Несмотря на это, для CHIP-8 существует лишь небольшое количество игр.

Хотя CHIP-8 и SCHIP обычно реализовывались как эмуляторы, чисто аппаратная реализация (написанная в Verilog язык) тоже существует наверняка FPGA доски.

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

объем памяти

Чип-8 чаще всего реализовывался в системах 4K, таких как Cosmac VIP и Telmac 1800. Эти машины имели 4096 (0x1000) ячеек памяти, все из которых 8-битные ( байт ), откуда и возник термин CHIP-8. Однако интерпретатор CHIP-8 сам занимает первые 512 байт пространства памяти на этих машинах. По этой причине большинство программ, написанных для исходной системы, начинаются с ячейки памяти 512 (0x200) и не получают доступа ни к одной из областей памяти ниже ячейки 512 (0x200). Самые верхние 256 байтов (0xF00-0xFFF) зарезервированы для обновления дисплея, а 96 байтов ниже (0xEA0-0xEFF) зарезервированы для стека вызовов, внутреннего использования и других переменных.

В современных реализациях CHIP-8, где интерпретатор изначально работает за пределами области памяти 4K, нет необходимости избегать нижних 512 байтов памяти (0x000-0x200), и данные шрифтов обычно хранятся там.

Регистры

ЧИП-8 имеет 16 8-кусочек данные регистры с именами от V0 до VF. Регистр VF служит флагом для некоторых инструкций; таким образом, этого следует избегать. В дополнительной операции VF - это нести флаг, в то время как при вычитании это флаг "не заимствовать". В инструкции рисования VF устанавливается при столкновении пикселей.

Адресный регистр с именем I имеет ширину 16 бит и используется с несколькими коды операций которые включают операции с памятью.

Стек

В куча используется только для хранения обратных адресов, когда подпрограммы называются. Оригинал RCA 1802 версия выделяла 48 байт для до 12 уровней вложенности;[10] современные реализации обычно имеют больше.[11][12]

Таймеры

ЧИП-8 имеет два таймера. Они оба отсчитывают до 60 герц, пока они не достигнут 0.

  • Таймер задержки: этот таймер предназначен для использования для определения времени событий игр. Его значение можно установить и прочитать.
  • Звуковой таймер: этот таймер используется для звуковых эффектов. Когда его значение не равно нулю, раздается звуковой сигнал.

Вход

Ввод осуществляется с помощью шестнадцатеричный клавиатура который имеет 16 клавиш в диапазоне от 0 до F. Клавиши «8», «4», «6» и «2» обычно используются для направленного ввода. Для обнаружения ввода используются три кода операции. Один пропускает инструкцию, если нажата определенная клавиша, а другой делает то же самое, если конкретная клавиша нажата. нет нажал. Третий ждет нажатия клавиши и затем сохраняет его в одном из регистров данных.

Графика и звук

Оригинальный ЧИП-8 Разрешение экрана 64 × 32 пиксели, а цвет монохромный. Графика выводится на экран исключительно путем рисования спрайты, которые имеют ширину 8 пикселей и могут быть от 1 до 16 пикселей в высоту. Пиксели спрайтов XOR d с соответствующими пикселями экрана. Другими словами, установленные пиксели спрайта меняют цвет соответствующего пикселя экрана, а неустановленные пиксели спрайта ничего не делают. Флаг переноса (VF) устанавливается в 1, если какие-либо пиксели экрана меняются с установленного на неустановленное при рисовании спрайта, и в 0 в противном случае. Это используется для обнаружения столкновений.

Как описано ранее, звуковой сигнал воспроизводится, когда значение таймера звука не равно нулю.

Таблица кодов операций

ЧИП-8 имеет 35 коды операций, которые имеют длину два байта и хранятся прямой порядок байтов. Коды операций перечислены ниже в шестнадцатеричном формате со следующими символами:

  • NNN: адрес
  • NN: 8-битная константа
  • N: 4-битная константа
  • X и Y: 4-битный идентификатор регистра
  • ПК: Программный счетчик
  • I: 16-битный регистр (для адреса памяти) (аналогично указателю void)
  • В.Н .: Одна из 16 доступных переменных. N может быть от 0 до F (шестнадцатеричный)

С 1978 года было реализовано множество реализаций набора команд CHIP-8. Следующая спецификация основана на спецификации SUPER-CHIP 1991 года (но без дополнительных кодов операций, обеспечивающих расширенную функциональность), поскольку это наиболее часто встречающийся набор расширений на сегодняшний день. . Сноски указывают на несовместимость с исходным набором инструкций CHIP-8 1978 года.

Код операцииТипC ПсевдоОбъяснение
0NNNВызовВызывает процедуру машинного кода (RCA 1802 для COSMAC VIP) по адресу NNN. Не требуется для большинства ПЗУ.
00E0Отображатьdisp_clear ()Очищает экран.
00EEПотоквозвращаться;Возврат из подпрограммы.
1NNNПотокgoto NNN;Переход к адресу NNN.
2NNNПоток* (0xNNN) ()Вызывает подпрограмму в NNN.
3XNNCondесли (Vx == NN)Пропускает следующую инструкцию, если VX равно NN. (Обычно следующая инструкция - это переход для пропуска блока кода)
4XNNCondесли (Vx! = NN)Пропускает следующую инструкцию, если VX не равно NN. (Обычно следующая инструкция - это переход для пропуска блока кода)
5XY0Condесли (Vx == Vy)Пропускает следующую инструкцию, если VX равно VY. (Обычно следующая инструкция - это переход для пропуска блока кода)
6XNNConstVИкс = NNУстанавливает VX в NN.
7XNNConstVИкс + = NNДобавляет NN в VX. (Флаг переноса не изменен)
8XY0НазначатьVИкс= VyУстанавливает VX в значение VY.
8XY1BitOpVx = VИкс| VуУстанавливает VX в VX или же VY. (Побитовая операция ИЛИ)
8XY2BitOpVx = VИкс&VуУстанавливает VX в VX и VY. (Побитовая операция И)
8XY3[а]BitOpVx = Vx ^ VyУстанавливает VX в VX xor VY.
8XY4МатематикаVx + = VyДобавляет VY в VX. VF устанавливается на 1, когда есть перенос, и на 0, когда его нет.
8XY5МатематикаVx - = VyVY вычитается из VX. VF устанавливается в 0, когда есть заем, и 1, когда нет.
8XY6[а]BitOpVx >> = 1Сохраняет младший бит VX в VF, а затем сдвигает VX вправо на 1.[b]
8XY7[а]МатематикаVx = Vy-VxУстанавливает VX в VY минус VX. VF устанавливается в 0, когда есть заем, и 1, когда нет.
8XYE[а]BitOpVx << = 1Сохраняет старший бит VX в VF, а затем сдвигает VX влево на 1.[b]
9XY0Condесли (Vx! = Vy)Пропускает следующую инструкцию, если VX не равно VY. (Обычно следующая инструкция - это переход для пропуска блока кода)
ИННMEMI = NNNУстанавливает I в адрес NNN.
BNNNПотокПК = V0 + NNNПереход по адресу NNN плюс V0.
CXNNRandVx = rand () & NNУстанавливает VX как результат побитовой операции и операции со случайным числом (обычно: от 0 до 255) и NN.
DXYNDispничья (Vx, Vy, N)Рисует спрайт в координатах (VX, VY), имеющий ширину 8 пикселей и высоту N + 1 пикселей. Каждая строка из 8 пикселей считывается как битовая, начиная с ячейки памяти I; Значение I не меняется после выполнения этой инструкции. Как описано выше, VF устанавливается в 1, если какие-либо пиксели экрана переворачиваются из установленного в неустановленное при рисовании спрайта, и в 0, если этого не происходит.
EX9EKeyOpесли (ключ () == Vx)Пропускает следующую инструкцию, если нажата клавиша, сохраненная в VX. (Обычно следующая инструкция - это переход для пропуска блока кода)
EXA1KeyOpесли (ключ ()! = Vx)Пропускает следующую инструкцию, если клавиша, хранящаяся в VX, не нажата. (Обычно следующая инструкция - это переход для пропуска блока кода)
FX07ТаймерVx = get_delay ()Устанавливает VX на значение таймера задержки.
FX0AKeyOpVx = get_key ()Ожидается нажатие клавиши, а затем сохраняется в VX. (Операция блокировки. Все инструкции остановлены до следующего ключевого события)
FX15Таймерdelay_timer (Vx)Устанавливает таймер задержки на VX.
FX18Звукsound_timer (Vx)Устанавливает звуковой таймер на VX.
FX1EMEMI + = VxДобавляет VX к I. VF не изменяется.[c]
FX29MEMI = sprite_addr [Vx]Устанавливает I в положение спрайта персонажа в VX. Символы 0-F (в шестнадцатеричном формате) представлены шрифтом 4x5.
FX33BCDset_BCD (Vx);

* (I + 0) = BCD (3);

* (I + 1) = BCD (2);

* (I + 2) = BCD (1);

Хранит двоично-десятичная дробь представление VX со старшей из трех цифр в адресе в I, средней цифрой в I плюс 1 и младшей цифрой в I плюс 2. (Другими словами, возьмите десятичное представление VX, поместите сотни цифра в памяти в ячейке I, разряда десятков в ячейке I + 1 и разряда единиц в ячейке I + 2.)
FX55MEMreg_dump (Vx, и я)Сохраняет V0 в VX (включая VX) в памяти, начиная с адреса I. Смещение от I увеличивается на 1 для каждого записанного значения, но сам I остается неизменным.[d]
FX65MEMreg_load (Vx, & I)Заполняет V0 до VX (включая VX) значениями из памяти, начиная с адреса I. Смещение от I увеличивается на 1 для каждого записанного значения, но сам I остается неизменным.[d]

Примечания

  1. ^ а б c d Логические коды операций 8XY3, 8XY6, 8XY7 и 8XYE не были задокументированы в исходной спецификации CHIP-8, поскольку все 8000 кодов операций были отправлены инструкциям в 1802-х годах. ALU, а не в самом интерпретаторе; Таким образом, эти три дополнительных кода операций предположительно были непреднамеренными.
  2. ^ а б Коды операций 8XY6 и 8XYE в CHIP-8 (инструкции сдвига битов), которые фактически были недокументированными кодами операций в исходном интерпретаторе, смещали значение в регистре VY и сохраняли результат в VX. Реализации CHIP-48 и SCHIP вместо этого игнорировали VY и просто сдвигали VX.[9]
  3. ^ Команды FX1E большинства интерпретаторов CHIP-8 не влияют на VF, за одним исключением: интерпретатор CHIP-8 для Commodore Amiga устанавливает VF в 1, когда есть переполнение диапазона (I + VX> 0xFFF), и в 0, когда нет т.[13] Единственная известная игра, которая зависит от этого поведения, - Spacefight 2091! в то время как по крайней мере одна игра, Animal Race, не зависит от VF.
  4. ^ а б В исходной реализации CHIP-8, а также в CHIP-48 значение I остается увеличенным после выполнения этой инструкции. В SCHIP я оставлен без изменений.

Рекомендации

  1. ^ "VIPER для владельца RCA VIP ». Журнал "Интеллектуальные машины" (InfoWorld ). Информационная группа InfoWorld. 1978-12-11. п. 9. Получено 2010-01-30.
  2. ^ https://github.com/mattmikolay/chip-8/wiki/CHIP‐8-Extensions-Reference
  3. ^ https://github.com/trapexit/chip-8_documentation
  4. ^ https://archive.org/stream/EA1979/EA%201979-05%20May#page/n85/mode/2up
  5. ^ https://archive.org/details/dreamer_newsletter_01/mode/2up
  6. ^ https://archive.org/stream/ETIA1981/ETI%201981-11%20November#page/n113/mode/2up
  7. ^ https://github.com/Chromatophore/HP48-Superchip
  8. ^ http://vanbeveren.byethost13.com/stuff/CHIP8.pdf
  9. ^ а б https://github.com/JohnEarnest/Octo/blob/gh-pages/docs/SuperChip.md#compatibility
  10. ^ RCA COSMAC VIP CDP18S711 Руководство по эксплуатации. Somerville: RCA Solid State Division. 1978. стр. 36.
  11. ^ "Технический справочник Cowgod's Chip-8". devernay.free.fr. Получено 2020-02-03.
  12. ^ Миколай, Мэтью. «Осваиваем ЧИП-8: Субрутины». mattmik.com. Получено 2020-02-03.
  13. ^ https://github.com/Chromatophore/HP48-Superchip/issues/2

дальнейшее чтение

  • «Руководство по эксплуатации RCA COSMAC VIP CDP18S711», RCA Solid State Division, Somerville, NJ 08776, февраль 1978 г. Часть VIP-311. С. 13–18, 35–37.
  • Журнал BYTE, Декабрь 1978 г. С. 108–122. «Простая система программирования», автор: Джозеф Вайсбекер. Описывает CHIP-8 с конкретным примером игры-тира с ракетным кораблем и НЛО.
  • Архив Chip8.com Веб-сайт, посвященный CHIP-8 и родственным системам. Поддерживает самую полную коллекцию программ CHIP-8 в сети.
  • Освоение CHIP-8, точная ссылка на исходный набор инструкций CHIP-8
  • ЧИП-8 Дэвида Винтера Эмулятор, утилиты и игры.
  • BytePusher Минималистичная виртуальная машина, вдохновленная CHIP-8.
  • Группа RCA COSMAC на Yahoo, с авторизованными сканами журнала VIPER.
  • OChip8 Эмулятор CHIP-8 в браузере
  • Мечта 6800 Популярный микрокомпьютер Dream 6800, представленный в Австралии в 1979 году, работал с чипом CHIP-8.
  • FPGA SuperChip Реализация Verilog спецификации SCHIP.
  • Octo представляет собой онлайн-среду разработки CHIP-8, систему разработки, компилятор / ассемблер и эмулятор с проприетарным языком сценариев
  • Чип Cowgod's-8 Технический справочник (CHIP-48 / SCHIP)
  • Мэтт Миколай Справочник по расширениям CHIP-8
  • CHIP-8.com CHIP-8 Classic Компьютерное руководство