aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2026-02-23 19:43:30 +0100
committerPolesznyák Márk <contact@pml68.dev>2026-02-23 19:43:30 +0100
commite9d46569e5617a84f52ccd863109aad994e75455 (patch)
tree7096d42c7952f5a77907d4395dd37b0981eb5b69
parentrefactor: get rid of unused SDL_AudioFormat defines (diff)
downloadhare-chip8-e9d46569e5617a84f52ccd863109aad994e75455.tar.gz
fix: incorrectly implemented instructions (8XY6, 8XYE)
Also reset VF for 8XY1, 8XY2 and 8XY3
-rw-r--r--main.ha16
1 files 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;
};