When IBM brought out the /360 mainframe in 1964, one thing that took some getting your head around was processing Condition Codes.
Many operations set a “condition code” which indicated the result of the operation and which could be tested by a Branch-On-Condition instruction:
BC xx,yyyy = Branch to yyyy on Condition xx
Part of the problem was syntax – the term “Condition Code” had two meanings:
Hardware: The four 2-bit possibilities set by the previous operation
Assembler: The values assigned to those four possibilities for testing purposes.
00 = 8
01 = 4
10 = 2
11 = 1
In addition, the assigned values could be OR’d for testing.
BC 08,yyyy means Branch if 2-bits were 00
BC 04,yyyy means Branch if 2-bits were 01
BC 02,yyyy means Branch if 2-bits were 10
BC 01,yyyy means Branch if 2-bits were 11
BC 12,yyyy means Branch if 2-bits were 00 or 01
BC 10,yyyy means Branch if 2-bits were 00 or 10
BC 09,yyyy means Branch if 2-bits were 00 or 11
BC 07,yyyy means Branch if 2-bits were 01 or 10 or 11
Note: 08 and 07 are complimentary numbers re 15
Thus if BC 08 means Branch Equal, BC 07 means Branch Not Equal
The same is true of other complementary pairs; BC 12 vs BC 3; BC 9 vs BC 6, etc.
BC 15,yyyy means Branch if 2-bits were 00 or 01 or 10 or 11
And since that covers all possibilities, BC 15 means Absolute Branch
And BC 00,yyyy is a No-Op, since one of the 4 possibilities had to have been set.
There were many Assembler instructions which resolved to one of the 16 possible values
BZ = Branch Equal
BH = Branch High
BL = Branch Low
BNZ = Branch Not Equal
BNH = Branch Not High
BNL = Branch Not Low
BHE = Branch High or Equal
BLE = Branch Low or Equal
BZ = Branch Zero
BNZ = Branch Not Zero
BO = Branch Overflow
etc etc etc
Two binary bits = 4 possible hardware settings = 16 programmable conditions!