From e9d46569e5617a84f52ccd863109aad994e75455 Mon Sep 17 00:00:00 2001 From: Polesznyák Márk Date: Mon, 23 Feb 2026 19:43:30 +0100 Subject: fix: incorrectly implemented instructions (8XY6, 8XYE) Also reset VF for 8XY1, 8XY2 and 8XY3 --- main.ha | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/main.ha b/main.ha index 6f6c1b4..bcdbf96 100644 --- a/main.ha +++ b/main.ha @@ -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; }; -- cgit v1.2.3