アポロ 11 号のソースコードの読み方: AGC コマンドモジュールと月着陸船プログラムの読み方ガイド

chrislgarry/Apollo-11 リポジトリの Comanche055 と Luminary099 を紹介し、ナビゲーション プログラムをダウンロードして見つけ、AGC アセンブリ ファイルを理解し、仮想 AGC を使用してコンパイル研究を続ける方法を説明します。

chrislgarry/Apollo-11 アポロ 11 号のナビゲーション コンピューターのソース コードの転写が含まれています。これは記念コードの模造品ではなく、司令船で使用されるComanche055や月着陸船で使用されるLuminary099など、MIT博物館が保管する紙のプログラムリストをデジタル化したAGCソースコードです。

初めてウェアハウスを開いたときに最も混乱するのは、見慣れた src、ビルド スクリプト、およびアプリケーション エントリがないのはなぜですか?答えは、このソフトウェアは 1969 年に作成されたものであり、その構成、アセンブリ ツール、およびハードウェア モデルはすべて、現代のソフトウェア エンジニアリングの実践よりも古いものであるということです。この記事は目次から始まり、実際に読めるルートを記載しています。

簡単な答え

まずソース コードのクローンを作成します。

1
2
git clone https://github.com/chrislgarry/Apollo-11.git
cd Apollo-11

次に、宇宙船モジュールに従ってディレクトリを選択します。

  • Comanche055/: Colossus 2A コマンドモジュール用プログラム。
  • Luminary099/: 月着陸船用の Luminary 1A プログラム。

最初から一行ずつ読まないことをお勧めします。まず各ディレクトリの README.mdMAIN.agc を開き、タスクに応じて ALARM_AND_ABORT.agcEXECUTIVE.agcDISPLAY_INTERFACE_ROUTINES.agc およびその他のモジュールを表示します。コンパイルまたは実行のシミュレーションを行う場合は、仮想 AGC を使用する必要があります。アポロ 11 号の倉庫自体は、主に歴史的なソース コードの保存と校正を担当しています。

この倉庫には何が保管されていますか?

アポロ ガイダンス コンピューター (略して AGC) は、アポロ宇宙船の誘導、ナビゲーション、および制御システムの重要な部分です。アポロ 11 号の司令船と月着陸船は異なるミッションを持っていたため、次の 2 つの手順が使用されました。

目次 対応プログラム 目的
Comanche055 コロッサス 2A / コマンチ リビジョン 055 指揮船ナビゲーション、姿勢制御、軌道計算、再突入タスク
Luminary099 ルミナリー1A / LMY99 月着陸船の降下、着陸、上昇、ランデブーミッション

倉庫の指示には、組み立て日が 1969 年 4 月 1 日と 1969 年 7 月 14 日として記録されています。ソース コードは、紙リストのスキャン コピーに基づいて、仮想 AGC コミュニティと MIT 博物館の関係者によって転記および整理され、オリジナルのスキャン コピーに対して継続的に修正が加えられます。

これは、リポジトリの主な目的は歴史的資料を忠実に保存することであり、プログラムを現代のコードに再構築することではないことを意味します。スペル、コメントの書式設定、または見慣れないモジュール境界が見つかった場合、今日のコーディング標準に従ってそれらを直接「修正」するのは適切ではありません。

ソース コードが多数の .agc ファイルに分割されている理由

元のプログラムは、全体として組み立てられた単一のコードです。当時は、今日一般的なコンパイルとリンクのプロセスはなく、プログラム モジュールは、順番に組み立てられたパンチカードの束に近かったです。デジタル プロジェクトの管理を容易にするために、巨大なソース コードが複数の .agc ファイルに分割され、包含関係によって全体の順序が復元されました。

したがって、ここでのファイル分割は自然なサブルーチン境界を表しますが、最新のプロジェクトにおける独立したコンパイル単位と同等ではありません。各ディレクトリの README.md は、ファイルを元の印刷リストのページ番号に対応させるソース コード インデックスを提供します。一般的なプロジェクトの説明としてではなく、目次として読む必要があります。

AGC のオリジナルの YUL とそれ以降の GAP は、アセンブラから直接利用できなくなりました。 Virtual AGC プロジェクトによって提供される yaYUL は、わずかに異なる入力形式を使用しており、ウェアハウス内の転写ソース コードも yaYUL に適合しています。

推奨される読む順序

1. まず契約書、組立情報、入口を読んでください。

