The original Apollo 11 guidance computer (AGC) source code, as flown on July 20, 1969. The chrislgarry/Apollo-11 repository preserves the Comanche055 program (Command Module Computer) and the Luminary099 program (Lunar Module Guidance Computer), digitised from MIT Museum hardcopies and continuously proof-read against the original scanned printouts.
This guide shows you how to find, read, search, simulate, and contribute corrections to the source. It is for software historians, programmers, embedded-systems students, NASA enthusiasts, and anyone who wants to study the actual software that landed humans on the Moon.
Note
The repository is a historical archive, not an active software product. The code itself dates from 1969 and is in the public domain. The repository's day-to-day work is proof-reading transcriptions against the original scanned printouts.
1. Quick Start
There is nothing to install. The .agc files are plain text and GitHub renders them with native syntax highlighting. The shortest path to value is to open the repository in your browser.
- Visit github.com/chrislgarry/Apollo-11.
- Open the
Luminary099/directory — this is the Lunar Module flight program. - Click
THE_LUNAR_LANDING.agc. You are now reading the routine that flew Eagle from lunar orbit to Tranquility Base. - Open
Comanche055/and clickCONTRACT_AND_APPROVALS.agcto see Margaret Hamilton's sign-off block from 28 March 1969.
Tip
No clone, no toolchain, no editor extension required. GitHub's
.agchighlighting and the in-treeREADME.mdfiles insideComanche055/andLuminary099/index every section by original printout page number — the fastest way to navigate is the program README.
If you want a local copy:
git clone https://github.com/chrislgarry/Apollo-11.git
cd Apollo-11
ls Comanche055 Luminary099
Comanche055/ AGC_BLOCK_TWO_SELF-CHECK.agc ALARM_AND_ABORT.agc ANGLFIND.agc ...
Luminary099/ AGC_BLOCK_TWO_SELF_CHECK.agc AGS_INITIALIZATION.agc ALARM_AND_ABORT.agc ...
To assemble and run the code (turning these listings into a binary that executes on a simulated AGC), you need the separate Virtual AGC project. See Section 2.
To contribute proof-reading corrections, see Section 5.
What you'll find in the next 30 seconds
Luminary099/THE_LUNAR_LANDING.agc—P63(powered descent) andP64(visibility phase).Luminary099/LUNAR_LANDING_GUIDANCE_EQUATIONS.agc— the actual landing maths.Comanche055/P11.agc— Earth orbit insertion monitor.Comanche055/P61-P67.agc— atmospheric reentry guidance.Comanche055/CONTRACT_AND_APPROVALS.agc— the team that signed off the program in 1969.Luminary099/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc— yes, that is the real filename.
2. Installation
There is nothing to install for reading the source. The repository ships only .agc text files and Markdown documentation. Reading is a git clone (or no clone at all — read on GitHub directly).
For assembling and simulating the code, install the Virtual AGC toolchain. Virtual AGC is a separate project that provides:
yaYUL— a modern re-implementation of the original 1969 YUL/GAP assembler.yaAGC— a faithful AGC simulator.yaDSKY2— a graphical DSKY (Display/Keyboard) astronaut interface.
Important
The simulator is maintained by the Virtual AGC project (virtualagc/virtualagc), not by this repository. Build instructions, supported platforms, and dependency lists live in that project's README. The instructions below are the canonical entry path; defer to upstream for current details.
2.1 Read-only install (browse and grep)
| Method | Command |
|---|---|
| Clone via HTTPS | git clone https://github.com/chrislgarry/Apollo-11.git |
| Clone via SSH | git clone git@github.com:chrislgarry/Apollo-11.git |
| Download ZIP | Click Code → Download ZIP on the GitHub web page |
| GitHub Codespaces | Click Code → Codespaces → Create codespace for a browser shell |
System requirements for read-only use are minimal: any system that can store ~30 MB of text and run git, grep, or less. No build tools, no Node, no Python.
2.2 Toolchain install (assemble and simulate)
# Linux / macOS — build Virtual AGC from source
git clone https://github.com/virtualagc/virtualagc.git
cd virtualagc
make
Warning
Native Windows builds of Virtual AGC are non-trivial. Use WSL2 (Ubuntu) and follow the Linux instructions, or download a pre-built release from the Virtual AGC project's releases page. Native MinGW builds are documented in the Virtual AGC README but require manual dependency setup.
2.3 Markdown lint install (for translation contributions only)
If you intend to update or add a translation in Translations/, install the lint dependency before opening a PR:
cd Apollo-11
npm install
npm run lint
The repository ships bun.lockb, indicating the maintainer uses Bun. bun install && bun run lint works equivalently and is faster.
markdownlint-cli2 v0.16.0 ()
Finding: *.md translations/*.md Comanche055/*.md Luminary099/*.md
Note
Markdown linting is needed only for
.mddocumentation changes. Proof-reading PRs that touch.agcfiles do not require any toolchain — the maintainer reviews them by eye against the scans.
2.4 Verify the install
Whether reading or assembling, the easiest sanity check is to print the header of any source file:
head -15 Luminary099/THE_LUNAR_LANDING.agc
# Copyright: Public domain.
# Filename: THE_LUNAR_LANDING.agc
# Purpose: Part of the source code for Luminary 1A build 099.
# It is part of the source code for the Lunar Module's (LM)
# Apollo Guidance Computer (AGC), for Apollo 11.
# Assembler: yaYUL
# Contact: Hartmuth Gutsche <[email removed]>.
# Website: www.ibiblio.org/apollo.
# Pages: 785-792
# Mod history: 2009-05-20 HG Transcribed from page images.
If you see a copyright/provenance block in this exact shape, the file is intact and ready to read.
3. Configuration
There is no runtime configuration: the repository is plain text source code, not a service. The only configuration files in the tree govern editor behaviour and markdown linting for contributors.
3.1 .editorconfig
Sets the canonical AGC formatting that every editor must respect:
root = true
[*]
indent_style = tab
indent_size = 8
trim_trailing_whitespace = true
Tab indentation with width 8 matches the original 1969 printout convention. Any modern editor that respects .editorconfig (most do) will pick this up automatically.
Important
Do not let your editor convert tabs to spaces or strip the
R0000line-break markers in column 1. Either change will produce whitespace-only diffs that bury the real fix and make the PR much harder to review.
3.2 .markdownlint.yml
Disables ten default markdown rules that conflict with the multilingual / historical-attribution / table-heavy nature of the documentation:
default: true
MD007: false # ul-indent
MD010: false # no-hard-tabs
MD013: false # line-length
MD026: false # no-trailing-punctuation in headings
MD033: false # no-inline-html
MD034: false # no-bare-urls
MD036: false # no-emphasis-as-heading
MD041: false # first-line-h1
MD050: false # strong-style
MD053: false # link-image-reference-definitions
| Rule | Why disabled |
|---|---|
MD013 (line length) |
Translation lines and attribution tables are intentionally long |
MD033 (no inline HTML) |
Some translations use HTML for RTL languages |
MD034 (no bare URLs) |
Translation links in the README header are bare by design |
MD041 (first line H1) |
Several translations open with a TOC table |
MD050 (strong style) |
Translations use varying bold conventions |
3.3 package.json
The lint scripts are the only "build" commands in the entire repository:
{
"scripts": {
"lint": "markdownlint-cli2 *.md translations/*.md Comanche055/*.md Luminary099/*.md --config .markdownlint.yml",
"lint:fix": "markdownlint-cli2 *.md translations/*.md Comanche055/*.md Luminary099/*.md --config .markdownlint.yml --fix"
},
"devDependencies": {
"markdownlint-cli2": "^0.16.0"
}
}
Tip
The
translations/*.mdglob is lower-case but the directory in the repository isTranslations/(capitalised). On case-sensitive filesystems some lint runs may not match the translations folder. If you want full coverage, runnpx markdownlint-cli2 'Translations/*.md'separately.
There are no runtime environment variables, no config flags for yaYUL consumed from this repo, no dotenv files.
4. Core Usage
This section explains the directory layout, the assembly-language conventions, and how to read a .agc file end-to-end.
4.1 Directory layout
The repository has three content directories plus a small set of root-level documentation files:
Apollo-11/
├── Comanche055/ 80 .agc files (Command Module program)
├── Luminary099/ 86 .agc files (Lunar Module program)
├── Translations/ 70 README.<lang>.md / CONTRIBUTING.<lang>.md
├── README.md Project overview, attribution, contract block
├── CONTRIBUTING.md Proof-reading rules
├── LICENSE.md Public domain notice
├── package.json markdownlint-cli2 lint scripts
├── bun.lockb Bun lockfile
├── .markdownlint.yml Linter configuration (relaxed rules)
├── .editorconfig Tab indentation, width 8
└── .gitignore Standard ignores
4.2 The two flight programs
| Folder | Program | Computer | Mission role |
|---|---|---|---|
Comanche055/ |
Colossus 2A build 055 | Command Module Computer (CMC), aboard Columbia | Earth launch monitoring, Trans-Lunar Injection support, mid-course corrections, Trans-Earth Injection, atmospheric reentry, CSM attitude control |
Luminary099/ |
Luminary 1A build 099 | LM Guidance Computer (LGC), aboard Eagle | Powered descent (the lunar landing itself), lunar surface attitude control, ascent, rendezvous with the CSM |
Note
The two programs are not the same code. They share an executive, waitlist scheduler, interpreter, IMU services, and DSKY UI, but the application layer differs entirely — Comanche handles atmospheric reentry; Luminary handles a vacuum-only powered descent and ascent. Each program also stamps a header line with the exact assembly date.
Comanche055/MAIN-style header: Assemble revision 055 of AGC program Comanche by NASA
2021113-051. 10:28 APR. 1, 1969
Luminary099/MAIN.agc header: Assemble revision 001 of AGC program LMY99 by NASA 2021112-061
16:27 JUL. 14, 1969
4.3 Source file naming
Each .agc file is named after the subroutine log section it contains, taken from the original 1969 printout's Table of Contents. The original program was a single monolithic listing; modern transcribers split it into one file per logical section. The full section catalogue with original page numbers lives in each program's README.md.
Examples of section names (these are real filenames in the tree):
EXECUTIVE.agc— the cooperative scheduler.WAITLIST.agc— the timed-task scheduler.INTERPRETER.agc— the on-board virtual machine for vector/double-precision math.THE_LUNAR_LANDING.agc— the powered-descent ignition program (Luminary099 only).LUNAR_LANDING_GUIDANCE_EQUATIONS.agc— the descent guidance maths (Luminary099).BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc— the master-ignition routine.PINBALL_GAME_BUTTONS_AND_LIGHTS.agc— the DSKY (display/keyboard) driver.
4.4 Reading a .agc file
Every .agc file follows the same structure:
4.4.1 Header block
# Copyright: Public domain.
# Filename: THE_LUNAR_LANDING.agc
# Purpose: Part of the source code for Luminary 1A build 099.
# Assembler: yaYUL
# Pages: 785-792
# Mod history: 2009-05-20 HG Transcribed from page images.
The Pages: field is load-bearing for proof-readers — it points back to the original scanned printout. Open the same pages in the Luminary099 scans to compare line by line.
4.4.2 Body
The body is a sequence of:
- Page-number comments (
# Page 785) — anchors back to the printout. - Bank directives (
BANK 32,SETLOC F2DPS*32) — fixed-memory bank assignments. - Erasable bank declarations (
EBANK= E2DPS) — the data bank in scope. - Labels and instructions in classic two-column assembly:
P63LM TC PHASCHNG
OCT 04024
TC BANKCALL # DO IMU STATUS CHECK ROUTINE R02
CADR R02BOTH
CAF P63ADRES # INITIALIZE WHICH FOR BURNBABY
TS WHICH
The first column is the label; the second is the opcode; the third is the operand; everything after # is a comment. AGC opcodes are extremely terse — TC is "transfer control", CA is "clear and add" (load), TS is "transfer to storage" (store), CCS is the unique "count, compare, skip" branch instruction.
4.5 The verb/noun command surface
Operating the AGC is done through the DSKY (DiSplay/KeYboard) using a verb/noun language. A verb is the action ("display", "load", "monitor"); a noun is the data on which to act ("velocity", "GMT time", "specific value"). This is implemented across:
| File | Role |
|---|---|
PINBALL_GAME_BUTTONS_AND_LIGHTS.agc |
Keypad scanner, display driver, lamp logic, verb/noun decoder |
PINBALL_NOUN_TABLES.agc |
Noun definitions, scaling, units, decimal/octal display rules |
EXTENDED_VERBS.agc |
Verbs ≥40 (operator-action verbs) |
DISPLAY_INTERFACE_ROUTINES.agc |
Display priority arbitration |
A representative slice from Luminary099/EXTENDED_VERBS.agc:
| Verb | Action |
|---|---|
V37 |
Change major mode (selects the mission program — V37 E63E runs P63 powered descent) |
V49 |
Start automatic attitude maneuver |
V57 |
Permit landing radar updates |
V58 |
Inhibit landing radar updates |
V63 |
Sample radar once per second |
V69 |
Force a hardware restart |
V75 |
Enable U,V jets during DPS burns |
V82 |
Request orbit parameter display (R30) |
V83 |
Request rendezvous parameter display (R31) |
V92 |
Operate IMU performance test |
Tip
Read
EXTENDED_VERBS.agcandPINBALL_GAME_BUTTONS_AND_LIGHTS.agctogether to understand how the DSKY operating language works. The pinball file is the keypad/display driver — it scans the keys, decodes verbs/nouns, and lights the warning/status lamps. Yes, that is its real name in 1969.
4.6 Mission programs (P-programs) and routines (R-routines)
Mission programs are large state machines that drive a phase of the mission. Routines are reusable subroutines that programs call.
| Class | Examples | Purpose |
|---|---|---|
| P-program (CSM) | P11, P20-P25, P30-P37, P40-P47, P51-P53, P61-P67 |
Mission phase control (orbit, rendezvous, burns, IMU align, reentry) |
| P-program (LM) | P12, P20-P25, P40-P47, P63-P67, P70-P71 |
Ascent, rendezvous, descent burns, powered descent, abort |
| R-routine | R30, R31, R60_62, R63 |
Orbit/rendezvous parameter display, attitude reference |
| DAP | P-AXIS_RCS_AUTOPILOT.agc, Q_R-AXIS_RCS_AUTOPILOT.agc, DAPIDLER_PROGRAM.agc |
Digital Auto-Pilot (RCS attitude control) |
| Guidance | LUNAR_LANDING_GUIDANCE_EQUATIONS.agc, BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc |
Trajectory and burn control |
| Navigation | KALMAN_FILTER.agc, MEASUREMENT_INCORPORATION.agc, INTEGRATION_INITIALIZATION.agc |
State-vector update from sensor data |
| Hardware | T4RUPT_PROGRAM.agc, KEYRUPT_UPRUPT.agc, IMU_MODE_SWITCHING_ROUTINES.agc |
Interrupt service routines, IMU drivers |
Note
The most famous Luminary099 file is
THE_LUNAR_LANDING.agc(pages 785–792), which contains the powered-descent ignition program P63 that ran during the final landing. The companion fileLUNAR_LANDING_GUIDANCE_EQUATIONS.agc(pages 798–828) contains the actual guidance maths.
4.7 Editor support
There is no IDE for AGC, but several editors have community syntax-highlighting packages:
| Editor | Extension | Auto-format |
|---|---|---|
| Visual Studio Code | agc-assembly | Yes |
| Sublime Text 3 | AGC-Assembly | Yes |
| Atom | language-agc | Yes |
| Vim | vim-assembly | No |
| Eclipse | Virtual AGC contrib | No |
| jEdit | Virtual AGC contrib | No |
| Code::Blocks | Virtual AGC contrib | No |
| Kate | Virtual AGC contrib | No |
Tip
If you plan to contribute proof-reading fixes, install one of the auto-format options (the top three rows above). They enforce the correct indentation rules — tabs at width 8, trim trailing whitespace — automatically.
5. Common Tasks
5.1 Find a specific routine
Use grep against the program directory to locate a routine by label:
# Find the file that contains powered-descent ignition
grep -rln "^P63LM\|^P63 " Luminary099/
Luminary099/THE_LUNAR_LANDING.agc
# Find the alarm-and-abort handler for a specific code
grep -rn "ALARM" Luminary099/ALARM_AND_ABORT.agc | head -10
# Find every interpretive opcode usage of VLOAD
grep -rn "VLOAD" Luminary099/ | head -20
5.2 Learn AGC architecture from the source
Read these in order to walk through the operating-system layer:
EXECUTIVE.agc— task scheduling and priorities (the cooperative scheduler).WAITLIST.agc— timed-task list (interrupt-driven scheduler).INTERRUPT_LEAD_INS.agc— interrupt vector table at fixed address4000.T4RUPT_PROGRAM.agc— the ~10 ms display/keyboard timer interrupt.KEYRUPT_UPRUPT.agc— keypress and uplink interrupts.RESTARTS_ROUTINE.agc+FRESH_START_AND_RESTART.agc— fault-tolerant restart logic.
Note
The famous 1201 ("no VAC areas") and 1202 ("no core sets") alarms during Apollo 11's descent are restart-overflow alarms handled here. The restart logic re-issued the active mission program (P63 then P64) without losing position/velocity state — the descent continued to a successful landing because the restart system worked exactly as designed.
5.3 Walk through the lunar landing
Open these files in order while reading the original mission timeline:
Luminary099/P40-P47.agc— Powered Descent Initiate (PDI) preparations.Luminary099/THE_LUNAR_LANDING.agc— P63 (braking phase), P64 (visibility phase).Luminary099/LUNAR_LANDING_GUIDANCE_EQUATIONS.agc— the guidance maths.Luminary099/THROTTLE_CONTROL_ROUTINES.agc— descent-engine throttle control.Luminary099/SERVICER.agc— 2-second navigation/guidance update cycle.Luminary099/P70-P71.agc— DPS / APS abort programs (in case landing fails).
5.4 Simulate the code with Virtual AGC
Once Virtual AGC is built and yaYUL, yaAGC, yaDSKY2 are on your PATH:
cd /path/to/Apollo-11/Luminary099
yaYUL --html MAIN.agc
The assembler walks the $<filename> include directives in MAIN.agc (yaYUL include syntax), produces a binary core-rope image, and emits an HTML cross-reference listing.
yaAGC --core=MAIN.bin &
yaDSKY2
You can then enter V37 E63E on the simulated DSKY to begin powered descent — exactly as Buzz Aldrin did on July 20, 1969 (with substantially different state-vector inputs).
Caution
The simulator is a faithful re-creation of the AGC opcodes and DSKY UI, but real flight data, RADAR inputs, and IMU drift are not present. The code will execute and respond to DSKY input; full landing simulations require the test fixtures shipped with Virtual AGC.
5.5 Study the famous "1202 alarm" code path
The 1202 alarm fired multiple times during the final approach. Walk the path that triggered and recovered from it:
Luminary099/EXECUTIVE.agc— read theNOVACandFINDVACentry points and look for the overflow check that posts an alarm. The cause is VAC-area exhaustion (1202) or core-set exhaustion (1201).Luminary099/ALARM_AND_ABORT.agc— the routine that posts the alarm code on the DSKY and decides whether to abort.Luminary099/RESTARTS_ROUTINE.agc— the recovery path that re-issues the active program from its last good phase.Luminary099/PHASE_TABLE_MAINTENANCE.agc— the redundant phase-number storage that the restart consults.Luminary099/FRESH_START_AND_RESTART.agc— the cold-start vector and the warm-restart entry.
Important
The alarms occurred because spurious rendezvous-radar interrupts overloaded the executive's VAC pool. The restart logic re-validated phase tables, killed broken jobs, and resumed P63 (then P64) within milliseconds. This is the most-studied piece of fault-tolerant systems engineering in spaceflight history.
5.6 Contribute a comment annotation (proof-reading PR)
The repository's primary work is reconciling the digital transcription with the original scanned printouts. Discrepancies — even single typos or whitespace differences — are valid pull requests.
The proof-reading rule (from CONTRIBUTING.md):
Comments in the transcribed code MUST match the scans exactly — including original typos, spacing, and line breaks.
| Program | Scans URL |
|---|---|
| Comanche055 | http://www.ibiblio.org/apollo/ScansForConversion/Comanche055/ |
| Luminary099 | http://www.ibiblio.org/apollo/ScansForConversion/Luminary099/ |
| Side-by-side viewer | https://28gpc.csb.app/ |
git clone https://github.com/<your-user>/Apollo-11.git
cd Apollo-11
git checkout -b proof/luminary099-pXXX
# Edit files. Match the scans exactly.
git add Luminary099/<file>.agc
git commit -m "Proof Luminary099 page XXX: <short description>"
git push origin proof/luminary099-pXXX
Open a pull request against chrislgarry/Apollo-11:master.
Important
Reference the page number of the scan in your commit message and PR body. Maintainers verify by opening that page side-by-side with your diff. Without the page reference, the PR is much slower to review.
Open proof-reading campaigns
Several files have explicit GitHub issues open for proof-reading work (issue numbers as of commit 247dd7d):
- #608 — Proof
MEASUREMENT_INCORPORATION.agc - #217 — Proof
INTERPRETER.agc - #566 — Proof
AOTMARK.agc - #234 — Proof
P34-35_P74-75.agc - #204 — Proof
ERASABLE_ASSIGNMENTS.agc - #639 — Proof
SPS_BACK-UP_RCS_CONTROL.agc - #648 — Proof
TJET_LAW.agc - #647 — Proof
TIME_OF_FREE_FALL.agc - #960 — Add line-by-line validation tests against original scanned documents
Proof-reading checklist
- [ ] Open the scanned page next to your edit.
- [ ] Verify every comment character-for-character (typos preserved).
- [ ] Verify spaces match (single between words, double between sentences).
- [ ] Verify line breaks match (
R0000markers in column 1 are kept). - [ ] Re-run the markdown linter if you edited a
README.md(npm run lint). - [ ] Cite the page number in your commit message.
6. Troubleshooting
Error: yaYUL: command not found
Cause: Virtual AGC is not built or not on your PATH.
Solution: Build Virtual AGC from source (virtualagc/virtualagc) and add the yaAGC/ and yaYUL/ directories to PATH. Or download a pre-built Virtual AGC release.
Prevention: Verify with which yaYUL before assembly. If empty, fix PATH first.
Error: assembler reports Unrecognized opcode "..." on a known-good file
Cause: Either (a) you are using an older yaYUL version that does not support a directive used in this transcription, or (b) the file has been corrupted (CRLF line endings on Windows are the most common culprit).
Solution: Update Virtual AGC from the latest master. If the issue persists, run dos2unix Luminary099/<file>.agc to normalise line endings, then re-assemble.
Prevention: Configure git with core.autocrlf=input on Windows so checkouts use Unix line endings.
Error: markdownlint-cli2 reports many MD013 (line length) violations
Cause: You are linting outside the repository, where the .markdownlint.yml config (which disables MD013) is not picked up.
Solution: Always run npm run lint from the repository root. The --config .markdownlint.yml flag in package.json ensures the local config is used.
Prevention: Use the npm run lint script rather than calling markdownlint-cli2 directly.
Issue: My PR diff shows whitespace-only changes I did not make
Cause: Your editor stripped trailing whitespace, changed tabs to spaces, or normalised line endings on save.
Solution: Configure your editor per .editorconfig: tab indentation, tab width 8, trim trailing whitespace, and preserve LF line endings. Re-clone and re-apply your changes if the diff is unfixable.
Prevention: Install one of the auto-formatting editor extensions from Section 4.7.
Issue: GitHub renders my .agc file as plain text
Cause: GitHub's syntax highlighter detects AGC by the .agc extension. If you renamed the file or added a non-standard extension, highlighting drops.
Solution: Restore the .agc extension. Do not rename source files.
Prevention: Treat the file naming convention (SUBROUTINE_LOG_SECTION.agc) as a hard rule — it matches the original printout layout.
Issue: I cannot find MAIN.agc for Comanche055
Cause: Comanche055's master include file may use a different name or its includes may be embedded in ASSEMBLY_AND_OPERATION_INFORMATION.agc. The two programs were transcribed separately and use slightly different conventions. (Luminary099 has an explicit MAIN.agc.)
Solution: Open Comanche055/README.md — the Source Code Index lists the include order. Refer to Virtual AGC's Comanche055/ mirror for the canonical entry point if it differs.
Prevention: Always read the program's README.md before assembling.
Issue: A line ends with R0000 and I am unsure what that means
Cause: R0000 in column 1 marks a logical "page-marker" continuation in the original printout layout. It is related to the unprinted column-8 digits (2 = double space, 3 = triple space) used by the original GAP assembler.
Solution: Match the scan exactly. Do not strip R0000 markers. Their presence is significant for proof-reading line-break fidelity.
Prevention: Read CONTRIBUTING.md "Line breaks" section before editing line-break-sensitive files.
Issue: My code-improvement PR was closed without merge
Cause: The repository accepts proof-reading corrections only. PRs that "modernise" or "improve" the original 1969 code are out of scope.
Solution: Re-scope the change as a transcription correction (cite the scan page) or take it to virtualagc/virtualagc, which is the active simulation/development project.
Prevention: Read the project README and CONTRIBUTING.md before opening a PR — the historical-archive policy is the first thing both documents establish.
Issue: My translation PR fails the lint step
Cause: Markdownlint applies the relaxed .markdownlint.yml rules; if you added rules locally or edited the wrong glob, the lint may surface false positives.
Solution: Run npm run lint from the repository root. If a rule fails legitimately, fix the markdown; if it fails because of a translation-specific construct, document the case in the PR and the maintainer can decide whether to relax further.
Prevention: Always lint locally before pushing. The lint runs fast (one second on a modern machine).
7. FAQ
Q: Can I use this code in my own project?
Yes. The Apollo Guidance Computer source code is in the public domain. NASA software written under government contract before 1978 has no copyright protection in the United States. You may copy, modify, and redistribute it without restriction.
Q: Will this code actually run on a modern computer?
Not directly. The AGC is a 15-bit fixed-architecture machine with its own opcodes, registers, and core-rope memory layout. To run it you need an emulator. The Virtual AGC project provides yaAGC (the simulator) and yaDSKY2 (the DSKY UI). With those, you can assemble Luminary099/MAIN.agc and execute it.
Q: What's the difference between Comanche055 and Luminary099?
Comanche055 ran on the Command Module Computer aboard Columbia; Luminary099 ran on the Lunar Module Guidance Computer aboard Eagle. They share an executive, interpreter, IMU services, and DSKY UI, but the application layer differs entirely — Comanche handles atmospheric reentry, CSM attitude, and trans-Earth/-Lunar trajectories; Luminary handles powered descent, lunar surface stay, ascent, and rendezvous.
Q: Why are there so many translations of README.md?
The repository has historically welcomed translation contributions, and the Apollo program has worldwide cultural significance. Each translation makes the source code more accessible to a non-English-reading audience. They are README/CONTRIBUTING translations only — the AGC source code itself remains in English (the comments are historical artifacts, not translatable content).
Q: Is this the "real" Apollo 11 source code?
Yes — these files are line-by-line transcriptions of the actual hardcopy printouts produced by the GAP assembler in 1969 and archived at the MIT Museum. The transcription is community-driven, so individual lines may contain digitisation typos still being corrected (see proof-reading issues in Section 5.6). For absolute fidelity, cross-check against the scanned printouts.
Q: Was Margaret Hamilton involved with this code?
Yes. Margaret H. Hamilton was the Colossus Programming Leader at MIT's Instrumentation Laboratory and signed off on the Comanche055 program on 28 March 1969. The contract block in Comanche055/CONTRACT_AND_APPROVALS.agc records her approval signature alongside Daniel J. Lickly, Fred H. Martin, Norman E. Sears, Richard H. Battin, David G. Hoag, and Ralph R. Ragan.
Q: What were the 1201 and 1202 alarms during the lunar landing?
These are AGC restart codes (octal). 1201 = "executive overflow — no VAC areas"; 1202 = "executive overflow — no core sets". They were triggered by spurious rendezvous-radar interrupts overloading the executive. The restart logic in RESTARTS_ROUTINE.agc and FRESH_START_AND_RESTART.agc recovered the active mission program and continued the descent without losing data — a triumph of fault-tolerant design that allowed the landing to proceed.
Q: How do I find the file that contains a specific verb or noun?
Verbs ≥40 are dispatched from a fan-out table at the top of EXTENDED_VERBS.agc. Verbs <40 are dispatched in PINBALL_GAME_BUTTONS_AND_LIGHTS.agc. Noun definitions are in PINBALL_NOUN_TABLES.agc. To find a specific verb's implementation: grep -rn "VERB69\|VB69" Luminary099/.
Q: Can I add my own changes that improve the code?
The repository is a historical archive. Code-improvement PRs are not accepted — only proof-reading corrections that bring the transcription closer to the original scanned printouts. If you want to experiment with the AGC, fork the repo or work on the Virtual AGC project, which actively maintains running simulations.
Q: Is the source archived anywhere besides GitHub?
Yes, it is mirrored on Software Heritage, guaranteeing long-term preservation independent of GitHub's availability.
Q: What does "Colossus 2A" mean?
"Colossus" is the family name for the Command Module flight programs across multiple Apollo missions. "2A" is a specific revision in that family, of which Comanche is build series 055 (the version flown on Apollo 11). Equivalently, "Luminary" is the Lunar Module program family, and Luminary 1A build 099 flew on Apollo 11.
Q: Why is one file called BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc?
That is its real name in the original 1969 printout — the engineers had a sense of humour. It is the master ignition routine for the descent and ascent main engines. The double dash is preserved exactly as printed.
Q: Why is the DSKY driver called PINBALL_GAME_BUTTONS_AND_LIGHTS.agc?
The original NASA team treated the keypad and display lamps as a pinball-machine I/O surface — a charming 1969 metaphor that survived into the canonical filename. It does the keyboard scanning, display refresh, lamp logic, and verb/noun decoding.
Q: Where can I learn more about how the AGC actually works?
Three excellent starting points:
- The Virtual AGC project documentation — Ron Burkey's comprehensive site on AGC architecture, scans, and emulation.
- Digital Apollo: Human and Machine in Spaceflight by David A. Mindell — the definitive engineering history.
- Don Eyles' Sunburst and Luminary — first-person memoir by one of Luminary's principal authors.
Q: How do I find the page number in the original printout for a given line of code?
Each .agc file embeds page-number anchors as comments (# Page 785). Search backwards from the line of interest for the most recent # Page comment. Cross-reference to the scanned printout at the corresponding URL in Comanche055/README.md or Luminary099/README.md.