アポロ誘導コンピュータ | 1966
Apollo Guidance Computer
アポロ誘導コンピュータ(AGC)は、アポロ計画のために設計されたデジタルコンピュータで、各アポロ司令モジュール(CM)とアポロ月着陸船(LM)に搭載されていました。AGCは宇宙船の航法、ナビ
ゲーション、制御のための計算と電子インターフェースを提供しました。このコンピュータは、シリコン集積回路(IC)に基づく最初のコンピュータであり、1970年代後半の最初の家庭用コンピュータであるApple II、TRS-80、Commodore PETと同程度の性能を持っていました。
AGCは16ビットのワード長を持ち、15ビットのデータビットと1ビットのパリティビットで構成されています。AGCのほとんどのソフトウェアは、「コアロープメモリ」と呼ばれる特殊な読み出し専用メモリに保存されており、これは磁気コアを通してワイヤーを編んで作られたものです。また、小さな読み書き可能なコアメモリも存在しました。
宇宙飛行士は、AGCと通信するためにDSKY(ディスプレイおよびキーボード、発音は「DIS-kee」)と呼ばれる数字表示器とキーボードを使用しました。AGCとDSKYのユーザーインターフェースは、1960年代初頭にMIT計測研究所によってアポロ計画のために開発され、1966年に初めて飛行しました。
プロジェクト・ジェミニでは、宇宙飛行士が手動で飛行しましたが、アポロプロジェクトではほとんどの飛行がコンピュータによって行われ、月面着陸時にのみ一時的に手動飛行が行われました。各月のミッションには2台のAGCが搭載されており、1台は司令モジュールに、もう1台はアポロ月着陸船に設置されました。ただし、アポロ7号は地球軌道ミッションであり、アポロ8号は月軌道ミッションのために月着陸船を必要としませんでした。司令モジュールに搭載されたAGCは、その航法、ナビゲーション、制御(GNC)システムの中心でした。月着陸船に搭載されたAGCはアポロPGNCS(主航法、ナビゲーション、制御システム)を操作し、このシステムは「ピングス」と発音されました。
各月のミッションには、さらに2台のコンピュータがありました。1台はサターンVロケットの発射体デジタルコンピュータ(LVDC)で、発射体の計測リングに取り付けられ、もう1台は月着陸船の緊急航法システム(AGS、発音は「ags」)でした。AGSは月着陸船のPGNCSが故障した場合に使用され、月から離陸して司令モジュールと再会することができましたが、着陸はできませんでした。
AGCの設計は、MIT計測研究所のチャールズ・スターク・ドラッパーの指導の下で行われ、ハードウェア設計はエルドン・C・ホールが主導しました。初期のアーキテクチャ作業は、J.H.ラニング(J.H. Laning Jr.)、アルバート・ホプキンス(Albert Hopkins)、リチャード・バッティン(Richard Battin)、ラモン・アロンソ(Ramon Alonso)、ヒュー・ブレア・スミス(Hugh Blair-Smith)などによって行われました。飛行ハードウェアはレイセオン(Raytheon)で製造され、ハーブ・セイラー(Herb Thaler)もアーキテクチャチームの一員でした。
IC技術が1963年のインタープラネタリー・モニタリング・プラットフォーム(IMP)で初めて使用された後、AGCでも集積回路(IC)技術が採用されました。アポロ飛行コンピュータは、シリコンICチップを使用した最初のコンピュータでした。ブロックIバージョンは4,100個のICを使用し、各ICは単一の3入力NORゲートを含んでいました。その後のブロックIIバージョン(有人飛行に使用されたバージョン)は約2,800個のICを使用し、ほとんどはデュアル3入力NORゲートであり、少数の拡張器とセンスアンプも含まれていました。これらのICはフェアチャイルドセミコンダクター(Fairchild Semiconductor)で生産され、抵抗-トランジスタ論理(RTL)方式で製造されました。これらのICはフラットパック形式で作られ、ワイヤーラップで接続された後、その配線は鋳造エポキシプラスチックに埋め込まれました。
AGCで使用されたICの1つのタイプ(デュアル3入力NOR)は、他の初期ICコンピュータ設計で発生した問題を回避できるようにしました。たとえば、ミニットマンIIミサイルの誘導コンピュータは、多数のダイオード-トランジスタ論理とダイオード論理ゲートを混合して使用したため、問題が発生しました。NORゲートはすべての他のゲートを作成できる普遍的な論理ゲートですが、より多くのゲートを使用する必要があるという欠点がありました。
AGCのメモリは、2,048個の消去可能な磁気コアメモリと36,864個の読み出し専用コアロープメモリで構成されていました。両方のメモリのサイクルタイムは11.72マイクロ秒でした。メモリワードの長さは16ビットで、15ビットのデータビットと1ビットのパリティビットが含まれていました。CPU内部の16ビットワード形式は、14ビットのデータビット、1ビットのオーバーフロービット、1ビットの符号ビット(1の補数表現)で構成されていました。
AGCのユーザーインターフェースはDSKY(ディスプレイおよびキーボード)で、一般的に「DIS-kee」と発音されます。DSKYはさまざまな表示灯、数字表示、および計算機スタイルのキーボードを備えていました。コマンドは2桁の数字で入力され、ここで動詞は実行する動作の種類を指定し、名詞はその動作に影響を与えるデータを指定しました。
各数字は緑色(530nm)の高電圧エレクトロルミネセント7セグメントディスプレイを通じて表示され、このディスプレイは電気機械的リレーによって駆動されていたため、更新速度に制限がありました。3桁の符号付き数字は8進数または10進数で表示でき、通常は宇宙船の姿勢や必要な速度変化(デルタV)などのベクトルを表示するために使用されました。内部データはメートル法単位で保存されましたが、表示される値はアメリカの慣習単位で示されました。この計算機スタイルのインターフェースは、その当時の最初の形態でした。
司令モジュールにはAGCに接続された2つのDSKYがありました:1つは主要計器盤に、もう1つは慣性航法プラットフォームを整列させるためのセクスタント近くの下部機器区域に位置していました。月着陸船にはAGCに接続された1つのDSKYがありました。飛行監督者姿勢表示器(FDAI)はAGCによって制御され、司令モジュールとLMの指揮官コンソールにあるDSKYの上に位置していました。
AGCのタイミング基準は、2.048 MHzのクリスタルクロックから得られました。このクロックは2回分割され、1.024 MHzの4つの周波数を生成し、AGCはこれを使用して内部作業を実行しました。1.024 MHzのクロックはさらに2回分割され、512 kHzの信号であるマスターフリーケンシーが生成され、この信号はアポロ宇宙船の外部システムを同期させるために使用されました。
マスターフリーケンシーはリングカウンターを介して5で割られ、102.4 kHzの信号が生成され、さらに17段階のF1(51.2 kHz)からF17(0.78125 Hz)まで分割されました。F10段階(100 Hz)はAGCに戻され、リアルタイムクロックを増加させ、他の必須カウンターを更新するために使用されました。F17段階は、AGCが待機モードにあるときにAGCを間欠的に実行するために使用されました。
AGCは一般的な計算のために4つの16ビットレジスタを持っており、これを中央レジスタと呼びました:
A:一般的な計算のための加算器
Z:プログラムカウンタ – 次に実行する命令のアドレス
Q:DV命令の余り値とTC命令後の戻りアドレス
LP:MP命令後の下位乗算結果
また、コアメモリにはアドレス20から23に対応する4つの位置があり、これらは「編集位置」と呼ばれました。これらの位置に保存された値は、1つのビット位置が移動または回転した形で表示され、そのうちの1つは右に7ビット移動して7ビット解釈用の演算コードの1つを抽出しました。この動作はブロックIとブロックIIのAGCの両方に共通していました。
AGCは内部作業中に使用される追加のレジスタも持っていました:
S:12ビットメモリアドレスレジスタ、メモリアドレスの下位部分
Bank/Fbank:4ビットROMバンクレジスタ、固定スイッチモードで1キロワードROMバンクを選択
Ebank:3ビットRAMバンクレジスタ、消去可能スイッチングモードで256ワードRAMバンクを選択
Sbank(スーパー銀行):Fbankの拡張された1ビット、36キロワードROMの最後の4キロワードはFbankだけではアクセスできないため必要でした
SQ:4ビット順次レジスタ;現在の命令
G:16ビットメモリバッファレジスタ、メモリからデータを移動させるときに使用
X:加算器の「x」入力(加算器はすべての1の補数算術演算を実行)
Y:加算器の「y」入力
U:実際にはレジスタではなく、加算器の出力(XとYレジスタの1の補数の合計)
B:一般用バッファレジスタ、次の命令を事前に取得するためにも使用
C:別のレジスタではありませんが、Bレジスタの1の補数
IN:4つの16ビット入力レジスタ
OUT:5つの16ビット出力レジスタ
AGC命令セット
アポロ誘導コンピュータ(AGC)は、基本命令と拡張命令に分かれた命令セットを使用しました。命令形式は3ビットの演算コード(opcode)と12ビットのメモリアドレスで構成されていました。ブロックI AGCは合計11の命令を持ち、これらは基本命令と拡張命令に分類されます。最初の8つは基本命令であり、最後の3つは特別な命令シーケンスを通じて実行される拡張命令です。
基本命令(3ビット演算コードで直接アクセス可能)
TC(Transfer Control、制御転送):
この命令は、命令に指定されたアドレスに無条件に分岐します。
戻りアドレスは自動的にQレジスタに保存され、この機能によりTC命令はサブルーチン呼び出しにも使用できます。
CCS(Count, Compare, and Skip、カウント、比較、スキップ):
複雑な条件付き分岐命令で、Aレジスタに命令で指定されたアドレスのデータを読み込みます。
その後、減少した絶対値(DABS)を計算してAレジスタに保存します。Aレジスタの値に応じて4つの分岐のうちの1つにスキップします。
CCS命令はループや条件分岐で頻繁に使用され、AGCでループを作成する際に重要な役割を果たしました。
INDEX(インデックス):
命令に指定されたアドレスからデータを加算して、次の命令のアドレスを修正します。これは配列やテーブルを処理する際に使用されます。
RESUME(再開):
INDEX命令の特別な形式で、INDEX 25として定義されます。この命令は、割り込みが発生した位置から実行を再開するために使用されます。
XCH(Exchange、交換):
Aレジスタとメモリの内容を交換する命令です。もしメモリアドレスが読み出し専用メモリ(ROM)にある場合、メモリの内容は影響を受けず、Aレジスタの値がロードされます。しかし、消去可能なメモリ(RAM)ではオーバーフロー修正が発生する可能性があります。
CS(Clear and Subtract、クリアして引き算):
Aレジスタに命令で指定されたメモリアドレスの1の補数値をロードする命令です。
TS(Transfer to Storage、ストレージに転送):
Aレジスタの値を指定されたメモリアドレスに保存する命令です。TS命令はオーバーフローを検出し、これを修正して多重精度の加算/減算を処理できるようにします。オーバーフローが発生した場合、上位ビットがメモリに送信され、Aレジスタは+1または-1に変更されます。
AD(Add、加算):
メモリの内容をAレジスタに加算し、結果をAレジスタに保存する命令です。Aレジスタの左側の2ビットはオーバーフロー状態を示す可能性があり、2つ以上の数を加算する場合にオーバーフローが発生する可能性があります。
拡張命令(特別なTC命令でアクセス)
MASK(ビット単位演算):
メモリの値とAレジスタの値をビット単位でAND演算し、その結果をAレジスタに保存する命令です。
MP(Multiply、乗算):
Aレジスタの内容を指定されたメモリアドレスのデータと掛け算し、高位の乗算結果はAレジスタに、低位の乗算結果はLPレジスタに保存する命令です。このとき、乗算結果の符号は一致します。
DV(Divide、除算):
Aレジスタの内容を指定されたメモリアドレスのデータで割り、商はAレジスタに、余りはQレジスタに保存する命令です。AGCは固定小数点数を扱うため、割る数が被除数より小さい場合、誤った結果が出る可能性があります。
SU(Subtract、引き算):
命令で指定されたメモリアドレスのデータをAレジスタから引き、その結果をAレジスタに保存する命令です。
AGCの命令は、基本的に12のタイミングパルス(タイミングサイクル)で構成されたグループで実行されました。各タイミングパルスは、実際の作業を実行するために最大5つの制御パルスをトリガーすることができます。たとえば、MP(乗算)命令は8つのサブシーケンスを使用し、最初のシーケンスであるMP0の後にMP1シーケンスが6回繰り返され、最後にMP3シーケンスが実行されます。ブロックIIでは、乗算命令が3つのサブシーケンスに減少しました。
AGCでは、メモリは12ビットアドレスを持つ1キロワードのバンクで構成されており、そのうち最初のバンクは消去可能なメモリ(RAM)に、残りのバンクは固定メモリ(ROM)に使用されました。各命令はメモリアドレスを介してデータをやり取りし、メモリサイクルは12のタイミングパルスの間に実行されました。
割り込みと非自発的カウンター
AGCは5つのベクトル化された割り込みをサポートしていました:
Dsrupt:定期的な時間間隔でトリガーされ、ユーザーディスプレイ(DSKY)を更新します。
Erupt:さまざまなハードウェアエラーや警告が発生したときに生成されます。
Keyrupt:ユーザーのキーボードでキーが押されたときに発生します。
T3Rrupt:ハードウェアタイマーから定期的に発生し、AGCのリアルタイムクロックを更新します。
Uprupt:16ビットのアップリンクデータがAGCにロードされるたびに発生します。
AGCは各割り込みに反応する際、現在実行中のプログラムを一時停止し、短い割り込みサービスルーチンを実行した後、停止していたプログラムを再開しました。
AGCには20の非自発的カウンターもありました。これらはアップ/ダウンカウンターやシフトレジスタとして機能するメモリ位置でした。カウンターは内部入力に反応して増加または減少したり、シフトしたりすることができました。増加はPinc、減少はMinc、シフトはShincというマイクロ命令サブシーケンスによって、2つの一般命令の間に挿入されて処理されました。
割り込みはカウンターがオーバーフローしたときに発生する可能性がありました。T3ruptおよびDsrupt割り込みは、100Hzのハードウェアクロックによって駆動されるカウンターがオーバーフローしたときに発生し、多くのPincサブシーケンスが実行された後に発生しました。Uprupt割り込みは、カウンターがShincサブシーケンスを実行して16ビットのアップリンクデータをAGCにシフトしたときに発生しました。
待機モード
AGCには省電力モードがあり、このモードは待機許可スイッチによって制御されていました。このモードでは、2.048 MHzのクロックとスケーラーを除いてAGCの電源が切られました。スケーラーからのF17信号はAGCの電源を入れ、1.28秒ごとにAGCを再起動しました。このモードでは、AGCは必須機能を実行し、待機許可スイッチをチェックし、まだアクティブであれば電源を切って再び眠りに戻りました。
待機モードでは、AGCはほとんどの時間を眠っていたため、10msごとにリアルタイムクロックを更新するために必要なPinc命令を実行できませんでした。これを補うために、AGCが待機モードから目覚めるたびにリアルタイムクロックを1.28秒ずつ更新する機能を実行しました。
待機モードは、ミッドコース飛行中にAGCが必要ないときに5〜10Wの電力を節約するように設計されました。しかし、実際にはAGCはすべての飛行段階で常に電源が入っており、この機能は使用されませんでした。
データバス
AGCには16ビットの読み取りバスと16ビットの書き込みバスがありました。データは中央レジスタ(A、Q、Z、またはLP)または他の内部レジスタから読み取りバスにゲーティングされることができました。読み取りバスは反転バッファを介して書き込みバスに接続されており、読み取りバスに表示されるデータは書き込みバスにも表示されました。他の制御信号は、書き込みバスのデータをレジスタに再コピーすることができました。
データ転送は次のように機能しました:次の命令のアドレスをBレジスタからSレジスタに移動するには、RB(読み取りB)制御信号が発行され、この信号はBレジスタのアドレスを読み取りバスに移動させ、その後再び書き込みバスに移動させました。WS(書き込みS)制御信号は、書き込みバスからSレジスタにアドレスを移動させました。
複数のレジスタからデータを同時に読み取りバスに転送することができました。この場合、各レジスタのデータは含まれたOR演算によって読み取りバスに合成されました。この含まれたOR機能は、Mask命令を実装するために使用され、論理AND演算を実行するために活用されました。AGCは基本的に論理ANDを直接実行できませんでしたが、バスを介した論理ORとCレジスタを介した補数(反転)を利用することで、デ・モルガンの定理を適用し、論理ANDと同等の演算を実装しました。これは、2つのオペランドを反転させ、バスを介して論理OR演算を実行し、その後結果を再び反転させることによって行われました。
ソフトウェア
AGCソフトウェアはAGCアセンブリ言語で記述され、ロープメモリに保存されました。ほとんどのソフトウェアは読み出し専用ロープメモリに保存され、運用中に変更することはできませんでしたが、一部の重要なソフトウェアは標準の読み書き可能な磁気コアメモリに保存されており、宇宙飛行士がDSKYインターフェースを使用して上書きすることができました。たとえば、アポロ14号ではこの方法で一部のソフトウェアが上書きされました。
AGCはJ. Halcombe Laningが設計したシンプルなリアルタイムオペレーティングシステムによって制御されていました。このオペレーティングシステムには、Execというバッチジョブスケジューリングシステムと、Waitlistという割り込みベースのプリエンプティブスケジューラが含まれていました。Execは協力的マルチタスクをサポートし、Waitlistはタイマーに基づくタスクをスケジュールして作業を制御しました。タスクは短い実行単位であり、自分自身を再スケジュールしたり、Execを介してより長い作業を開始したりすることができました。計算はメートル法を使用しましたが、表示出力はアポロ宇宙飛行士が慣れ親しんだ単位であるフィート、フィート毎秒、海里で表示されました。
AGCにはMIT計測研究所が開発したソフトウェアインタープリタが搭載されており、これによりAGCが元々サポートしていなかったより複雑で機能的な擬似命令を実装できるようになりました。このインタープリタは仮想マシンを実行し、16ビットおよび24ビットの倍精度三角法、スカラーおよびベクトル算術、さらにはMXV(行列×ベクトル)命令までサポートしました。インタープリタコードはAGCネイティブコードと混合して使用することができました。インタープリタコードの実行時間は長くなりましたが、メモリ要件は少なく、新しい命令をAGCに追加する際にメモリを節約することが可能でした。平均して、擬似命令は約24msの実行時間がかかりました。
AGCのソフトウェアは、Pinballという割り込みベースのユーザーインターフェースルーチンセットも提供し、キーボードおよびディスプレイサービスを処理しました。宇宙飛行士はこれらのルーチンを使用して、特定のメモリ位置を8進数または10進数で表示し、特定のメモリ位置を定期的に更新するモニタールーチンを使用することができました。また、作業を開始するためのルーチンも提供されました。
MIT計測研究所で開発されたAGC設計原則は、非同期ソフトウェア、優先順位スケジューリング、テスト、人間-機械協力意思決定能力など、ソフトウェア工学の基礎を確立する上で重要な役割を果たしました。AGCの設計要件が定義されたとき、必要なソフトウェアとプログラミング技法は存在しなかったため、最初から設計する必要がありました。
ブロックII
AGCのブロックIIバージョンは1966年に設計されました。基本的なブロックIアーキテクチャを維持しながら、消去可能なメモリが1キロワードから2キロワードに増加し、固定メモリが24キロワードから36キロワードに拡張されました。命令セットは11から34に増加し、I/Oチャネルが導入されてブロックIのI/Oレジスタを置き換えました。ブロックIIバージョンは、実際に月に行ったAGCバージョンです。ブロックIは無人アポロ4号と6号の飛行に使用され、不運なアポロ1号にも搭載されました。
ブロックIIでメモリと命令セットを拡張することにした決定は、興味深い設計的結果をもたらしました。ブロックIの制限された3ビット演算コードと12ビットアドレスをそのまま維持しながら、追加の命令を挿入できるようにさまざまなトリックが使用されました。たとえば、特定の機能を実装するために特別なメモリアドレスを参照する方法が使用されました。たとえば、アドレス25を参照すると、割り込みから復帰するRESUME命令が実行され、アドレス17はINHINT(割り込み禁止)命令を、アドレス16は割り込みを再活性化するRELINT命令を実行しました。他の命令はEXTENDという特別なTCバージョンで前に付けて実装されました。アドレス空間は固定メモリと消去可能メモリを使用するBank(固定)とEbank(消去可能)レジスタを介して拡張されたため、与えられた時間にアドレス指定できるメモリは現在のバンクと少量の固定-固定メモリ、消去可能メモリに制限されました。また、バンクレジスタは最大32キロワードをアドレス指定できるため、最後の4キロワードにアクセスするにはSbank(スーパー-バンク)レジスタが必要でした。すべての交差-バンクサブルーチン呼び出しは、固定-固定メモリを介して特別な機能を使用して元のバンクを復元した後に戻る必要がありました。本質的には、これは遠くにあるポインタシステムでした。
ブロックII AGCは、EDRUPT命令も持っていました(名前は「Ed's Interrupt」の略で、この命令を要求したプログラマーEd Smallyの名前に由来します)。この命令は割り込みを生成せず、割り込み処理で通常実行される2つの作業を実行します。最初の作業は追加の割り込みを禁止することで、これを再活性化するにはRESUME命令が必要です。2番目の作業は、プログラムカウンタ(Z)の現在の値をZRUPTレジスタにロードすることです。この命令はアポロソフトウェアで一度だけ使用され、その使用目的は月着陸モジュールのデジタル自動操縦装置(DAP)サイクル終了シーケンスを設定することでした。この命令がLEM AGCのルミナリーソフトウェアをエミュレートする際に問題を引き起こしたと考えられています。
1201および1202プログラムアラーム
アポロ11号の月着陸中、AGCは1202アラーム(「Executive overflow - NO CORE SETS」)と1201アラーム(「Executive overflow - NO VAC AREAS」)を発生させました。AGCの反応はソフトリスタートであり、その原因は意図的に待機状態にしていた遭遇レーダーから発生した迅速かつ持続的なサイクルの盗用でした。このレーダーは、万が一の状況に備えて着陸中に必要な場合に備えて待機中でした。
着陸過程でAGCのプロセッサは通常約85%の負荷がかかっていました。さらに、毎秒6,400サイクルが盗まれることで、プロセッサの負荷が約13%増加し、予定されたすべての作業を完了する時間がほとんど残っていませんでした。着陸の5分前、バズ・オルドリンはコンピュータに1668命令を入力しました。この命令は、レーダーで検出された高度と計算された高度の差を定期的に計算して表示するよう指示しました。1668命令はプロセッサの作業負荷をさらに10%増加させ、エグゼクティブオーバーフローと1202アラームを発生させました。その後、ヒューストンから「GO」命令を受けたオルドリンは1668命令を再入力し、再び1202アラームが発生しました。2回目のアラームを報告しながら、オルドリンは「1668が実行されるときにこのアラームが発生するようです」と述べました。
AGCソフトウェアは優先順位スケジューリングを使用して設計されており、自動的に回復しました。低優先順位の作業である1668ディスプレイ作業を削除し、重要な誘導および制御作業を完了しました。誘導コントローラーであるスティーブ・ベイルスと彼のサポートチーム(ジャック・ガーマンを含む)は、何度も「GO」信号を送り、着陸を成功に導きました。
問題の原因はAGCのプログラムエラーや操縦士のミスではなく、すでにアポロ5号のエンジニアによって知られ文書化されていたハードウェア設計のバグでした。しかし、この問題はテスト中に一度だけ発生したため、エンジニアは新しいレーダーシステムをテストするよりも既存のハードウェアを使用する方が安全だと結論づけました。実際のハードウェアでは、遭遇レーダーの位置は800Hz ACの2つの異なる周波数ソースから誘導されたシンクロでエンコードされており、そのうちの1つはコンピュータのタイミング基準として使用されていました。2つの800Hzソースは周波数はロックされていましたが、位相はロックされておらず、微細なランダム位相変化によりアンテナが急激に「振動」しているように見えましたが、実際には静止していました。この仮想的な動きがサイクルの盗用を迅速に生成しました。
J. Halcombe Laningのソフトウェアおよびコンピュータ設計のおかげで、アポロ11号の着陸ミッションは成功しました。もしLaningの設計がなければ、着陸は安定した誘導コンピュータの不足により中止されていたでしょう。
アポロ以外の応用プログラム
フライバイワイヤ試験機
AGCはF-8クルセイダー航空機に搭載された実験的フライバイワイヤ(FBW)システムの基礎を形成しました。このシステムは、コンピュータが駆動するFBWの実用性を証明するために使用されました。プログラムの最初の段階で使用されたAGCは、2番目の段階で別の機械に置き換えられ、この研究は宇宙シャトルのFBWシステム開発につながりました。AGCはまた、当時開発中だった次世代戦闘機のフライバイワイヤシステム開発にも間接的に貢献しました。
ソースコード公開
2003年、ロン・バーキーは仮想AGCプロジェクトを開始し、アポロ誘導コンピュータ(AGC)のソースコードを復元し、機能的なエミュレーターを作成することを目指しました。このプロジェクトの一環として、1960年代のハードコピーから写し取られデジタル化された元のコードが仮想AGCプロジェクトとMIT博物館を通じて公開されました。この努力は2016年中頃に、元NASAインターンのクリス・ガリーがコードをGitHubにアップロードしたことで再注目を集め、大きなメディアの関心を呼びました。
