Although average punched cards had eighty columns, often only seventy-two were used for characters; the remaining eight were ignored by software. Hence arbitrary metadata could be included with each card. Most commonly, it seems that a “sequence number” was used, primarily for the purpose of allowing an out-of-order card deck to be sorted into place.*
A manual for the FAP assembler says the following:
If a BCD source deck is serialized in columns 73–80, sequencing information will be checked, and any card out of sequence will be listed both on- and off-line. If a group of correctly sequenced cards is inserted into a deck out of sequence, only the first card of the group will be listed.
For purposes of sequencing, a blank is not considered to be zero; it is given the octal value 60. A serialized card following a card with all blanks in card columns 73–80 will not be sequence checked.
Presumably the BCD codes are compared, which means that letters would sequence in the correct order (A
<⋯<Z
) and that 9
<A
. A consequence is that, because of gaps in the encoding of letters, we have I
<-
<J
and R
<*
<
</
<S
. It appears to be common to use an alphabetic prefix in sequence numbers, as in this assembler.
Was this the usual method of comparison? (If so, then I suppose that the sequence numbers of adjacent cards could be treated as eight-digit base-64 numbers.)
* But this is not necessarily always the case. Here is the beginning of a COBOL compiler for the Burroughs B5500 (available for download along with several other programs), where the numbers are used for organization beyond keeping the cards in order:
BEGIN 00000000
% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00000100
% LASCIATE OGNI SPERANZA VOI CH ENTRATE 00000200
% DANTE 00000300
% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00000400
DEFINE 00000500
CURRENTLEVEL = % LEVEL OF CURRENT COMPILER 00000600
0 00000700
#, 00000800
LOCALEVEL = % LOCAL PATCH LEVEL 00000900
0 00001000
#; 00001100
COMMENT COMPILIER DIRECTORY BY 1ST DIGIT OF SEQUENCE NUMBER 00001200
0 COMPILIER GLOBALS 00001300
1 GLOBALS FOR PASS 1 00001400
12 READACARD STUFF 00001500
13 SCANNER STUFF 00001600
16 MACRO DISKOUT STUFF 00001700
18 OPERAND STUFF 00001800
19 EXPRESSION STUFF 00001900
2 START, IDENTIFICATION, AND ENVIRONMENT DIVISIONS - PASS 1 00002000
3 DATA DIVISION - PASS 1 00002100
31 ITEM ELEMITEM PICTUREPROCESS 00002200
32 RECORDDEC 00002300
33 FSE FILE SKELETION 00002400
34 WSE WORKING STORAGE 00002500
35 RSR REPORT WRITER 00002600
39 START OF EXECUTABLES 00002700
4 PROCEDURE DIVISION - PASS 1 00002800
40 GENERAL PURPOSE STUFF 00002900
41 DATA MANIPULATION STUFF 00003000
EXAMINEP 00003100
MOVEP 00003200
SETP 00003300
ARITHMETICP 00003400
COMPUTEP 00003500
DIVIDEP 00003600
42 PROGRAM CONTROL STUFF 00003700
LBCHK 00003800
LABELSCAN 00003900
CONDITIONALSTMT 00004000
ALTERP 00004100
GOP 00004200
IFP 00004300
PERFORMP 00004400
SEARCHP 00004500
STOPP 00004600
43 SORT STUFF 00004700
RELEASEP 00004800
RETURNP 00004900
SORTP 00005000
44 I-O STUFF 00005100
ACCEPTP 00005200
CLOSEP 00005300
DISPLAYP 00005400
OPENP 00005500
READP 00005600
SEEKP 00005700
WRITEP 00005800
45 REPORT WRITER 00005900
46 SEPARATELY COMPILED STUFF 00006000
47 DIAGNOSTIC STUFF 00006100
DUMPP 00006200
MONITORP 00006300
48 DECLARATIVE STUFF 00006400
USEP 00006500
49 PASS1 PROCEDURE DIVISION DRIVER PROCEDURES 00006600
STATEMENT 00006700
PARAGRAPH 00006800
SECTION 00006900
6 GLOBALS FOR PASS 2 00007000
61 EMITTERS 00007100
62 ERRORS 00007200
63 PASSMAC 00007300
64 ARRAYDEC SEGSTART SEGEND 00007400
65 GETDATA WRITEDATA 00007500
7 FIRST THREE DIVISIONS - PASS 2 00007600
8 PROCEDURE DIVISION - PASS 2 00007700
80 GENERAL PURPOSE STUFF 00007800
81 MOVE STUFF 00007900
82 ARITH STUFF 00008000
83 CONTROL STUFF 00008100
LBCHK 00008200
EXAMINEP 00008300
LBLDECK 00008400
BRANCHGEN 00008500
84 SORT STUFF 00008600
SRTP 00008700
RELP 00008800
RETP 00008900
85 CONTROL STUFF 00009000
SWCHP 00009100
ALTRP 00009200
ALGOP 00009300
ENDPAR 00009400
PERFORMP 00009500
86 I-O STUFF 00009600
87 REPORT WRITER 00009700
88 SEPARATELY COMPILED STUFF 00009800
89 PASS2 PROCEDURE DIVISION DRIVER 00009900
MACRO 00010000
9 COMPILIER WRAP-UP 00010100
;00010200
I admit that the beginning comment isn't relevant, but it's too good not to include. Starting a 21 000-line COBOL compiler with “Abandon all hope, ye who enter” is hilarious.
*
in the first paragraph was produced by writing<sup>*
;<sup>*</sup>
seems to result in a double superscript.</sup>
tag) the*
isn't superscripted at all.