diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2026-02-23 19:43:30 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2026-02-23 19:43:30 +0100 |
| commit | e9d46569e5617a84f52ccd863109aad994e75455 (patch) | |
| tree | 7096d42c7952f5a77907d4395dd37b0981eb5b69 | |
| parent | refactor: get rid of unused SDL_AudioFormat defines (diff) | |
| download | hare-chip8-e9d46569e5617a84f52ccd863109aad994e75455.tar.gz | |
fix: incorrectly implemented instructions (8XY6, 8XYE)
Also reset VF for 8XY1, 8XY2 and 8XY3
| -rw-r--r-- | main.ha | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -128,12 +128,12 @@ fn print_instruction(state: *state, inst: inst) void = { fmt::printfln("V{:X} (0x{:.2X}) -= V{:X} (0x{:.2X})", inst.X, state.V[inst.X], inst.Y, state.V[inst.Y])!; case 0x06 => - fmt::printfln("V{:X} >>= 1", inst.X)!; + fmt::printfln("V{:X} = V{:X} (0x{:.2X}) >> 1", inst.X, inst.Y, state.V[inst.Y])!; case 0x07 => fmt::printfln("V{:X} = V{:X} (0x{:.2X}) - V{:X} (0x{:.2X})", inst.X, inst.Y, state.V[inst.Y], inst.X, state.V[inst.X])!; case 0x0E => - fmt::printfln("V{:X} <<= 1", inst.X)!; + fmt::printfln("V{:X} = V{:X} (0x{:.2X}) << 1", inst.X, inst.Y, state.V[inst.Y])!; case => fmt::printfln("Unkown OP code")!; }; @@ -228,28 +228,30 @@ fn execute_instruction(state: *state, inst: inst, random: *random::random) void case 0x00 => state.V[inst.X] = state.V[inst.Y]; case 0x01 => + state.V[0x0F] = 0; state.V[inst.X] |= state.V[inst.Y]; case 0x02 => + state.V[0x0F] = 0; state.V[inst.X] &= state.V[inst.Y]; case 0x03 => + state.V[0x0F] = 0; state.V[inst.X] ^= state.V[inst.Y]; case 0x04 => state.V[0x0F] = if (state.V[inst.X] > types::U8_MAX - state.V[inst.Y]) 1 else 0; state.V[inst.X] += state.V[inst.Y]; case 0x05 => state.V[0x0F] = if (state.V[inst.X] >= state.V[inst.Y]) 1 else 0; - state.V[inst.X] -= state.V[inst.Y]; case 0x06 => - state.V[0x0F] = state.V[inst.X] & 0x01; - state.V[inst.X] >>= 1; + state.V[0x0F] = state.V[inst.Y] & 0x01; + state.V[inst.X] = state.V[inst.Y] >> 1; case 0x07 => state.V[0x0F] = if (state.V[inst.Y] >= state.V[inst.X]) 1 else 0; state.V[inst.X] = state.V[inst.Y] - state.V[inst.X]; case 0x0E => - state.V[0x0F] = state.V[inst.X] & 0x80; - state.V[inst.X] <<= 1; + state.V[0x0F] = (state.V[inst.Y] & 0x80) >> 7; + state.V[inst.X] = state.V[inst.Y] << 1; case => return; }; |