次の 3 つのファイルから始めて、まずプログラムの全体像を作成できます。

1
2
3
CONTRACT_AND_APPROVALS.agc
ASSEMBLY_AND_OPERATION_INFORMATION.agc
MAIN.agc

CONTRACT_AND_APPROVALS.agc プロジェクト ID、契約、承認情報を保存します。 ASSEMBLY_AND_OPERATION_INFORMATION.agc アセンブリ構造とサブルーチン呼び出しについて説明します。 MAIN.agc は、複数のソース コード フラグメントを完全なプログラムに順番に組み込みます。

2. タスクの意味が明確なモジュールを確認する

命令セットを直接学習する場合と比較して、目的を説明できるファイル名を持つモジュールを最初に選択することで、その状態に入るのが簡単になります。

1
2
3
4
5
6
ALARM_AND_ABORT.agc
FRESH_START_AND_RESTART.agc
EXECUTIVE.agc
WAITLIST.agc
DISPLAY_INTERFACE_ROUTINES.agc
PINBALL_GAME_BUTTONS_AND_LIGHTS.agc

そのうち、EXECUTIVE.agcWAITLIST.agc は、タスクのスケジュール設定を理解するのに役立ちます。 PINBALL_GAME_BUTTONS_AND_LIGHTS.agc は、宇宙飛行士が使用するディスプレイとキーボード インターフェイスに関連しています。アラームおよび再起動モジュールは、システムが異常な状態にどのように対処するかを確認できます。

3. ついに特定の飛行段階に入ります

コマンドモジュールディレクトリには、軌道統合、自動操縦、再突入制御、姿勢制御などのプログラムが含まれています。月着陸船カタログは、降下誘導、着陸段階、デジタル自動操縦、上昇手順などのタスクから始めるのに適しています。

ファイル名の Pxx は通常、宇宙飛行士が DSKY を通じて選択したプログラム番号に対応します。たとえば、P40-P47.agcP51-P53.agc、およびその他のファイルがウェアハウス内に表示されます。 Rxx は、ルーチン番号によく使用されます。これらのファイルを読む前に、組み立て説明書だけを翻訳するよりも、対応する飛行段階と操作手順を理解しておく方がはるかに効果的です。

ローカルでコードをすばやく見つける

ウェアハウス ファイルが多数あるため、1 つずつクリックするよりもテキスト検索を使用する方が便利です。 Git Bash、Linux、または macOS で実行:

1
2
3
find Comanche055 Luminary099 -name "*.agc" | sort
grep -Rni "ALARM" Comanche055 Luminary099
grep -Rni "RESTART" Comanche055 Luminary099

ripgrep がインストールされている場合は、より高速な検索方法を使用できます。

1
2
rg -n "ALARM|RESTART" Comanche055 Luminary099 -g "*.agc"
rg -n "1201|1202" Luminary099 -g "*.agc"

2 番目のコマンドは、有名な 12011202 プログラム アラームの関連場所を見つけるために使用できますが、1 つの文字列の一致だけで完全なトリガー ロジックを結論付けることはできません。アラーム番号、発生条件、タスクのスケジューリング、表示処理は複数のモジュールに分散している場合があり、呼び出し関係と併せて読み込む必要があります。

PowerShell では、次のようにソース コードを一覧表示できます。

1
2
Get-ChildItem -Path Comanche055,Luminary099 -Filter *.agc -Recurse
Select-String -Path Comanche055\*.agc,Luminary099\*.agc -Pattern 'ALARM|RESTART'

.agc ファイルはどのように見えるべきですか?

AGC アセンブリは、現在一般的な x86 または ARM アセンブリとは大きく異なります。コード行に直面したときは、次の部分を順番に識別できます。

  1. ラベル: プログラム エントリまたはデータの場所に名前を付けます。
  2. オペレーションコード: AGC 命令またはインタプリタ命令。
  3. オペランド: アドレス、定数、またはシンボル。
  4. 注: アルゴリズム、飛行条件、および工学的制限について説明します。
  5. ページ番号マーキング: オリジナルの用紙リストとスキャンしたコピーを対応付けるのに役立ちます。

コメントを単に興味深いテキストとして考えないでください。過去のソフトウェアの場合、コメントは要件の説明、動作条件、設計理由として機能することがよくあります。部分的なラベルを完全な関数として誤解することを避けるために、隣接するモジュール、シンボル定義、および元のマニフェストのページ番号と組み合わせて読み取ります。

