ЧИП-8 - CHIP-8
ЧИП-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. |
3XNN | Cond | если (Vx == NN) | Пропускает следующую инструкцию, если VX равно NN. (Обычно следующая инструкция - это переход для пропуска блока кода) |
4XNN | Cond | если (Vx! = NN) | Пропускает следующую инструкцию, если VX не равно NN. (Обычно следующая инструкция - это переход для пропуска блока кода) |
5XY0 | Cond | если (Vx == Vy) | Пропускает следующую инструкцию, если VX равно VY. (Обычно следующая инструкция - это переход для пропуска блока кода) |
6XNN | Const | VИкс = NN | Устанавливает VX в NN. |
7XNN | Const | VИкс + = NN | Добавляет NN в VX. (Флаг переноса не изменен) |
8XY0 | Назначать | VИкс= Vy | Устанавливает VX в значение VY. |
8XY1 | BitOp | Vx = VИкс| Vу | Устанавливает VX в VX или же VY. (Побитовая операция ИЛИ) |
8XY2 | BitOp | Vx = VИкс&Vу | Устанавливает VX в VX и VY. (Побитовая операция И) |
8XY3[а] | BitOp | Vx = Vx ^ Vy | Устанавливает VX в VX xor VY. |
8XY4 | Математика | Vx + = Vy | Добавляет VY в VX. VF устанавливается на 1, когда есть перенос, и на 0, когда его нет. |
8XY5 | Математика | Vx - = Vy | VY вычитается из VX. VF устанавливается в 0, когда есть заем, и 1, когда нет. |
8XY6[а] | BitOp | Vx >> = 1 | Сохраняет младший бит VX в VF, а затем сдвигает VX вправо на 1.[b] |
8XY7[а] | Математика | Vx = Vy-Vx | Устанавливает VX в VY минус VX. VF устанавливается в 0, когда есть заем, и 1, когда нет. |
8XYE[а] | BitOp | Vx << = 1 | Сохраняет старший бит VX в VF, а затем сдвигает VX влево на 1.[b] |
9XY0 | Cond | если (Vx! = Vy) | Пропускает следующую инструкцию, если VX не равно VY. (Обычно следующая инструкция - это переход для пропуска блока кода) |
ИНН | MEM | I = NNN | Устанавливает I в адрес NNN. |
BNNN | Поток | ПК = V0 + NNN | Переход по адресу NNN плюс V0. |
CXNN | Rand | Vx = rand () & NN | Устанавливает VX как результат побитовой операции и операции со случайным числом (обычно: от 0 до 255) и NN. |
DXYN | Disp | ничья (Vx, Vy, N) | Рисует спрайт в координатах (VX, VY), имеющий ширину 8 пикселей и высоту N + 1 пикселей. Каждая строка из 8 пикселей считывается как битовая, начиная с ячейки памяти I; Значение I не меняется после выполнения этой инструкции. Как описано выше, VF устанавливается в 1, если какие-либо пиксели экрана переворачиваются из установленного в неустановленное при рисовании спрайта, и в 0, если этого не происходит. |
EX9E | KeyOp | если (ключ () == Vx) | Пропускает следующую инструкцию, если нажата клавиша, сохраненная в VX. (Обычно следующая инструкция - это переход для пропуска блока кода) |
EXA1 | KeyOp | если (ключ ()! = Vx) | Пропускает следующую инструкцию, если клавиша, хранящаяся в VX, не нажата. (Обычно следующая инструкция - это переход для пропуска блока кода) |
FX07 | Таймер | Vx = get_delay () | Устанавливает VX на значение таймера задержки. |
FX0A | KeyOp | Vx = get_key () | Ожидается нажатие клавиши, а затем сохраняется в VX. (Операция блокировки. Все инструкции остановлены до следующего ключевого события) |
FX15 | Таймер | delay_timer (Vx) | Устанавливает таймер задержки на VX. |
FX18 | Звук | sound_timer (Vx) | Устанавливает звуковой таймер на VX. |
FX1E | MEM | I + = Vx | Добавляет VX к I. VF не изменяется.[c] |
FX29 | MEM | I = sprite_addr [Vx] | Устанавливает I в положение спрайта персонажа в VX. Символы 0-F (в шестнадцатеричном формате) представлены шрифтом 4x5. |
FX33 | BCD | set_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.) |
FX55 | MEM | reg_dump (Vx, и я) | Сохраняет V0 в VX (включая VX) в памяти, начиная с адреса I. Смещение от I увеличивается на 1 для каждого записанного значения, но сам I остается неизменным.[d] |
FX65 | MEM | reg_load (Vx, & I) | Заполняет V0 до VX (включая VX) значениями из памяти, начиная с адреса I. Смещение от I увеличивается на 1 для каждого записанного значения, но сам I остается неизменным.[d] |
Примечания
- ^ а б c d Логические коды операций 8XY3, 8XY6, 8XY7 и 8XYE не были задокументированы в исходной спецификации CHIP-8, поскольку все 8000 кодов операций были отправлены инструкциям в 1802-х годах. ALU, а не в самом интерпретаторе; Таким образом, эти три дополнительных кода операций предположительно были непреднамеренными.
- ^ а б Коды операций 8XY6 и 8XYE в CHIP-8 (инструкции сдвига битов), которые фактически были недокументированными кодами операций в исходном интерпретаторе, смещали значение в регистре VY и сохраняли результат в VX. Реализации CHIP-48 и SCHIP вместо этого игнорировали VY и просто сдвигали VX.[9]
- ^ Команды FX1E большинства интерпретаторов CHIP-8 не влияют на VF, за одним исключением: интерпретатор CHIP-8 для Commodore Amiga устанавливает VF в 1, когда есть переполнение диапазона (I + VX> 0xFFF), и в 0, когда нет т.[13] Единственная известная игра, которая зависит от этого поведения, - Spacefight 2091! в то время как по крайней мере одна игра, Animal Race, не зависит от VF.
- ^ а б В исходной реализации CHIP-8, а также в CHIP-48 значение I остается увеличенным после выполнения этой инструкции. В SCHIP я оставлен без изменений.
Рекомендации
- ^ "VIPER для владельца RCA VIP ». Журнал "Интеллектуальные машины" (InfoWorld ). Информационная группа InfoWorld. 1978-12-11. п. 9. Получено 2010-01-30.
- ^ https://github.com/mattmikolay/chip-8/wiki/CHIP‐8-Extensions-Reference
- ^ 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
- ^ https://github.com/Chromatophore/HP48-Superchip
- ^ http://vanbeveren.byethost13.com/stuff/CHIP8.pdf
- ^ а б https://github.com/JohnEarnest/Octo/blob/gh-pages/docs/SuperChip.md#compatibility
- ^ RCA COSMAC VIP CDP18S711 Руководство по эксплуатации. Somerville: RCA Solid State Division. 1978. стр. 36.
- ^ "Технический справочник Cowgod's Chip-8". devernay.free.fr. Получено 2020-02-03.
- ^ Миколай, Мэтью. «Осваиваем ЧИП-8: Субрутины». mattmik.com. Получено 2020-02-03.
- ^ 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 Компьютерное руководство