Are there any tricks that can be used to invert the carry flag on the 6800, in as few bytes as possible?
This is the shortest subroutine I've come up with, which is straight forward:
INVC: BCS CLEAR SEC RTS CLEAR: CLC RTS
Retrocomputing Stack Exchange is a question and answer site for vintage-computer hobbyists interested in restoring, preserving, and using the classic computer and gaming systems of yesteryear. It only takes a minute to sign up.Sign up to join this community
Shortest coding (I came up so far):
Instruction Bytes Cycles TPA 1 2 Transfer P(rocessor status) to (accumulator) A EOR A,#$01 2 2 Invert bit 0 (carry bit) using exclusive OR TAP 1 2 Transfer (accumulator) A back to P(rocessor status) --- --- 4 6
Of course this will only work if A is available.
Without your solution is a good start. Speed should be the same.
And then Supercat came along with two really nifty ideas using ROL/ROR to get access to carry and flip it:
Instruction Bytes Cycles ROL A 1 2 Shift C(arry) into acc A bit 0, save bit 7 in carry EOR A,#$01 2 2 Invert bit 0 (carry bit) using exclusive OR ROR A 1 2 Shift bit 0 back into C(arry) and restore bit 7 --- --- 4 6
It is as compact and fast as my solution, but preserves the content of acc A
Instruction Bytes Cycles ROL B 1 2 Shift C(arry) into acc B bit 0 INC B 1 2 Increment by 1 always flips the lowest bit (*) ROR B 1 2 Shift bit 0 back into C(arry) --- --- 3 6
0 + 1 = 1;
1 + 1 = (1)0. The cool ways of binary)
This as well preserves A (but destroyes B) but saves another byte, while still performing in 6 cycles.