Инкремент I в опкоде чип-8 FX65

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

С одной стороны у нас есть википедия, которая под кодом операции FX65 говорит нам, что

"Заполняет V0 до VX (включая VX) значениями из памяти, начиная с адреса I. I увеличивается на 1 для каждого записанного значения".

где "I увеличивается на 1 для каждого записанного значения". это важная часть.

После этого получается следующий код:

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I];
    ++I;
}

с другой стороны, у нас есть ссылка на чип-8 от cowgod, ссылка, на которую ссылается почти каждый учебник, которая говорит нам следующее

"Интерпретатор считывает значения из памяти, начиная с местоположения I, в регистры V0-Vx".

Применение этой логики приводит к следующему коду (это также реализация, которую использует большинство реализаций чипа-8):

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I + i];
}

Основное различие между этими двумя заключается в том, что я либо увеличивается, либо нет. Поскольку я - регистровый индекс эмулятора, для программы очень важно работать правильно.

Я хочу знать, какая реализация этого кода операции правильная.

1 ответ

Решение

Похоже, что нет однозначного ответа, так как нет четкой ссылки.

Эта ссылка, кажется, имеет ту же проблему с той же неоднозначностью

Эта (современная) ссылка (стр. 113), однако, гласит: "I = I + X + 1". Авторство - изобретатель Джозеф Вайсбекер - думаю, он узнает.

Это зависит от того, какой реализации вы будете следовать.

На этот вопрос уже был дан ответ, но я дам более исторический ответ для потомков.

CHIP-8 был представлен на компьютере COSMAC VIP в 1977 году. Этот оригинальный интерпретатор CHIP-8 действительно увеличивал I при выполнении инструкций FX55 и FX65, как можно увидеть в этой разборке. I увеличивается на 1 для каждого записанного / прочитанного значения.

CHIP-8 был портирован на несколько других микрокомпьютеров в конце 70-х - начале 80-х годов с таким же поведением (так что игры CHIP-8 были бы портативными), но затем был забыт на несколько лет после того, как стали популярными более продвинутые компьютеры с большим объемом памяти (например, IBM PC).

В 1990 году CHIP-8 был перенесен на графические калькуляторы серии HP48 как CHIP-48. Этот порт привнес по крайней мере три ошибки: инструкция перехода BNNN ведет себя по-другому (но использовалась редко), две инструкции сдвига битов 8XY6 и 8XYE теперь сдвигают регистр VX и игнорируют VY (на COSMAC VIP значение в VY было сдвинуто). и помещены в VX), и, что более важно для этого вопроса, FX55 и FX65 теперь увеличивают I на 1 для каждого записанного / считанного значения минус 1. Позднее в 1991 году переписывание и расширение CHIP-48, названное SUPER-CHIP, снова изменило FX55 и FX65. Эти инструкции вообще не увеличивали I.

Две последние ошибки означали, что CHIP-48/SUPER-CHIP не мог должным образом запускать многие оригинальные игры CHIP-8 70-х и 80-х годов, но, похоже, никто этого не заметил, вероятно, потому, что эти старые игры не были доступны на Интернет. Они были напечатаны в компьютерных информационных бюллетенях и журналах. Эти современные интерпретаторы стали основой возобновившегося интереса к CHIP-8, который распространился в Интернете.

Люди до сих пор используют ссылку Cowgod и создают "эмуляторы" (интерпретаторы) CHIP-8, которые полагаются на это изменившееся поведение с 1990-х годов. Параллельно с этим другие люди подражали старым микрокомпьютерам 70-х годов, которые фактически запускали старые интерпретаторы, и разместили старые игры в Интернете.

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

Другие вопросы по тегам