javascript — моя реализация chip8 в соответствии со спецификацией отличается от открытого исходного кода в интернете. Нужно уточнение

Я работаю над реализацией CHIP8 и читаю

    Cowgod's
Chip-8
Technical Reference v1.0
http://web.archive.org/web/20130401182240/http://devernay.free.fr/hacks/chip8/C8TECH10.HTM#3.0

в качестве ссылки. Я уверен, что это точная спецификация, потому что она была рекомендована несколькими блогами, в которых также говорится о CHIP8. У меня вопрос, я реализовал мой код операции для обработки кода «7xkk»

7xkk - ADD Vx, byte
Set Vx = Vx + kk.

Adds the value kk to the value of register Vx, then stores the result in Vx.

И это мой код

 case 0x7:
log(this.logging, "0x7xkk: Setting Vx = Vx + kk.");

var result = this.registers.V[(opcode & 0x0F00) >> 8] + (opcode & 0x00FF);
this.registers.V[(opcode & 0x0F00) >> 8] = result;

break;

но другой открытый код CHIP8 имеет совершенно другую реализацию

case 0x7000:
// Set Vx = Vx + kk.
this.register[vX] += opcode & 0x00FF;

if(this.register[vX] > 255){
this.register[vX] -= 256;
}
break;

// Этот человек проверяет, больше ли Vx, чем 255, что не описано в данном разделе.

ссылка на сайт- https://github.com/loktar00/chip8/blob/master/chip8.js#L181

и реализация C ++, которую я нашел в Интернете

case 0x7: {
V[opCode2] = (char)((V[opCode2] + opCode & 0x00FF) & 0x00FF);
IP = IP + 2;
break;
}

// Этот человек добавляет «opCode & 0x00FF «, а также применить и работать с» 0x00FF «.

Я запутался, если смотрю на слишком старую спецификацию или делаю ее правильно.

2

Решение

Регистры Chip-8 содержат только один 8-битный байт. Один байт может содержать значения от 0 до 255 включительно.

Если операция дает вам значение, которое находится вне диапазона 8-битного байта, вам нужно сохранить только младшие 8 бит. Это то, что делают обе эти реализации, хотя и немного по-разному: реализация Javascript явно проверяет значения больше 255, в то время как реализация C ++ просто отбрасывает любые дополнительные биты (это & 0x00FF в конце).

Ваша реализация неверна, потому что вы не принимаете это во внимание: если V [0] содержит значение 255, и у вас есть код операции 0x7001 (добавьте 1 к регистру 0), то ваша реализация даст 256, которое не может быть сохранено в 8. -битный байт — правильное значение 0, что является младшими 8 битами 256. Это, например, вызовет проблемы для кода операции 0xB, который принимает V [0] в качестве смещения перехода, поскольку он будет прыгать намного дальше, чем он Предполагалось, что.

4

Другие решения

Других решений пока нет …