diff options
Diffstat (limited to 'main.ha')
| -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; }; |
