ЧИП-8


CHIP-8 — интерпретируемый язык программирования , разработанный Джозефом Вайсбекером на его микропроцессоре 1802 года . Первоначально он использовался в COSMAC VIP и Telmac 1800 , 8-битных микрокомпьютерах , созданных в середине 1970-х годов.
CHIP-8 был разработан так, чтобы его было легко программировать, а также использовать меньше памяти, чем другие языки программирования, такие как BASIC . [1]
Интерпретаторы были созданы для многих устройств, таких как домашние компьютеры , микрокомпьютеры , графические калькуляторы , мобильные телефоны и игровые приставки . [2] [3]
Сообщество
[ редактировать ]CHIP-8 с течением времени использовался на широком спектре устройств. Первое сообщество, использующее CHIP-8, началось в 1970-х годах на микрокомпьютерах . Они делились расширениями и программами в информационных бюллетенях, таких как VIPER ARESCO для VIP-пользователей COSMAC или DREAMER для пользователей DREAM 6800. [4] . В информационном бюллетене VIPER в первых трёх выпусках подробно описан машинный код интерпретатора CHIP-8 для VIP. [5]
В 1990-е годы начали создавать интерпретаторы CHIP-8 для графических калькуляторов . Яркие примеры включают CHIP-48 и SCHIP для HP-48 . [6]
Приложения CHIP-8 включают в себя оригинальные игры, демо-версии , а также воссоздания популярных игр из других систем. [7] Поскольку некоторые приложения CHIP-8 находятся в свободном доступе и используют такие лицензии, как лицензия Creative Commons Zero . [8] [9]
Расширения и вариации CHIP-8
[ редактировать ]В 1970-х и 1980-х годах пользователи CHIP-8 делились программами CHIP-8, а также изменениями и расширениями интерпретатора CHIP-8, как в журнале VIPER для COSMAC VIP. Эти расширения включали CHIP-10 и Hi-Res CHIP-8, которые обеспечивали более высокое разрешение, чем стандартное 64x32, а также CHIP-8C и CHIP-8X, которые расширяли возможности монохромного дисплея для поддержки ограниченного цвета, среди других функций. [10] Эти расширения были в основном обратно совместимы, поскольку были основаны на исходном интерпретаторе, хотя некоторые из них были перепрофилированы и редко использовали коды операций для новых инструкций. [11]
В 1979 году Electronics Australia опубликовала серию статей о создании комплектного компьютера, аналогичного COSMAC VIP, на основе архитектуры Motorola 6800 . [12] Этот компьютер DREAM 6800 имел собственную версию CHIP-8. Информационный бюллетень, аналогичный VIPER, под названием DREAMER [13] , использовался для обмена играми CHIP-8 для этого интерпретатора. В 1981 году Electronics Today International (ETI) опубликовала серию статей о создании компьютера ETI-660, который также был очень похож на VIP (и использовал тот же микропроцессор). ETI использовала обычные колонки ETI-660 и CHIP-8 общего назначения. [14] до 1985 года.
В 1990 году Андреас Густавссон создал интерпретатор CHIP-8 под названием CHIP-48. [15] для HP-48 графических калькуляторов . Позже Эрик Бринце создал еще один интерпретатор на основе CHIP-48. [16] под названием «СУПЕР-ЧИП», часто сокращаемым до SCHIP или S-CHIP. SCHIP расширил язык CHIP-8, добавив большее разрешение и несколько дополнительных кодов операций, призванных упростить программирование. [17]
Интерпретатор, дизассемблер и расширенная техническая документация Дэвида Винтера популяризировали CHIP-8/SCHIP на других платформах. В нем изложен полный список недокументированных опкодов и функций. [18] и был распространен на форумах любителей. Многие переводчики использовали эти произведения как отправную точку. [ нужна ссылка ]
Однако CHIP-48 слегка изменил семантику некоторых кодов операций, и SCHIP продолжал использовать эту новую семантику в дополнение к изменению других кодов операций. Многие онлайн-ресурсы о CHIP-8 распространяют эту новую семантику, поэтому многие современные игры CHIP-8 не имеют обратной совместимости с исходным интерпретатором CHIP-8 для COSMAC VIP, даже если они специально не используют новые расширения SCHIP. [19]
Некоторые расширения берут коды операций или поведение из нескольких расширений, например XO-CHIP, который частично заимствует поведение из SCHIP и CHIP-8E. [20]
Описание виртуальной машины
[ редактировать ]Память
[ редактировать ]CHIP-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, где интерпретатор изначально работает за пределами пространства памяти 4 КБ, нет необходимости избегать нижних 512 байт памяти (0x000-0x1FF), и данные шрифтов обычно хранятся там.
Регистры
[ редактировать ]CHIP-8 имеет 16 8- битных данных регистров с именами от V0 до VF. Регистр VF служит флагом для некоторых инструкций; таким образом, этого следует избегать. В операции сложения VF является флагом переноса , а в операции вычитания — флагом отсутствия заимствования. В инструкции рисования VF устанавливается при столкновении пикселей.
Адресный регистр I имеет ширину 12 бит и используется с несколькими кодами операций , включающими операции с памятью.
Стек
[ редактировать ]Стек вызове используется только для хранения адресов возврата при . подпрограмм Исходная версия RCA 1802 выделяла 48 байт для 12 уровней вложенности; [21] современные реализации обычно имеют больше. [22] [23]
Таймеры
[ редактировать ]CHIP-8 имеет два таймера. Они оба ведут обратный отсчет с частотой 60 Гц , пока не достигнут 0.
- Таймер задержки: этот таймер предназначен для отсчета времени событий в играх. Его значение можно установить и прочитать.
- Звуковой таймер: этот таймер используется для звуковых эффектов. Когда его значение не равно нулю, раздается звуковой сигнал. Его значение можно только установить.
Вход
[ редактировать ]Ввод осуществляется с помощью шестигранной клавиатуры с 16 клавишами от 0 до F. Клавиши «8», «4», «6» и «2» обычно используются для направленного ввода. Для обнаружения ввода используются три кода операции. Один пропускает инструкцию, если нажата определенная клавиша, а другой делает то же самое, если конкретная клавиша не нажата. Третий ожидает нажатия клавиши, а затем сохраняет его в одном из регистров данных.
Графика и звук
[ редактировать ]CHIP-8 Оригинальное разрешение дисплея составляет 64×32 пикселей , цвет монохромный . Графика выводится на экран исключительно путем рисования спрайтов , которые имеют ширину 8 пикселей и высоту от 1 до 15 пикселей. Пиксели спрайта подвергаются операции XOR с соответствующими пикселями экрана. Другими словами, установленные пиксели спрайта меняют цвет соответствующего пикселя экрана, а неустановленные пиксели спрайта ничего не делают. Флаг переноса (VF) устанавливается в 1, если какие-либо пиксели экрана переворачиваются из установленного в неустановленное состояние при рисовании спрайта, и устанавливается в 0 в противном случае. Это используется для обнаружения столкновений.
Как описано ранее, звуковой сигнал воспроизводится, когда значение звукового таймера не равно нулю.
Таблица кодов операций
[ редактировать ]CHIP-8 имеет 35 опкодов , все из которых имеют длину два байта и хранятся с прямым порядком байтов . Коды операций перечислены ниже в шестнадцатеричном формате и со следующими символами:
- ННН: адрес
- NN: 8-битная константа
- N: 4-битная константа
- X и Y: 4-битный идентификатор регистра.
- ПК: счетчик программ
- I: 12-битный регистр (для адреса памяти) (аналогично указателю void);
- ВН: Одна из 16 доступных переменных. N может быть от 0 до F (шестнадцатеричный);
С 1978 года было множество реализаций набора команд CHIP-8. Следующая спецификация основана на спецификации SUPER-CHIP 1991 года (но без дополнительных кодов операций, обеспечивающих расширенную функциональность), поскольку сегодня это наиболее часто встречающийся набор расширений. . Сноски обозначают несовместимость с исходным набором инструкций CHIP-8 1978 года.
Код операции | Тип | C Псевдо | Объяснение |
---|---|---|---|
0NNN | Вызов | Вызывает процедуру машинного кода ( RCA 1802 для COSMAC VIP) по адресу NNN. Не требуется для большинства ПЗУ. [24] | |
00E0 | Отображать | disp_clear() | Очищает экран. [24] |
00EE | Поток | return; | Возврат из подпрограммы. [24] |
1ННН | Поток | goto NNN; | Переходит к адресу NNN. [24] |
2ННН | Поток | *(0xNNN)() | Вызывает подпрограмму в NNN. [24] |
3XNN | Условия | if (Vx == NN) | Пропускает следующую инструкцию, если VX равно NN (обычно следующая инструкция представляет собой переход для пропуска блока кода). [24] |
4XNN | Условия | if (Vx != NN) | Пропускает следующую инструкцию, если VX не равно NN (обычно следующая инструкция представляет собой переход для пропуска блока кода). [24] |
5XY0 | Условия | if (Vx == Vy) | Пропускает следующую инструкцию, если VX равно VY (обычно следующая инструкция представляет собой переход для пропуска блока кода). [24] |
6XNN | Конст | Vx = NN | Устанавливает VX в NN. [24] |
7XNN | Конст | Vx += NN | Добавляет NN в VX (флаг переноса не изменяется). [24] |
8XY0 | Ассиг | Vx = Vy | Устанавливает VX в значение VY. [24] |
8XY1 | БитОп | Vx |= Vy | Устанавливает VX в VX или VY. (побитовая операция ИЛИ). [24] |
8XY2 | БитОп | Vx &= Vy | Устанавливает VX на VX и VY. (побитовая операция И). [24] |
8XY3 [а] | БитОп | Vx ^= Vy | Sets VX to VX xor VY. [24] |
8XY4 | Математика | Vx += Vy | Добавляет VY в VX. VF устанавливается в 1, когда есть переполнение, и в 0, когда его нет. [24] |
8XY5 | Математика | Vx -= Vy | VY вычитается из VX. VF устанавливается в 0, когда есть опустошение, и в 1, когда его нет. (т.е. VF устанавливается в 1, если VX >= VY, и в 0 в противном случае). [24] |
8XY6 [а] | БитОп | Vx >>= 1 | Сдвигает VX вправо на 1, затем сохраняет младший бит VX до сдвига в VF. [б] [24] |
8XY7 [а] | Математика | Vx = Vy - Vx | Устанавливает VX в VY минус VX. VF устанавливается в 0, когда есть опустошение, и в 1, когда его нет. (т.е. VF устанавливается в 1, если VY >= VX). [24] |
8 ЛЕТ [а] | БитОп | Vx <<= 1 | Сдвигает VX влево на 1, затем устанавливает VF в 1, если старший бит VX был установлен до этого сдвига, или в 0, если он не был установлен. [б] [24] |
9XY0 | Условия | if (Vx != Vy) | Пропускает следующую инструкцию, если VX не равно VY. (Обычно следующая инструкция — это переход для пропуска блока кода). [24] |
АНН | МЕМ | I = NNN | Устанавливает I по адресу NNN. [24] |
БННН | Поток | PC = V0 + NNN | Переходит по адресу NNN плюс V0. [24] |
CXNN | Рэнд | Vx = rand() & NN | Устанавливает VX в результат побитовой операции со случайным числом (обычно: от 0 до 255) и NN. [24] |
ДКСИН | Отображать | draw(Vx, Vy, N) | Рисует спрайт по координатам (VX, VY) шириной 8 пикселей и высотой N пикселей. Каждая строка из 8 пикселей считывается как битовая, начиная с ячейки памяти I; Значение I не меняется после выполнения этой инструкции. Как описано выше, VF устанавливается в 1, если какие-либо пиксели экрана переворачиваются из установленного в неустановленное состояние при рисовании спрайта, и в 0, если этого не происходит. [24] |
EX9E | KeyOp | if (key() == Vx) | Пропускает следующую инструкцию, если нажата клавиша, хранящаяся в VX (обычно следующая инструкция представляет собой переход для пропуска блока кода). [24] |
ЕХА1 | KeyOp | if (key() != Vx) | Пропускает следующую инструкцию, если клавиша, хранящаяся в VX, не нажата (обычно следующая инструкция представляет собой переход для пропуска блока кода). [24] |
FX07 | Таймер | Vx = get_delay() | Устанавливает VX на значение таймера задержки. [24] |
FX0A | KeyOp | Vx = get_key() | Ожидается нажатие клавиши, а затем сохраняется в VX (операция блокировки, все инструкции приостанавливаются до следующего нажатия клавиши). [24] |
FX15 | Таймер | delay_timer(Vx) | Устанавливает таймер задержки на VX. [24] |
FX18 | Звук | sound_timer(Vx) | Устанавливает звуковой таймер на VX. [24] |
FX1E | МЕМ | I += Vx | Добавляет VX к I. VF не затрагивается. [с] [24] |
FX29 | МЕМ | I = sprite_addr[Vx] | Устанавливает I в местоположение спрайта персонажа в VX. Символы 0–F (в шестнадцатеричном формате) представлены шрифтом 4x5. [24] |
FX33 | двоично-десятичный код | set_BCD(Vx)*(I+0) = BCD(3);*(I+1) = BCD(2);*(I+2) = BCD(1); | Сохраняет двоично-десятичное представление VX с цифрами сотен в памяти в ячейке I, цифрой десятков в ячейке I+1 и цифрой единиц в ячейке I+2. [24] |
FX55 | МЕМ | reg_dump(Vx, &I) | Сохраняет в памяти от V0 до VX (включая VX), начиная с адреса I. Смещение от I увеличивается на 1 для каждого записанного значения, но само I остается неизмененным. [д] [24] |
FX65 | МЕМ | reg_load(Vx, &I) | Заполняет значения из памяти от V0 до VX (включая VX), начиная с адреса I. Смещение от I увеличивается на 1 для каждого прочитанного значения, но само I остается неизмененным. [д] [24] |
Примечания
[ редактировать ]- ^ Перейти обратно: а б с д 1802 года Логические коды операций 8XY3, 8XY6, 8XY7 и 8XYE не были задокументированы в исходной спецификации CHIP-8, поскольку все 8000 кодов операций были отправлены на инструкции в ALU и не находились в самом интерпретаторе; Таким образом, эти четыре дополнительных кода операции, по-видимому, были непреднамеренной функциональностью.
- ^ Перейти обратно: а б Коды операций 8XY6 и 8XYE CHIP-8 (инструкции сдвига битов), которые на самом деле были недокументированными кодами операций в исходном интерпретаторе, сдвигали значение в регистре VY и сохраняли результат в VX. Реализации CHIP-48 и SCHIP вместо этого игнорировали VY и просто сдвигали VX. [19]
- ^ Инструкции FX1E большинства интерпретаторов CHIP-8 не влияют на VF, за одним исключением: интерпретатор CHIP-8 для Commodore Amiga устанавливает VF в 1, когда происходит переполнение диапазона (I + VX> 0xFFF), и в 0, когда происходит переполнение диапазона. нет. [25] Единственная известная игра, которая зависит от такого поведения, — это Spacefight 2091!, в то время как по крайней мере одна игра, Animal Race, зависит от того, не затрагивается ли VF.
- ^ Перейти обратно: а б В исходной реализации CHIP-8, а также в CHIP-48 I остается увеличенным после выполнения этой инструкции. В SCHIP I остается неизмененным.
Внешние ссылки
[ редактировать ]- FPGA SuperChip Реализация Verilog спецификации SCHIP.
- Octo — это онлайн-среда разработки CHIP-8, система разработки, компилятор/ассемблер и эмулятор с собственным языком сценариев.
- Cadmium — это интерпретатор CHIP-8 для компьютеров с графическим интерфейсом , который позволяет выбирать точную эмуляцию различных расширений и реализаций CHIP-8.
- Silicon8 Эмулятор CHIP-8 для веб-браузеров.
Дальнейшее чтение
[ редактировать ]- Таблица вариантов кодов операций CHIP-8 — точная ссылка на коды операций для CHIP-8 и нескольких расширений, включая CHIP-48, SCHIP 1.0, 1.1, XO-CHIP.
- Освоение CHIP-8 — точная ссылка на исходный набор команд CHIP-8.
- Технический справочник Cowgod's Chip-8 содержит неточности и упущения в нескольких инструкциях.
- Мэтт Миколай: Справочник по расширениям CHIP-8
- Группа RCA COSMAC на Yahoo , с авторизованными сканами журнала VIPER.
- CHIP-8.com Руководство по эксплуатации компьютера CHIP-8 Classic
- Архив сайта Chip8.com, посвященный CHIP-8 и связанным с ним системам. Поддерживал в сети большую коллекцию программ CHIP-8.
- «Руководство по эксплуатации RCA COSMAC VIP CDP18S711», RCA Solid State Division, Сомервилл, Нью-Джерси, 08776, февраль 1978 г. Часть VIP-311. стр. 13–18, 35–37.
- Журнал BYTE , декабрь 1978 г. , стр. 108–122. «Простая система программирования», Джозеф Вайсбекер . Описывает CHIP-8 на конкретном примере игры-тира с ракетным кораблем и НЛО.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Простая система программирования». БАЙТ . Том. 3, нет. 12 декабря 1978 г. с. 108.
- ^ «Главная страница эмулятора CHIP-8» .
- ^ «Сцена взлома Nintendo Game & Watch переносит Pokémon, CHIP-8 и многое другое на портативный компьютер за 50 долларов» . 8 декабря 2020 г.
- ^ https://archive.org/details/dreamer_newsletter_01/mode/2up
- ^ « VIPER для VIP-владельцев RCA» . Журнал «Интеллектуальные машины» ( InfoWorld ) . Медиа-группа InfoWorld. 11 декабря 1978 г. п. 9 . Проверено 30 января 2010 г.
- ^ «[Что я узнал о] Python и эмуляторах, [путем] создания эмулятора Chip-8» . 15 декабря 2019 г.
- ^ «Главная страница эмулятора CHIP-8» .
- ^ «ПЗУ Chip-8 Public Domain — Домен Зофара» .
- ^ Архив ЧИП-8
- ^ Справочник по расширениям CHIP-8 Мэтью Миколея
- ^ https://github.com/trapexit/chip-8_documentation
- ^ https://archive.org/stream/EA1979/EA%201979-05%20May#page/n85/mode/2up
- ^ https://archive.org/details/dreamer_newsletter_01/mode/2up
- ^ https://archive.org/stream/ETIA1981/ETI%201981-11%20November#page/n113/mode/2up
- ^ «Исходный код CHIP-48» . Гитхаб .
- ^ Документация КОРАБЛЯ 1.1
- ^ Репозиторий HP48-Superchip на GitHub
- ^ CHIP8.pdf Дэвида ВИНТЕРА (HPMANIAC)
- ^ Перейти обратно: а б Освоение раздела совместимости SuperChip
- ^ «Спецификация XO-CHIP Джона Эрнеста» . Гитхаб .
- ^ RCA COSMAC VIP CDP18S711 Инструкция по эксплуатации . Сомервилл: Отдел полупроводников RCA. 1978. с. 36.
- ^ Грин, Томас П. (30 августа 1997 г.). «Технический справочник Cowgod's Chip-8» . devernay.free.fr . Архивировано из оригинала 3 января 2024 г. Проверено 3 февраля 2020 г.
- ^ Николай, Матвей. «Освоение CHIP-8: Подпрограммы» . mattmik.com . Проверено 3 февраля 2020 г.
- ^ Перейти обратно: а б с д и ж г час я дж к л м н тот п д р с т в v В х и С аа аб и объявление но из в ах есть Шуман, Штеффен «Гульрак». «Таблица вариантов кодов операций CHIP-8» . Chip8.gulrak.net .
- ^ «FX1E и VF · Проблема № 2 · Хроматофор/HP48-Superchip · GitHub» . Гитхаб .