I have been idly looking into how System 370 works, though mostly at software and VM/370 OS. As a part of the system generation process, one needs to use DMKDDR utility and others. So I was curious how these work and get loaded.
The tape image I've found is in an AWS tape image format, and the file itself stored many 80 byte records, which are obviously punch card sized and even have a trailing labels for sorting them. Especially interesting are the first three cards that are used to store the IPL PSW and (in this case) two CCWs that load the next two card records into memory.
Either way, all those card records contain binary executable data, and practically all of it is not in a human-readable form. But how does that get punched onto the cards? A lot of things highlighting punch cards and EBCDIC do not seem to bother showing any extra mapping beyond the basic uppercase A-Z
, 0-9
and (varied) symbols. But the bootloader and programs are specifically formatted like they were meant to go on a punch card. Is this a case of old format persisting in a different medium, or was it indeed possible to IPL off a stack of cards? Specifically using something like IBM 3505.
I've found a mapping between EBCDIC and punch card codes, but I am not sure if this is another case of IBM producing a highly specialized option for a limited amount of systems, or whether it's an actual mapping used in other things. The table in question is identical in its contents, if not exact formatting, and is present in a manual for IBM 1403 printer (GA24-3073-8, 1972), and a manual for IBM 2540 card punch (A21-9033-1, 1965).
EBCDIC | _0 |
_1 |
_2 |
_3 |
_4 |
_5 |
_6 |
_7 |
_8 |
_9 |
_A |
_B |
_C |
_D |
_E |
_F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ |
2C03 | 2401 | 2201 | 2101 | 2021 | 2011 | 2009 | 2005 | 2003 | 2403 | 2203 | 2103 | 2023 | 2013 | 200B | 2007 |
1_ |
3403 | 1401 | 1201 | 1101 | 1021 | 1011 | 1009 | 1005 | 1003 | 1403 | 1203 | 1103 | 1023 | 1013 | 100B | 1007 |
2_ |
1C03 | 0C01 | 0A01 | 0901 | 0821 | 0811 | 0809 | 0805 | 0803 | 0C03 | 0A03 | 0903 | 0823 | 0813 | 080B | 0807 |
3_ |
3C03 | 0401 | 0201 | 0101 | 0021 | 0011 | 0009 | 0005 | 0003 | 0403 | 0203 | 0103 | 0023 | 0013 | 000B | 0007 |
4_ |
0000 | 2C01 | 2A01 | 2901 | 2821 | 2811 | 2809 | 2805 | 2803 | 2402 | 2202 | 2102 | 2022 | 2012 | 200A | 2006 |
5_ |
2000 | 3401 | 3201 | 3101 | 3021 | 3011 | 3009 | 3005 | 3003 | 1402 | 1202 | 1102 | 1022 | 1012 | 100A | 1006 |
6_ |
1000 | 0C00 | 1A01 | 1901 | 1821 | 1811 | 1809 | 1805 | 1803 | 0C02 | 3000 | 0902 | 0822 | 0812 | 080A | 0806 |
7_ |
3800 | 3C01 | 3A01 | 3901 | 3821 | 3811 | 3809 | 3805 | 3803 | 0402 | 0202 | 0102 | 0022 | 0012 | 000A | 0006 |
8_ |
2C02 | 2C00 | 2A00 | 2900 | 2820 | 2810 | 2808 | 2804 | 2802 | 2801 | 2A02 | 2902 | 2822 | 2812 | 280A | 2806 |
9_ |
3402 | 3400 | 3200 | 3100 | 3020 | 3010 | 3008 | 3004 | 3002 | 3001 | 3202 | 3102 | 3022 | 3012 | 300A | 3006 |
A_ |
1C02 | 1C00 | 1A00 | 1900 | 1820 | 1810 | 1808 | 1804 | 1802 | 1801 | 1A02 | 1902 | 1822 | 1812 | 180A | 1806 |
B_ |
3C02 | 3C00 | 3A00 | 3900 | 3820 | 3810 | 3808 | 3804 | 3802 | 3801 | 3A02 | 3902 | 3822 | 3812 | 380A | 3806 |
C_ |
2800 | 2400 | 2200 | 2100 | 2020 | 2010 | 2008 | 2004 | 2002 | 2001 | 2A03 | 2903 | 2823 | 2813 | 280B | 2807 |
D_ |
1800 | 1400 | 1200 | 1100 | 1020 | 1010 | 1008 | 1004 | 1002 | 1001 | 3203 | 3103 | 3023 | 3013 | 300B | 3007 |
E_ |
0A02 | 1C01 | 0A00 | 0900 | 0820 | 0810 | 0808 | 0804 | 0802 | 0801 | 1A03 | 1903 | 1823 | 1813 | 180B | 1807 |
F_ |
0800 | 0400 | 0200 | 0100 | 0020 | 0010 | 0008 | 0004 | 0002 | 0001 | 3A03 | 3903 | 3823 | 3813 | 380B | 3807 |
The table that I've managed to find. Or rather conversion from how it was presented into being just a table of hex value of an EBCDIC byte to a punch card image value as per the manuals above (and IBM 2505 punch image reading mode, per manual). Though I might have the byte order wrong. First byte contains upper 6 hole states (two empty MSB, then rows 12, 11, 0, etc) and the second contains lower 6 hole states (in similar order).
Bold are the characters that have a footnote within the table provided in manuals, differing in their pattern from what is prescribed by the table.
I am wondering if this is the primary mapping between binary EBCDIC and punched cards, or merely one that is used on a few machines, and has many variations? I do know that other countries and various S360 derivatives used either a modification of this or an entirely different encoding.