IBM 1401

IBM 1401は、IBMが1959年10月5日に発表した可変ワード長十進コンピュータであり、大成功となった IBM 1400 シリーズの最初の機種であり、パンチカードに格納したデータを処理する電気機械式のタビュレーティングマシンの代替となることを意図していた。1万台以上が生産され、アメリカで新機種に取って代わられた後も後進国にリースまたは再販された。1971年2月8日に販売終了となった。
歴史.
発表には次のような文言がある。
全てトランジスタ化された IBM 1401 データ処理システムは、従来パンチカード機器しか使えなかった中小企業でも手の届く価格で電子式データ処理システムの機能を提供する。高速カードパンチおよび読み取り、磁気テープ入出力、高速印刷、内蔵式プログラム、算術および論理演算能力といった機能がある。
1401は独立したシステムとしても、IBMパンチカード機器と連携した形でも、IBM 700 または 7000 シリーズのシステムの補助装置としても運用できる。
1401の月額レンタル料は2,500ドルからとなっていた。
IBMは発表後5週間で5,200の注文を受けており、その勢いはあらゆる予測を超えていた。1961年末までにアメリカ国内で2000システムが納入されたが、これは全製造業者が出荷した全電子式プログラム内蔵コンピュータの4分の1にほぼ相当する。1960年代中ごろのピーク時、1万台を越える1401システムが設置されていた。実際、1960年代中ごろの世界の全てのコンピュータシステムのほぼ半数が1401型のシステムだった。このシステムは1971年2月まで販売された。
主に中小企業で使われた IBM 1401 は、メインフレームのオフライン周辺制御装置としても多く使用された。この形態のシステムでは大型機（IBM 7090 など）は入出力を全て磁気テープで行い、1401 は他の形式の入力データ（パンチカードなど）を磁気テープに変換したり、出力テープの内容を他の周辺機器（1402カードパンチャーや1403ラインプリンタなど）に出力するのに使われた。
ジョン・ハーンストラ率いる1401部門は市場の要望に応じて 1401 を大規模化するサポート（たとえば IBM 1410）は継続していたが、1964年に全てのリソースをSystem/360に集約するという決定がなされ、1400シリーズはやや唐突に終わることになった。360が1401と非互換であったため、1400シリーズ互換の Honeywell 200シリーズとの競合が生じたため、IBMはマイクロコードをROMの形式で360の一部モデルに搭載し、1401の命令をエミュレートできるようにした。
カリフォルニア州マウンテンビューのコンピュータ歴史博物館にて2台の1401システムが動作可能な状態に復元され、当時（あるいは現在のデータセンター）のような「上げ底」の床で配線を隠した状態で展示されている。
アーキテクチャ.
1401では各英数字を6ビットで表現し、各ビットを "B, A, 8, 4, 2, 1" と呼ぶ。"B,A" ビットは「ゾーン」ビット、"8,4,2,1" のビット群は「数字」ビットと呼ぶ。これらの呼称はIBMの80欄パンチカードから採られている。
IBMは1401の文字コードをBCDと称していたが、実際のところこの用語は十進の数字の符号化しか説明していない。1401の英数字の照合順序はパンチカードの称号順序と互換となっている。
記憶装置上では、この6ビットにさらに2ビットが付属し、"C" ビットは 「odd パリティチェック」であり、"M" ビットは「ワードマーク」ビットである。
メモリ上、これらビットは以下のようなフォーマットで配置される:
"C B A 8 4 2 1 M"
1401のメモリ構成は 1.4K、2K、4K、8K、16K の5種類あった（ごく一部の1401は特注で32Kまで拡張された）。メモリは文字単位でアドレス指定可能であり、アドレス範囲は0から15999までだった。
一部命令は特定のメモリ位置を使用するが、それらの位置は予約されているわけではなく、他の用途にも使用可能である。"Read a card" 命令は80欄ぶんのデータをパンチカードから読み取り、メモリ位置 001-080 に格納する。インデックスレジスタはメモリ上に3本あり、それぞれ 087-089、092-094、097-099 の位置である。"Punch a card" 命令は 101-180 の位置の内容をパンチカードにパンチする。"Write a line" 命令は 201-332 の位置の内容をプリンターに出力する。
1401の命令フォーマットは次の通りである。
 Opcode
 with [A-or-I-or-unit-address [B-address]] [modifier]
 word mark
