前記事においてよくわからんなとかいってたやつ。単純にキャリーしないときにオンにするかんじやな。
.carry = (a ^ i ^ result) & 0x100 != 0
を逆にして.carry = (a ^ i ^ result) & 0x100 == 0
でよいかんじでした。
fn addU16ToSingedU8WithCarryHalf(a: u16, b: u8) u16OpResultWithCarryHalf { const n = @intCast(u16, bitClear(u8, b, 7)); if (bitCheck(u8, b, 7)) { const i = 128 - n; const result = a -% i; return .{ .result = result, .carry = (a ^ i ^ result) & 0x100 == 0, .half = (a ^ i ^ result) & 0x10 == 0, //.carry = (a & 0xff) -% (i & 0xff) < (a & 0xff), //.half = (a & 0xf) -% (i & 0xf) < (a & 0xf), }; } else { const result = a +% n; return .{ .result = result, .carry = (a ^ n ^ result) & 0x100 != 0, .half = (a ^ n ^ result) & 0x10 != 0, }; } }