From 6800a11f605aaf72f9c283f3548a1cf10dc972da Mon Sep 17 00:00:00 2001 From: doom <61824552+JustDoom@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:41:10 +1000 Subject: [PATCH] Finish fixing compatability! Was bored and clicked on the wikipedia link on the readme to chip8. I then looked at op codes and for some reason decided to switch theorder of setting the vF register and the x/y register. This then just solved half the issues. The rest were solved using similar methods --- src/emulator/Cpu.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/emulator/Cpu.cpp b/src/emulator/Cpu.cpp index ec1f182..bac905e 100644 --- a/src/emulator/Cpu.cpp +++ b/src/emulator/Cpu.cpp @@ -145,43 +145,45 @@ void Cpu::runInstruction(const uint16_t opcode) { case 0x4: { const uint16_t sum = this->registers[x] + this->registers[y]; + this->registers[x] = sum & 0xFF; + if (sum > 0xFF) { this->registers[0xF] = 1; } else { this->registers[0xF] = 0; } - - this->registers[x] = sum & 0xFF; + break; } - break; - case 0x5: - if (this->registers[x] >= this->registers[y]) { - this->registers[0xF] = 1; - } else { - this->registers[0xF] = 0; - } + case 0x5: { + const uint8_t value = this->registers[x] >= this->registers[y] ? 1 : 0; this->registers[x] -= this->registers[y]; + this->registers[0xF] = value; break; - case 0x6: - this->registers[0xF] = (this->registers[x] & 0x1); - + } + case 0x6: { + const uint8_t value = (this->registers[x] & 0x1); this->registers[x] >>= 1; + this->registers[0xF] = value; break; + } case 0x7: + this->registers[x] = this->registers[y] - this->registers[x]; + if (this->registers[y] >= this->registers[x]) { this->registers[0xF] = 1; } else { this->registers[0xF] = 0; } - this->registers[x] = this->registers[y] - this->registers[x]; break; - case 0xE: - this->registers[0xF] = (this->registers[x] & 0x80) >> 7; + case 0xE: { + const uint8_t value = (this->registers[x] & 0x80) >> 7; this->registers[x] <<= 1; + this->registers[0xF] = value; break; + } default: break; } @@ -279,8 +281,8 @@ void Cpu::runInstruction(const uint16_t opcode) { value /= 10; this->memory[this->address] = value % 10; + break; } - break; case 0x55: for (uint8_t registerIndex = 0; registerIndex <= x; ++registerIndex) { this->memory[this->address + registerIndex] = this->registers[registerIndex];