命令コード (Opcode) は1文字である。メモリアドレス（"I" は分岐先アドレス、"A" と "B" はデータのアドレス）と装置アドレスは3文字で表される。命令コードの修飾子 (modifier) は1文字である。以上から命令の長さは、1文字、2文字、4文字、5文字、7文字、8文字がある。多くの命令は後続文字（通常、次の命令の命令コード）にワードマークを必要とする。
命令一覧は、文字コードと命令コードの節を参照。
命令で使用するメモリアドレスは3文字だが、これは5文字で表されるメモリアドレスを符号化したものである。5文字アドレスの下3桁 000 から 999 までは3文字の数字ビット列を使って指定する。最上位の桁を表す文字のゾーンビットがその3桁への加算値を表しており、"A" なら 1000、"B" なら 2000、"B,A" なら 3000 を加算するので、0から3,999番地までを表現できる。さらに最下位の桁を表す文字のゾーンビットで、"A" なら 4000、"B" なら 8000、"B,A" なら 12000 を加算するので、最大16,000文字までのメモリ位置を指定できる。例えば3文字アドレス "I99" は 3000 + 999 であり、3,999番地を指している。
アドレスの真ん中の文字のゾーンビットはオプション機能のインデックスレジスタを指定するのに使用される。
A-address と B-address が指しているオペランドは、1文字、可変長フィールド、可変長レコードの場合がある。可変長フィールドを指す場合はアドレスの大きい端（数値の場合は最下位の桁）を指し、終端は最後の文字（最上位の桁）にワードマークをセットすることで示す。可変長フィールドの長さには制限がなく、メモリの許す限り長いフィールドを使用可能である。可変長フィールドを扱える命令としては、四則演算（"Add"、"Subtract"、"Multiply"、"Divide"）と比較命令 ("Compare") と文字列転送（変換）命令（"Move Characters to A or B Word Mark"、"Move Characters and Edit"）がある。1つ以上の可変長フィールドで可変長レコードを構成できる。可変長レコードを指す場合はアドレスの大きい端を指し、フィールドはワードマーク付きの Group Mark 文字で区切り、レコード終端（アドレスの一番小さい位置）に Record Mark 文字を置く。"Move Characters to Record or Group Mark" という命令でレコードをまとめたブロックを作ることができる。
アドレスレジスタには命令実行でアクセスしたオペランドのアドレスが残るので、連続するオペランドを使って処理をする場合、アドレスを省略して連鎖させることができる。例えば、連続するデータフィールド群の加算を行うコードが "A 700,850", "A 695,845", "A 690,840" だったとする。これを連鎖させて "A 700,850", "A", "A" のようにアドレス指定を省略することができる。
ブートとサンプルプログラム.
IBM 1402 (パンチカード読み取り/パンチ装置)のLOADボタンが押下されると、カードがバッファ（メモリ上の 001-080 番地）に読み込まれる。このとき001番地の文字にワードマックがセットされ（カードの最初の命令を有効にする）、002-080番地のワードマークはクリアされる。先頭の命令は常に2オペランド（7文字）の "Set Word Mark" 命令であり、これは後続の命令コードにワードマークがなくとも実行可能で、後続の2命令にワードマークをセットできる。このようにしてカードデッキ内の命令列の実行が継続され、プログラムをメモリにロードし、ワードマークをセットし、最後にプログラムの開始アドレスに分岐する。
パンチカード1枚に収まる実用的なプログラムもある。よく使われたのは後続のカードデッキの内容をそのままプリンターに出力するプログラムや後続のカードデッキをそのままカードパンチで複写するプログラムなどである。Tom Van Vleck のウェブサイトには、"HELLO WORLD" とプリンターに出力するパンチカード1枚に収まるプログラムが紹介されている。
上述のようにLOADボタンを押下すると001番地（先頭の ","）から実行を開始する。"," は命令コードとしては Set Word Mark 命令である。それが7命令続いており、読み込んだ全命令にワードマークを設定する。"/" は Clear Storage 命令で、オペランド333で指定されたプリンター出力エリアの 333-300 の範囲をクリアし、次の "/" で連鎖アドレスを使って 299-200 の範囲をクリアする。次の命令コード "M" は Move Charactors to Word Mark 命令であり、079番地から250番地へワードマークまで文字列転送を行うが、これが "HELLO WORLD" をプリンター出力エリアにコピーすることになる。次の "2" が Write line 命令で印字を行い、次の "F" が Control Carriage 命令（修飾子が 1）でプリンターにページ送りをさせ、次の "." が Halt 命令となっていて停止する。065はHalt命令の番地であり、STARTボタンを押下しても停止したままとするようになっている。
ハードウェアの実装.
1401の論理回路のほとんどは Diode-transistor logic(DTL)であり、IBMはこれを"CDTL"と称した。IBMは他にも以下のような回路を使用した。
後のアップグレードでは「ドリフト」型トランジスタ（1953年にハーバート・クレーマーが発明）を使用したDTLで高速化を図っている。これをIBMは"SDTL"と称した。典型的な論理回路の電圧レベルは次の通り:
回路は紙エポキシ樹脂の片面実装プリント基板で構成されていた。基板は2.5インチ×4.5インチで16ピンの金メッキコネクタが1つあるものか、5.375インチ×4.5インチで16ピン金メッキコネクタが2つあるものが使われた。IBMはこれを"SMS"カード(Standard Modular System)と称した。ひとつのカード上の論理回路は7400シリーズなどと同等レベルである(小さいカードには3から5個の論理ゲートか1、2個のフリップフロップ、大きいカードには最大20個の論理ゲートか4個のフリップフロップが実装された)。
これらのSMSカードは、IBMが"gates"と称したラック内のソケットに挿入された。
当時の多くのマシンと同様、1401は磁気コアメモリを使用している。コアの直径は約1mmで、4本のワイヤが通っている。1枚にコアが4000個（4096個ではない）実装されており、コア1個が1ビットに対応している。したがって、そのようなものを8枚使って4000文字ぶんの記憶装置となる。そのようなモジュールが1個、1401の主筐体にある。追加のメモリを装備するには 1406 Core Memory Unit という別筐体が必要である。メモリアクセスは文字単位で、1401は基本サイクルタイムである11.5μ秒の間に1文字をリードまたはライトできる。命令のタイミングは全てこの基本サイクルタイムの倍数となっている。
ソフトウェア.
1401向けソフトウェアとしては、次のようなものがあった。
IBM 1401 から生まれた芸術.
2006年10月、アイスランド出身の前衛音楽家ヨハン・ヨハンソンが4ADから "" というアルバムをリリースしている。アイスランド初のコンピュータの保守技術者だった彼の父と、その友人でアイスランド初のプログラマとなった Elias Davidsson が1964年に作った曲をベースとしている。ヨハン・ヨハンソンは電子音や父が保管していた IBM 1401 が歌った歌を録音したオープンリールの録音テープなども加え、それをオーケストラ向けに書き直して長くした。
1401 の文化.
IBMが提供した最初のアセンブラ Symbolic Programming System は1,400文字のメモリしか搭載していない最小構成のマシンでも動作するよう設計されている。そのため、1パス目で入力命令毎にパンチカードを1枚ずつパンチし、そのカードデッキを2パス目でロードするようにしている。シカゴ大学など多くの場所で、より一般的な4Kメモリを使用し1パス目の出力がパンチカード1枚に複数の命令を入れるようになったアセンブラを使用した。他にも1パス目の出力をメモリに保持するアセンブラも書かれた。
CPUの上にトランジスタラジオを置くと雑音で音楽を奏でることができたため、様々な音楽を演奏するデモプログラムが作られた。また、プリンターで "X" と "0" などを並べて印字することでキッチュな絵を描くというデモプログラムも作られた。
1401は単純だったため、それなりに負荷をかけても信頼性を保つことができた。アメリカ陸軍は IBM 1401 をベトナムなどで多用した。
1970年代にはインドやパキスタンで多く導入され、1980年代にも使われ続けていた。現在のインド人およびパキスタン人のIT起業家の一部は 1401 でコンピュータに触れたのである。例えば、パキスタン初のコンピュータは 1401 で、パキスタン国際航空が導入した。
文字コードと命令コード.
以下の表はキャラクターを辞書的順序で示したものである。