コンパイルして実行をシミュレートする方法

Apollo-11 リポジトリの README には、Virtual AGC に対するコンパイル要件が明確に示されています。推奨されるプロセスは次のとおりです。

  1. アポロ 11 号のウェアハウスを歴史的なソース コードおよびファイル インデックスとして保存します。
  2. 仮想 AGC の現在のプラットフォームのビルド手順を読みます。
  3. yaYUL アセンブラと AGC シミュレータを使用します。
  4. ターゲット プログラムのバージョンに応じて、Comanche または Luminary のソース コードを選択します。
  5. アセンブリ結果およびチェックサムを、プロジェクトによって提供される参照情報と比較します。

Virtual AGC でサポートされるプラットフォーム、依存関係、およびビルド コマンドはバージョンによって変更される可能性があり、実行前にウェアハウス内の最新のドキュメントが優先される必要があります。 Apollo-11 のルート ディレクトリで汎用の make または npm install を実行すると、飛行プログラム イメージが生成されるとは考えないでください。ルート ディレクトリに最新のプロジェクト ファイルが存在しても、.agc の過去のソース コードの実際のツールチェーンは変更されません。

文字起こしが正確であることを確認する方法

このプロジェクトは貢献を歓迎しますが、修正はオリジナルのスキャンに基づいて行う必要があります。疑わしい文字やスペルを見つけた場合は、次の手順に従うことをお勧めします。

  1. ディレクトリ README.md で、対応する元のページ番号を見つけます。
  2. プロジェクトにリンクされている Comanche 055 または Luminary 099 スキャン データを開きます。
  3. コード、コメント、記号、ページ番号マークを比較します。
  4. CONTRIBUTING.md を読んでください。
  5. 明示的な転写の違いのみを含むプル リクエストを送信します。

大文字と小文字を統一したり、歴史的なスペルを修正したり、最新のフォーマットを採用したりするために、ソース コードをバッチフォーマットしないでください。歴史的アーカイブ プロジェクトでは、何よりもトレーサビリティを追求しており、一見きれいに見える機械的な変更により校正がより困難になる場合があります。

よくある質問

これはマーガレット・ハミルトン単独で書かれたものですか?

いいえ。倉庫の契約と承認には、マーガレット H. ハミルトンが Colossus プログラミング リーダーとして記載されていますが、複数のプロジェクト リーダーも記録されています。 Apollo ソフトウェアはチームの取り組みとして構築されており、ウェアハウス全体を 1 人のプログラマーに帰するのは正確ではありません。

GitHub 上のコードは、当時の宇宙船が保存したオリジナルのファイルですか?

より正確には、これは MIT 博物館に保管されている紙在庫のスキャンから yaYUL 用に転写および調整されたバージョンです。ウェアハウスには元のプログラム コンテンツとページ番号の対応が保持されていますが、キャリアとフォーマットはデジタル的に整理されています。

なぜ司令船と月着陸船の 2 つのプログラムに分かれているのですか?

2 つの航空機には異なる使命があります。司令船は軌道、姿勢、ランデブー、再突入を処理する必要があり、月着陸船は降下、着陸、月面離陸、ランデブーを完了する必要があるため、それぞれがミッション用に設計された AGC プログラムを使用します。

これらのコードは最新の航空宇宙システムで直接使用できますか?

これはすべきではありません。このリポジトリは、歴史的研究、コンピュータ アーキテクチャの学習、シミュレーション実験に適しており、最新の環境で実証された運用ソフトウェアではありません。最新のセーフティクリティカルなシステムには、独立した要件、検証、認証、およびハードウェア適応プロセスが必要です。

概要

アポロ 11 号のソース コードを読むための正しいエントリ ポイントは、最初の行から最後の行まで一生懸命読むことではなく、まず Comanche055Luminary099 を区別し、ディレクトリ インデックスを使用してタスク モジュールを見つけ、次に元のページ番号、AGC 命令セット、および仮想 AGC ツール チェーンを組み合わせてレイヤーごとにドリルダウンすることです。このリポジトリは、過去のソフトウェアの検索可能なアーカイブであると同時に、非常に限られたリソースを使用して、飛行制御、ミッションのスケジュール設定、警報回復、および人間とコンピュータの相互作用がどのようにして完全なシステムに組織化されたかを示すデモンストレーションでもあります。

プロジェクトアドレス: chrislgarry/Apollo-11

シミュレーションおよびコンパイル ツール: 仮想 AGC