Я работаю над реализацией 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 «.
Я запутался, если смотрю на слишком старую спецификацию или делаю ее правильно.
Регистры 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] в качестве смещения перехода, поскольку он будет прыгать намного дальше, чем он Предполагалось, что.
Других решений пока нет …