アポロ誘導コンピュータ

アポロ誘導コンピュータ（アポロゆうどうコンピュータ、Apollo Guidance Computer、AGC）とは、アポロ宇宙船の全航行機能を自動制御し、宇宙飛行士が飛行情報を確認/修正するために使われた、リアルタイム組み込みシステムである。ワード長16ビットで、データ15ビット、パリティ1ビットである。AGC上のソフトウェアの大部分はコアロープメモリと呼ばれる特殊なROMに格納されており、小容量の読み書き可能な磁気コアメモリをデータ格納用に備えている。
宇宙飛行士はDSKY（ディスキー）と呼ばれる数値表示部とキーパッドから構成される装置でAGCとやりとりする。AGCとDSKYは、アポロ計画のためにMIT器械工学研究所で開発された。AGCは初期の集積回路を採用したコンピュータの1つである。
アポロの中のAGC.
月への飛行には毎回2つのAGCを使った。ひとつは司令船で、もうひとつは月着陸船で使われた。指令船のAGCは誘導/航行システム (G&C) の中央部にあった。月着陸船のAGCでは（Primary Guidance, Navigation and Control System、一次誘導/航行/制御システム）が動作し、頭字語PGNCSを「ピングス」と発音した。
各ミッションでは他にもふたつのコンピュータを使用していた。
設計.
チャールズ・スターク・ドレイパー率いるMIT器械工学研究所が設計を行った。ハードウェア設計責任者はである。アーキテクチャ設計は、J.H. Laning Jr.、Albert Hopkins、Ramon Alonso、Hugh Blair-Smith が行った。実際に搭載したハードウェアはレイセオンが製造し、同社の Herb Thaler がアーキテクチャ設計チームに加わっていた。マーガレット・ハミルトンがソフトウェアの監督・指導をつとめた。
アポロ誘導コンピュータは初期の集積回路(IC)を使って作られた。Block I バージョンは4,100個のICを使い、それぞれのICは3入力のNORゲートをひとつ構成していた。次の Block II バージョンは2つの3入力NORゲートをひとつのICで構成したものを2,800個使っている。ICはフェアチャイルドセミコンダクター製で、RTLによる実装で、フラットパック () という形でパッケージされている。ICを複数搭載したモジュール同士はワイヤラッピングで相互接続している。モジュールを挿入するソケットから金属棒が出ていて、その金属棒にワイヤーを巻きつけて接続する。金属棒とワイヤーは高圧で押し付けられ、気密結合状態となるため、一般的な半田付けよりも信頼性が高い。配線完了後、ワイヤーはエポキシ樹脂で封止される。すべて同じICを使うことにより、初期のICを使った他のコンピュータ（ミニットマンミサイルの誘導コンピュータ）が悩まされた問題は発生しなかった。
コンピュータのRAMは磁気コアメモリ（2048ワード）でROMはコアロープメモリ（36Kワード）である。どちらもサイクル時間は11.72μ秒。メモリのワード長は16ビットで、そのうち1ビットはパリティビットである。
CPU内の16ビットワードは、14ビットデータと1ビットのオーバーフローフラグ、1ビットの符号フラグから成る（数値は1の補数表現）。
DSKYユーザインタフェース.
ユーザインタフェースユニットはDSKY (display and keyboard) と呼ばれ、通常「ディスキー」と発音した。一連の指示灯、数値表示ディスプレイ、電卓型のキーボードから成る。コマンドは数字で入力され、Verb部とNoun部という2つの数値を入力する。Verb は動作の種類を指定し、Noun は Verb コマンドによって変更されるデータを指定する。
表示は高電圧エレクトロルミネセンス・ディスプレイであり、数字毎に7セグメントで表示され、それを並べて数字列を表している。セグメントは電気機械式リレーで制御されるため、表示の更新速度が制限される（Block IIではもっと高速なシリコン制御整流器が使われている）。3行の5桁の数字で八進数か十進数が表示される。この3つの数値で宇宙船の姿勢を表すベクトルを表示したり、必要な速度変化のベクトルを表示したりする。データは内部では国際単位系で保持されているが、表示は米国慣用単位（ヤード・ポンド法）を使っている。この電卓型インタフェースは、このタイプのものとしては世界初のデジタル制御パネルである。
司令船はふたつのDSKYを備えていた。ひとつはメイン計器パネルにあり、もうひとつは六分儀のそばに設置されて慣性誘導装置を調整するのに使われた。
月着陸船にはひとつのDSKYがAGCに接続されていた。指令船のメイン計器パネルと月着陸船のDSKYには、そのすぐ上にAGCが制御している航行指示装置 (FDAI) がある。
2009年、DSKY1台が Heritage Auctions にて一般向けオークションに出品され、50,788ドルで落札された。
タイミング.
AGCの駆動クリスタル周波数は2.048MHzである。クロックは分周されて4相の1.024MHzとしてAGC内で使われた。さらにそれを分周して512kHzの信号を生成し、これを「マスター周波数」と呼んだ。この信号はAGC以外のアポロ宇宙船のシステムを同期させるのに使われた。
マスター周波数はさらに分周され5分の1の102.4kHzの信号が作られる。これをさらに分周したF1(51.2kHz)からF17(0.78125Hz)の17種類の信号が作られる。F10(100Hz)はAGCに戻され、リアルタイムクロックとPINC（後述）を使った強制カウンターをインクリメントするのに使われる。F17はAGCがスタンバイモードの場合に定期的に動作させるのに使われた。
セントラルレジスタ.
AGCは4本の16ビットレジスタを汎用的に使用した。これらをセントラルレジスタと呼ぶ。
コアメモリには4つの場所があり（アドレス20-23）、ここに格納された値が自動的に1ビットシフトや1ビットローテートされるため "editing locations" と呼ばれた。なお、7ビット右シフトする場所はソフトウェアインタプリタが解釈する擬似命令コードを取り出すのに使われた。これはBlock I、Block IIに共通する。
その他のレジスタ.
AGCには他にも処理の過程で使用するレジスタが存在する。
命令セット.
命令フォーマットは3ビットがオペコードで12ビットがアドレスとなっている。Block Iは11種の命令、codice_1（基本）と codice_2（拡張）を持つ。先頭の8個は基本命令と呼ばれ3ビットオペコードで直接指定される。残り3個は拡張コード命令と呼ばれ、特別なcodice_3命令（codice_4と呼ぶ）の直後に実行される。
Block I AGC の命令の概要は以下のとおり。
命令の実装はグループ化された12のステップでなされており、そのステップを「タイミングパルス」と呼ぶ。タイミングパルスはTP1からTP12まである。12のタイミングパルスのそれぞれのグループを命令の「サブシーケンス」と呼ぶ。TC命令のような単純な命令では、12のタイミングパルスを1つのサブシーケンスとして実行する。複雑な命令ではいくつかのサブシーケンスを必要とする。乗算命令 (codice_38) は8個のサブシーケンスを使用する。最初のサブシーケンスを codice_42 と呼び、次の codice_43 サブシーケンスは6回反復され、codice_44 サブシーケンスで完了する。Block II ではこれが3サブシーケンスに短縮された。
サブシーケンス内の各タイミングパルスは最大5個の「コントロールパルス」を発生できる。コントロールパルスは命令の実際の動作を行わせる信号であり、レジスタの内容をバスに送り出したり、バス上の内容をレジスタに取り込んだりする。
メモリ.
Block I AGCのメモリは1024ワードのバンクから成る。最も低いバンク（バンク0）はRAMであり、それ以外はROMである。各AGC命令には12ビットのアドレスフィールドがあり、下位10ビットでバンク内のアドレスを表す。ビット11と12でバンクを表し、00がRAMバンク、01がバンク1、10がバンク2を示す。11はBankレジスタの内容でバンクを指定することを意味する。バンク1とバンク2は常に直接使用可能であるため、"fixed-fixed"メモリと呼ばれる。バンク3およびそれ以上のバンクは"fixed-switchable"メモリと呼ぶ。
Block I AGCは当初12KワードのROMを持っていたが、後に24Kに拡張された。Block II は32KワードのROMと4KワードのRAMを持つ。
AGCはメモリサイクルと呼ばれる処理でGレジスタ経由でメモリとやり取りする。メモリサイクルはタイミングパルス12個分を要する（11.72μ秒）。TP1でフェッチすべきメモリアドレスをSレジスタにロードする。メモリ回路がSレジスタで指定されたアドレスに対応するメモリからデータを読み出す。RAMから読み出したワードはTP6の時点でGレジスタに格納され、ROMから読み出したワードはTP7の時点でGレジスタに格納される。読み出してきたメモリワードはTP7からTP10の間、Gレジスタで使用可能となっている。TP10を過ぎるとGレジスタの内容はメモリに書き戻される。
AGCのメモリサイクルはAGC動作中は連続的に行われている。メモリ上のデータを必要とする命令は、TP7からTP10の間にアクセスしなければならない。AGCがGレジスタの内容を書き換えると、書き換えた内容がTP10以降にメモリに書き込まれる。このようにして常にメモリサイクルが機能しており、メモリとGレジスタの間でデータがやり取りされている。
各メモリワードの下位15ビットが命令またはデータとして使用される。最上位ビットはパリティビットであり、データの保護に使用される。パリティビットはワード内の1の個数が常に奇数になるよう、データの内容によりパリティ生成回路で1か0に設定される。パリティチェック回路はパリティビットとデータの内容が合っているかをチェックする。もし合っていない場合そのメモリワードは壊れたと判断され、操作パネルの PARITY ALARM というライトが点灯する。
割り込みと強制的カウンタ.
AGCは5種類の割り込みを扱う。
AGCは割り込みが発生すると、それまで実行していたプログラムの実行を中断し、短い割り込みサービスルーチンを実行して、割り込まれたプログラムに復帰する。
AGCは20個の強制カウンタを持っている。それらはメモリの固定の場所に存在し、アップ/ダウンカウンタとシフトレジスタとして機能する。インクリメント(PINC)、デクリメント(MINC)、シフト(SHINC)は通常の命令と命令の間に挿入されるマイクロ命令によって実行される。
割り込みはカウンタがオーバーフローしたときに発生する。T3RUPTとDSRUPTはこのPINCオーバフローの発生をトリガーとして発生する。UPRUPTはSHINCで16ビットぶんシフトしたときに発生する。これはAGCへのアップリンクデータが16ビットシフトし終わったことを示す。
スタンバイモード.
AGCは STANDBY ALLOWED スイッチを使ってパワーセービングモードに移行する。このモードはAGCの電源を切り、2.048MHzのクロック（およびその分周クロック）だけを発生させる。分周クロックの1つであるF17信号により、1.28秒間隔でAGCの電源が入る。そこでAGCは STANDBY ALLOWED スイッチの状態をチェックし、もしまだそのモードならば再び電源を切って次のF17信号を待つ。
スタンバイモードではAGCは眠っているので、PINCを実行してリアルタイムクロックをインクリメントすることができない（通常は10ミリ秒単位でインクリメント）。その代わりとして、F17信号で起きたときにリアルタイムクロックを1.28秒ぶん進める。
スタンバイモードは慣性飛行中AGCを使わないときに電力消費を抑えるために設けられた。通常70Wの電力消費が5Wから10Wに低減される。しかし、実際にはAGCは飛行中ずっと使われ、スタンバイモードが使われることはなかった。
データバス.
AGCは16ビットのリードバスと16ビットのライトバスを持つ。セントラルレジスタ(A、Q、Z、LP)や他の内部レジスタの内容は制御信号によってリードバスに出力される。リードバスとライトバスは非反転バッファでつながっているのでリードバスに出力された内容はライトバスでも観測される。別の制御信号によりライトバスの内容がレジスタに書き込まれる。
データ転送の例：次の命令のアドレスをBレジスタからSレジスタに移動する。
いくつかのレジスタをリードバス上に同時に出力することができる。これが起きるとレジスタの内容が論理和(OR)演算されたビット列がバス上に現れる。これを使ってMASK命令（論理積）を実装している。AGC本体はビット反転ができるので（Cレジスタ）、ド・モルガンの定理に従い、
これでANDに相当することになる。
ソフトウェア.
AGCの要求仕様が定義されたとき、必要なソフトウェアやプログラミング技法は存在せず、一から設計する必要があった。
AGCのソフトウェアはAGCアセンブリ言語で書かれ、コアロープメモリに格納された。
それは単純なリアルタイムオペレーティングシステムであり、最大8個のジョブをバッチジョブスケジューリングシステム(EXEC)で走行させることができる。これにはプリエンプティブでないマルチタスクが使われる（各ジョブは定期的にEXECに制御を戻す必要があり、優先度のより高いジョブが待ち状態になっていないかチェックされる）。また、割り込み駆動型コンポーネントWAITLISTもあり、複数のタイマー駆動型タスクをスケジュールする。タスクは短いスレッドからなり、実行が終了するときにWAITLISTに自分を再実行してもらうようスケジュールしてもらう。あるいは、割り込み処理の中からEXECに対してもっと長いジョブの実行を指示することもできる。
EXECのジョブは優先度制御される。最も優先度の低いダミージョブが常に存在している。ダミージョブが診断チェックを行い、DSKYの COMPUTER ACTIVITY という緑色ランプを制御する。ダミージョブが動作中ということはAGCが何もすることがないことを意味するので、そのランプは消灯される。ダミージョブは優先度の高いジョブがあると中断され、COMPUTER ACTIVITY ランプを点灯させる。
AGCはMITで開発された洗練されたソフトウェアインタプリタを持っていて、もっと複雑で使いやすいマシンを仮想的に実現している。これは8ビット以上の精度を必要とする航行計算で使われた。この仮想マシンは倍精度のスカラーとベクターを扱うことができ、さらには行列とベクトルの積を求める codice_45 命令もあり、それらの命令をAGC本来のコードに混ぜて使うことができる。それら擬似命令を使うとインタプリタがそれをAGCの多数の命令に展開するため余計な時間がかかるが、コードに擬似命令を使うことでプログラムの大きさを縮小する効果があった。当時はメモリ搭載量が何よりも大きな制限だったため、擬似命令はよく使われている。擬似命令の平均実行時間は24ミリ秒である。初期のプロトタイプである "Christmas Computer" のアセンブラ兼バージョン管理システムは "YUL" と呼ばれ、ネイティブコードとインタプリタコードの正しい変換を行っていた。
割り込みベースのユーザインタフェースルーチン群 PINBALL によってキーボードとディスプレイを制御する。PINBALLには宇宙飛行士が任意のアドレスのメモリの内容やレジスタの内容を（8進数または10進数で）表示するための機能もある。モニター相当のルーチンもあるので、定期的に特定のメモリの内容を表示させることも可能である。ジョブを起動することもできる。PINBALLはおおざっぱに言ってしまえばUNIXのシェルと同じことができる。
ソフトウェアの大部分は書き換えできないコアロープメモリに置かれていたが、重要な部分は読み書き可能な磁気コアメモリに置かれていた。このため、DSKYインタフェースを使って宇宙飛行士がプログラムを上書きすることも可能であり、アポロ14号で実際にそれが行われた。
Block II.
Block II バージョンのAGCは1966年に設計された。Block I のアーキテクチャを踏襲したがRAMを1Kワードから2Kワードに拡張している。ROMも24Kワードから36Kワードに拡張されている。命令も11種から34種に拡張され、Block I の入出力関連のレジスタ群が入出力チャネルに置き換えられた。実際に最初に月まで行ったAGCは Block II である。Block I バージョンは無人飛行のアポロ4号から6号までと、事故を起こしてキャンセルされたアポロ1号に装備されていた。
Block II でメモリと命令セットを拡張することが決定されたが、Block I の制限の多い3ビットのオペコードと12ビットアドレスという構成が変わらなかったのは興味深い。様々なトリックを使って命令が追加された。例えばある特定のメモリアドレスに参照アクセスすると特定の機能が動作するなどといったことである。実際、前述したようにアドレス25に対するcodice_3命令は割り込みからの復帰を意味していた。同様に、codice_3 17 を実行するとcodice_48命令(割り込み禁止)を意味し、codice_3 16 は逆に割り込み許可(codice_50)を意味した。他の命令は特別なcodice_3命令であるcodice_4命令を使って実装された。codice_4命令はオーバーフロービットを使って3ビットのオペコードを拡張する。アドレス空間を拡張するためにBank（固定）とEbank（拡張RAM用）レジスタが使われた。ある時点でアクセスできるメモリバンクは、これらのレジスタを使わずにアクセスできる先頭の3バンクと、Bankの指すバンクとEbankの指すバンクだけであった。さらにBankレジスタが指定できる範囲を超えてROMが実装されたためにSbankレジスタが最後の4Kワードにアクセスするのに使われた。バンクをまたがるサブルーチンコールでは、いったんfixed-fixedメモリを経由してコール元のバンクをセーブ/リストアする必要があった。
PGNCSの障害.
PGNCSはアポロ11号による最初の月への降下の際に動作不良となった。そのときAGCは"1201 alarm"（実行オーバーフロー - 空き領域無し）と"1202 alarm"（実行オーバーフロー - コアセット無し）を示していた。どちらの場合もレーダーから不正なデータが大量に送られてきサイクルスチールが起きたことが原因で、降下の間はこれを放置した。エラーによりコンピュータ内の実行中タスクは中断されたが、レーダーの周波数データによればアボート信号が発生したのはCPUが処理しきれない頻度のデータが入ってきたためであることは明らかだった。
着陸時、AGCは通常85%の負荷となる予定だった。その際に使われていない毎秒6400サイクルが13%の負荷に相当し、着陸完了までにスケジュールされているタスクの実行には十分な時間だった。下降を開始して5分後、バズ・オルドリンはDSKYに1668というコマンドを打ち込んだ。これはDELTAH（レーダーで計測した高度とコンピュータが計算した高度の差）を計算して表示させるコマンドである。これによって10%の負荷が追加され、1202アラームが発生した。ヒューストンからの「GO」の指示を受けて、オルドリンは再び1668コマンドを打ち込み、もう一度1202アラームが発生した。このアラームを報告したときオルドリンは「1668を打ち込むとこれが起きる」のではないかとコメントしている。幸いなことに、AGCは優先度制御でスケジューリングされていた。そのため、AGCは優先度の低い1668表示タスクを削除し、重要な誘導・航行タスクを完了させるべくスケジュールし、自動的に回復した。管制官らは何度か「GO」を指示し、着陸は成功した。ベールズは管制チームと宇宙飛行士たちを代表して大統領自由勲章を授与された。
この問題はAGCのバグではなく、宇宙飛行士の間違いでもない。周辺機械設計の問題であり、アポロ5号の技術者が既に指摘し、文書を残していた。しかし問題は試験中に起きただけであり、試験済みの装置を使うほうが新たなレーダーシステムを設計するよりも安全だと結論付けていた。実際のハードウェアでは、ドッキング用レーダーの位置は800Hzの交流で駆動されるシンクロで数値化されるが、これとは別にAGCがタイミング参照に使う800Hzのクロック信号がある。この2つの800Hz信号は同期しておらず、微妙なずれが生じるためにレーダーが動いていないにも関わらずディザによって急速に動いたように見えた。この幻の動きが一連の急速なサイクルスチールの原因である。
アポロ以外での利用.
AGCは、F-8クルセイダーを使ったフライ・バイ・ワイヤシステム実証実験機でも使われた。AGCは計画の第一段階で使われ、第二段階では別のシステムに置換されている。この研究成果がスペースシャトルのフライ・バイ・ワイヤ・システム開発に生かされた。また間接的には、当時開発されていた次世代戦闘機のフライ・バイ・ワイヤ・システムの開発にも貢献している。
AGCはアメリカ海軍の深海救難艇でも使われた。
資料・外部リンク.
AGCおよびその開発に関する文書:
AGC ハードウェア設計、特に集積回路の採用に関する文書:
AGC ソフトウェアに関する文書:
AGCを再現するプロジェクトやシミュレータ:
特集記事: