I would have thought that the 1401 would use column binary code as well. In the end, it’s all about variable instruction length and wordmarks.
Turns out, there are 4 instructions in total, which do not require a wordmark (WM), if followed by a blank, (and can be used for bootstrapping). Namely, these are:
- The branch instruction (B) in its 4-character form
(unconditional jump, just a single address),
- The set wordmark instruction (,) in its 7-character form
(sets the WM for two addr. at once)
- The clear storage instruction (/) in its 7-character form
(clears a page from given addr. downwards, incl. WMs, continues at second addr.)
- The branch instruction (B) in its 7-character form
(conditional jump, comparison to blank)
(Source: Reference Manual, IBM 1401 Data Processing System, correction sheet for p.15)
Notably, the two instructions affecting memory are both setting or clearing the wordmark, while the two others (and the clear instruction, as well) are affecting the program counter. Since this also includes a conditional branch instruction (with comparison), it’s nearly a minimum Turing complete set. (We are missing any instructions to set any memory to anything other than a blank, and any other contents must come from the reader. However, since we can set and clear wordmarks and can outrun the reader doing so, it’s good enough.)
P.S.: Regarding Ken’s question (as posed in the article), whether this is just a clever hack and merely an afterthought or by design, I’d opt for the latter.
(Mind that the 1401 was meant to replace the old punch card appliances and their wire boards. Coming from these, it’s probably rather comfortable and still flexible.)