The Honeywell character set is based on (an extension of) the 48-character set of an IBM 026-H keypunch (except for apostrophy). This is due to the character set being decided/fixed prior to appearance of the IBM 029 keypunch, which defined a full 64-character set. Even if cards are punched on an IBM 026-H, the "special code" option needs to be set with the PCB instruction in order to get the correct representation for the plus and minus characters. It seems that FORTRAN IV programs were normally punched on an IBM 026-H keypunch, and the compiler likely used the "special code" option to read the program. It is not known if Honeywell built keypunch machines and, if so, what character set was used.
The IBM 026 (introduced 1949) had several options that changed the keycaps and printing of some of the special characters. The -H option was generally used for FORTRAN IV programming, since it supplied the necessary special characters. The IBM 029 (introduced 1964) extended the character set of the 026-A, assigning new codes for the additional characters of the 026-H, and so created a conversion issue if both 029 and 026-H keypunches were being used. It was my experience that using an IBM 029 for FORTRAN programs on an H2040 required the keypunch operator to understand that certain characters had to be punched using different symbols. The IBM 029 was available with a 48-character (026-compatible) option, in either the -A or -H arrangements, however I never saw those. Since the special characters of the -H option did not conflict with the corresponding characters of the 029, it is also possible that the FORTRAN compiler simply folded both possible punch codes into the same character. The related example demonstrates a way to automatically convert, provided all cards in a program were punched for the same character set.
Here is a table showing Punch Card codes and their Honeywell equivalents. The "binary" column shows the 16-bit code stored in "pcd" files. A pair of values separated by vertical-bar indicates the normal and "special code" as selected by the PCB instruction on the Card Reader/Punch device. Notice how the Honeywell characters most-closely align with IBM026-H characters.
binary | punch | IBM026 -A [-H] | IBM029 | H2000 | H2000-LP |
---|---|---|---|---|---|
0x0000 | no-punch | blank | blank | 015 | blank |
0x0200 | [0] | 0 | 0 | 000 | 0 |
0x0100 | [1] | 1 | 1 | 001 | 1 |
0x0080 | [2] | 2 | 2 | 002 | 2 |
0x0040 | [3] | 3 | 3 | 003 | 3 |
0x0020 | [4] | 4 | 4 | 004 | 4 |
0x0010 | [5] | 5 | 5 | 005 | 5 |
0x0008 | [6] | 6 | 6 | 006 | 6 |
0x0004 | [7] | 7 | 7 | 007 | 7 |
0x0002 | [8] | 8 | 8 | 010 | 8 |
0x0001 | [9] | 9 | 9 | 011 | 9 |
0x0900 | [12][1] | A | A | 021 | A |
0x0880 | [12][2] | B | B | 022 | B |
0x0840 | [12][3] | C | C | 023 | C |
0x0820 | [12][4] | D | D | 024 | D |
0x0810 | [12][5] | E | E | 025 | E |
0x0808 | [12][6] | F | F | 026 | F |
0x0804 | [12][7] | G | G | 027 | G |
0x0802 | [12][8] | H | H | 030 | H |
0x0801 | [12][9] | I | I | 031 | I |
0x0500 | [11][1] | J | J | 041 | J |
0x0480 | [11][2] | K | K | 042 | K |
0x0440 | [11][3] | L | L | 043 | L |
0x0420 | [11][4] | M | M | 044 | M |
0x0410 | [11][5] | N | N | 045 | N |
0x0408 | [11][6] | O | O | 046 | O |
0x0404 | [11][7] | P | P | 047 | P |
0x0402 | [11][8] | Q | Q | 050 | Q |
0x0401 | [11][9] | R | R | 051 | R |
0x0280 | [0][2] | S | S | 062 | S |
0x0240 | [0][3] | T | T | 063 | T |
0x0220 | [0][4] | U | U | 064 | U |
0x0210 | [0][5] | V | V | 065 | V |
0x0208 | [0][6] | W | W | 066 | W |
0x0204 | [0][7] | X | X | 067 | X |
0x0202 | [0][8] | Y | Y | 070 | Y |
0x0201 | [0][9] | Z | Z | 071 | Z |
0x0082 | [8][2] | none | : | 012 | ' |
0x0042 | [8][3] | # [=] | # | 013 | = |
0x0022 | [8][4] | @ ['] | @ | 014 | : |
0x0012 | [8][5] | none | ' | 060 | < |
0x000a | [8][6] | none | = | 016 | > |
0x0006 | [8][7] | none | " | 017 | & |
0x0800 | [12] | & [+] | & | 037|020 | ?|+ |
0x0a00 | [12][0] | none | none | 020|037 | +|? |
0x0882 | [12][8][2] | none | ¢ | 032 | ; |
0x0842 | [12][8][3] | . | . | 033 | . |
0x0822 | [12][8][4] | □ [)] | < | 034 | ) |
0x0812 | [12][8][5] | none | ( | 035 | % |
0x080a | [12][8][6] | none | + | 036 | ■ |
0x0806 | [12][8][7] | none | | | none | none |
0x0400 | [11] | ─ | ─ | 057|040 | !|─ |
0x0600 | [11][0] | none | none | 040|057 | ─|! |
0x0482 | [11][8][2] | none | ! | 052 | # |
0x0442 | [11][8][3] | $ | $ | 053 | $ |
0x0422 | [11][8][4] | * | * | 054 | * |
0x0412 | [11][8][5] | none | ) | 055 | " |
0x040a | [11][8][6] | none | ; | 056 | ≠ |
0x0406 | [11][8][7] | none | ¬ | none | none |
0x0300 | [0][1] | / | / | 061 | / |
0x0282 | [0][8][2] | none | (note 1) | 072 | @ |
0x0242 | [0][8][3] | , | , | 073 | , |
0x0222 | [0][8][4] | % [(] | % | 074 | ( |
0x0212 | [0][8][5] | none | _ | 075 | CR |
0x020a | [0][8][6] | none | > | 076 | □ |
0x0206 | [0][8][7] | none | ? | 077 | ¢ |
(1) | A key existed to punch this code, but the keytop was blank (or said "0-8-2") and the printer did not print for this code. |
[12][8][7] [11][8][7] | Codes not recognized by Honeywell equipment. |
[12][0] [11][0] | Codes not recognized/punched by IBM keypunch equipment. |
The special code option was for cases where the punch cards were carrying things like FORTRAN programs or text, as opposed to conventional data processing (numeric data). It was common in punch card data processing to add a sign to a numeric field by over-punching the 12 or 11 zone in the last digit. The "normal" Hollerith code translation would produce native Honeywell signed decimal fields directly from data punched that way. Effectively, [12] and [11] zone punches were attributes of digits. For programs and other text, [12] and [11] become characters instead of attributes, supplying the plus and minus signs (respectively).