
Apollo 11 Guidance Computer source code - uptown
https://github.com/chrislgarry/Apollo-11
======
blueintegral
Someone opened an issue: "Check continuity on O2 cryogenic tanks before
allowing stir"

[https://github.com/chrislgarry/Apollo-11/issues/3](https://github.com/chrislgarry/Apollo-11/issues/3)

~~~
js2
This is a classic XY issue, suggesting a fix ("Check continuity...") instead
of describing the problem ("O2 tanks exploded during Apollo 13 mission").

Further, I believe that the suggested fix is incorrect, or at least
insufficient. The Apollo 13 investigation indicated that a list of factors led
to the fan wires in the O2 tanks having damaged insulation. However, unless
the wires were already short-circuited before stirring, checking continuity
first would not have detected the short. Indeed, the tank was stirred twice
earlier in the mission without incident. The investigation suggested that
operating the fans itself may have eventually moved the wires into contact
with each other, which combined with the damaged insulation, finally allowed
an electrical arc and the resulting explosion to occur.

The correct fix is to upgrade the thermostatic switches which protect the tank
heaters from overheating to accommodate 65 V DC, so that the fan wiring isn't
damaged in the first place. In addition, the tank acceptance procedure should
be amended to require switch cycling under load.

Source:
[http://history.nasa.gov/SP-4029/Apollo_13a_Summary.htm](http://history.nasa.gov/SP-4029/Apollo_13a_Summary.htm)

~~~
jakub_h
Or maybe describing the problem in the explicit way you mentioned instead of
the oblique way would have ruined the joke?

------
js2
Watch the landing:

[https://www.youtube.com/watch?v=k_OD2V6fMLQ](https://www.youtube.com/watch?v=k_OD2V6fMLQ)

During the landing, you'll here mention of 1201 and 1202 alarms. Here's what
that's about:

[http://www.hq.nasa.gov/office/pao/History/alsj/a11/a11.1201-...](http://www.hq.nasa.gov/office/pao/History/alsj/a11/a11.1201-pa.html)

Here's 1201 being called:

[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/EXECUTIVE.s#L134)

And 1202:

[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/EXECUTIVE.s#L200)

~~~
victorantos
This one is better image quality
[https://www.youtube.com/watch?v=Jg80HZsv_js](https://www.youtube.com/watch?v=Jg80HZsv_js)

~~~
waiseristy
Here's one with subtitles and interactivity
[http://www.firstmenonthemoon.com/](http://www.firstmenonthemoon.com/)

~~~
mind_heist
Wow ! Just saw the whole landing again. I have seen the video before , but I
never understood who was saying what . This is the best way all those
conversations could have been visualized !

------
elcapitan
This is amazing and contains so many gems.

I think this one is my favorite module:
[https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUN...](https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUNAR_LANDING.s)

    
    
    		CAF	CODE500		# ASTRONAUT:	PLEASE CRANK THE
    		TC	BANKCALL	#		SILLY THING AROUND
    		CADR	GOPERF1
    		TCF	GOTOP00H	# TERMINATE
    		TCF	P63SPOT3	# PROCEED	SEE IF HE'S LYING
    
            	TC	BANKCALL	# ENTER		INITIALIZE LANDING RADAR
    		CADR	SETPOS1
    
    		TC	POSTJUMP	# OFF TO SEE THE WIZARD ...
    		CADR	BURNBABY

~~~
enzanki_ars
[https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUN...](https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUNAR_LANDING.s#L245)
\- Link to referenced code.

------
sgt
Take note of the KALMAN_FILTER.s source code file. See
[https://en.wikipedia.org/wiki/Kalman_filter](https://en.wikipedia.org/wiki/Kalman_filter)
for details. The filter is named after Rudolf Kalman who recently passed away.
([https://en.wikipedia.org/wiki/Rudolf_E._K%C3%A1lm%C3%A1n](https://en.wikipedia.org/wiki/Rudolf_E._K%C3%A1lm%C3%A1n))

------
sjtgraham
BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.s -
[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/BURN_BABY_BURN
--MASTER_IGNITION_ROUTINE.s)

~~~
ceocoder
I really wish we can do an AMA with these two,

> # THE MASTER IGNITION ROUTINE WAS CONCEIVED AND EXECUTED, AND (NOTA BENE) IS
> MAINTAINED BY ADLER AND EYLES.

I had to look this up, NOTA BENE is latin for,

    
    
      observe carefully or take special notice

~~~
ghurtado
I think I'm going to start using NOTA BENE in my source code comments just to
be fancy.

[EDIT] On second thought "HONI SOIT QUI MAL Y PENSE" would be much better
("Shame on whosoever would think badly of it")

~~~
anarazel
Postgres' code is full of NB: :)

------
Animats
There's a simulator, if you want to run it.[1] But it's just a simulator for
the computer; there's no spacecraft attached.

There's a mod for Kerbal Space Program which gives it real solar system
planets and dimensions. (KSP's world is way undersized so things happen
faster.)[2]

There's another mod for Kerbal Space Program to give it real dynamics.[3] (KSP
doesn't really do dynamics right; the spacecraft is under the gravitational
influence of only one body at a time. This is why there's that sudden
trajectory change upon Mun capture.)

Someone should hook all that together and do a moon landing in simulation.

[1] [http://svtsim.com/moonjs/agc.html](http://svtsim.com/moonjs/agc.html) [2]
[https://www.reddit.com/r/KerbalSpaceProgram/comments/1piaqi/...](https://www.reddit.com/r/KerbalSpaceProgram/comments/1piaqi/in_realsized_earth_and_moon_mod_fullscale/)
[3]
[http://forum.kerbalspaceprogram.com/index.php?/topic/62205-w...](http://forum.kerbalspaceprogram.com/index.php?/topic/62205-wip113-principia-
version-%D8%A8%D9%88%DA%98%DA%AF%D8%A7%D9%86%DB%8C-released-2016-06-26-n-body-
and-extended-body-gravitation/)

~~~
kyberias
I'm really surprised there isn't a moon landing simulator based on the real
code yet.

~~~
robryk
There's an Orbiter plugin[1] that simulates the rest of the spacecraft. IIRC
it can interface with this simulator to get an accurate simulation of the
computer.

[1]
[http://nassp.sourceforge.net/wiki/Main_Page](http://nassp.sourceforge.net/wiki/Main_Page)

------
uptown
Love this line:

    
    
      TC	BANKCALL	# TEMPORARY, I HOPE HOPE HOPE
      CADR	STOPRATE	# TEMPORARY, I HOPE HOPE HOPE
      TC	DOWNFLAG	# PERMIT X-AXIS OVERRIDE
    

[https://github.com/chrislgarry/Apollo-11/blob/master/LUNAR_L...](https://github.com/chrislgarry/Apollo-11/blob/master/LUNAR_LANDING_GUIDANCE_EQUATIONS.s#L179)

~~~
Anchor
And this:

    
    
      GAINBRAK,1        # NUMERO MYSTERIOSO
    

[https://github.com/chrislgarry/Apollo-11/blob/master/LUNAR_L...](https://github.com/chrislgarry/Apollo-11/blob/master/LUNAR_LANDING_GUIDANCE_EQUATIONS.s#L666)

~~~
dhoe
Line 666

------
ianbertolacci
Have they considered rewriting it in rust?

~~~
thevibesman
hehe

(A friend of mine, who when in search of a new go-to-programming language
instead of Python, was more interested in Swift vs Rust because of this
attitude).

~~~
pests
Remind your friend these comments are only left by a small vocal minority and
is not representative of the project or its maintainers.

This is akin to not liking something because you don't like the people who
already like it, despite how much you'd like it otherwise.

~~~
thevibesman
> Remind your friend these comments are only left by a small vocal minority
> and is not representative of the project or its maintainers.

Thanks for mentioning this, I certainly will the next time. The last time this
came up, this was not an attitude I had previously noticed, although did see a
bunch on Hacker News the following week

> This is akin to not liking something because you don't like the people who
> already like it, despite how much you'd like it otherwise.

I would totally agree with this, but at the same time, while not a technical
reason, if one works in primarily a single programming language I can imagine
the nature of the community would be a legitimate factor to consider---in this
case though as you point out, it would be an inaccurate opinion of the nature
of the Rust community.

~~~
pests
Sorry for the late reply.

To your last point, I agree slightly as well but my rebuttal would be that
each person chooses how much and at what level to participate in a community
they are in and which sub-communities they identify closer with.

I can imagine a person being proficient and working in any language without
the need for them to be involved with the community at all, or if they do need
to interact do so in a read-only matter.

------
libria

         		CA	A		# SHOULD NEVER HIT THIS LOCATION
    

The 1969 version of "This should never happen".

[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/IMU_PERFORMANCE_TESTS_4.s#L105)

------
brendangregg
It's amazing that this is all online now, and easy to browse. Lots of source
here too
[http://www.ibiblio.org/apollo/links.html](http://www.ibiblio.org/apollo/links.html)

FWIW, I did performance analysis of the guidance computer and the 1202 and
1201 alarms at the start of my ACM Applicative 2016 keynote:
[https://youtu.be/eO94l0aGLCA?t=4m38s](https://youtu.be/eO94l0aGLCA?t=4m38s)

~~~
mind_heist
hey there Brendan, thats a pretty awesome presentation (I m only 20 minutes
into the talk as of now ).. But you mention that the Apollo Engineers expected
the CPU load to be about 85% during descent. And the Guidance computer's
Kernel ran "Dummy Jobs" when no real jobs were run.

What are these Dummy Jobs ? And Why did they have to do this instead of just
leaving the CPU idle ?

~~~
krallja
> Why did they have to do this instead of just leaving the CPU idle ?

This would require a CPU that was designed to idle.

~~~
mind_heist
wow , wow ! Looks like I don't understand the first thing about the CPU design
. Do CPUs have to be designed to IDLE ? Can you throw some more light on this
?

~~~
caf
A basic model of a CPU is running an infinite loop like this:

    
    
      1. If interrupts not masked, check for interrupt
      2. Load instruction
      3. Advance instruction pointer
      4. Execute instruction
    

It doesn't ever stop - as soon as the current instruction is finished
executing it moves on to the next one. So, if you don't have anything better
for the CPU to do, you need to have it spin in a loop of instructions anyway.

More modern CPU designs typically include an instruction that means "halt
until next interrupt" which actually stops the CPU from fetching and executing
instructions.

~~~
gfo
Why do CPUs and GPUs run hotter when doing more intensive tasks?

In your last statement I could see it making sense where the CPU actually
halts, but did prior CPUs always run at about the same temperature? Or do
these idle processes throw fewer instructions at one time so it's not as
overwhelmed?

~~~
caf
Modern CPUs, GPUs and SOCs have power management states that disable entire
submodules when they're not in use, by actually gating off the clock to them.
If you run without power management enabled, you'll find that they run hot all
the time.

------
Practicality
# 3. AT PRESENT, ERASABLE LOCATIONS ARE RESERVED ONLY FOR N UP TO 5. AN N IN
EXCESS OF 5 WILL PRODUCE CHAOS.

I want to just leave comments like this and have users be responsible for
avoiding said chaos.

------
EvanAnderson
It's interesting to me that the AGC contains an implementation of a virtual
machine that is used to perform the higher-level mathematical functions
(called 'The Interpreter'). Some details are available in this PDF starting on
page 74: [http://www.ibiblio.org/apollo/NARA-
SW/E-2052.pdf](http://www.ibiblio.org/apollo/NARA-SW/E-2052.pdf)

It would be fun to do some research into the embedding of higher-level virtual
machines in earlier computers. I'm thinking of 'The Interpreter' in the AGC as
being an ancestor to 'SWEET16' in the Apple II
([https://en.wikipedia.org/wiki/SWEET16](https://en.wikipedia.org/wiki/SWEET16)),
or the 'Graphic Programming Language'
([http://www.unige.ch/medecine/nouspikel/ti99/gpl.htm](http://www.unige.ch/medecine/nouspikel/ti99/gpl.htm))
in the TI-99/4A.

------
WhitneyLand
In case you're wondering what hardware this source code is for:
[https://en.wikipedia.org/wiki/Apollo_Guidance_Computer](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer)

The Apollo Guidance Computer (AGC) was a digital computer produced for the
Apollo program that was installed on board each Apollo Command Module (CM) and
Lunar Module (LM). The AGC provided computation and electronic interfaces for
guidance, navigation, and control of the spacecraft. The AGC had a 16-bit word
length, with 15 data bits and one parity bit. Most of the software on the AGC
was stored in a special read only memory known as core rope memory, fashioned
by weaving wires through magnetic cores, though a small amount of read-write
core memory was provided.

------
stuxnet79
Other than gaining satisfaction from the historical importance of this code is
there any conceivable way we can get some use of it - like try it out.

Even setting that aside, what is it I'm looking at? Assembly?

~~~
creshal
> is there any conceivable way we can get some use of it

I wonder whether there's any way of getting it into one of the autopilots for
Kerbal Space Program.

~~~
trynewideas
Orbiter has the NASSP add-on, which supports Virtual AGC:
[http://nassp.sourceforge.net/wiki/Main_Page](http://nassp.sourceforge.net/wiki/Main_Page)

Notably, it includes some unmanned auto-running missions, and some fictional
missions, including a hypothetical manned flyby of Venus using the AGC.

------
hcrisp
"It is correct to say that we landed on the moon with 152 Kbytes of onboard
computer memory." \- Don Eyles

Ref:
[http://www.doneyles.com/LM/Tales.html](http://www.doneyles.com/LM/Tales.html)

Amazing!

------
sixothree
What was the development environment like for this code?

~~~
sizzzzlerz
Pencil, eraser, paper, Punchcards, punchcard machine, Punchcard reader,
computer, papertape, papertape puncher, AGC computer, Command Module, LEM,
Neil Armstrong, Buzz Aldrin, Michael Collins.

These last 3 are software QA.

~~~
kamaal
When I worked on my start up, We built our complete hardware and then software
for it.

I had to write down the drivers, and display library for the 128 x 64 lcd
display with a simple scheduler, FSM and all!(Hard to mention all the work)
Bulk of the work I did was using paper, eraser and pens.

A lot of work in unchartered territory requires paper work. I realized the
more I worked on paper the more correct the code was and overall it took
faster to write(given fewer bugs).

------
jonathankoren
I recommend reading Digital Apollo[0] about the development of the computer,
and actually the entire man-machine interface of early spaceflight. The
machines were made in the milieu where computer mediated control was highly
controversial. (e.g. "A machine might work when everything is fine, but will
never work in an emergency.") Essentially there was huge argument between
pilots and engineers, about how much automation should be done. It was so bad,
that pilots even tried to insist on flying the rocket into orbit. (If I recall
correctly, in simulations in a centrifuge, only Armstrong was able to
successfully not crash the Saturn V in a manually controlled ascent.)

The other recurring theme in the book is the disturbingly short MTTF for
flight computers during the mid 1960s. Statistically, NASA had to plan for a
computer failure in route to the moon, and so repair-vs-replace became a
serious issue. (Yeah, they seriously considered soldering in zero-g.)

[0] [http://web.mit.edu/digitalapollo/](http://web.mit.edu/digitalapollo/)

------
fergyfresh
Alright, who wants to make a video game using this source code with me?

~~~
teraflop
It's been done:
[http://nassp.sourceforge.net/wiki/Main_Page](http://nassp.sourceforge.net/wiki/Main_Page)

------
emcrazyone
I often wonder about the electronics of 1969 and what was done to mitigate
radiation problems.

For instance, the type of memory was called core rope memory
[https://en.wikipedia.org/wiki/Apollo_Guidance_Computer](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer)

For anyone interested, XPrize winner Karsten Becker talks to popular youtube
blogger David Jones about radiation, extreme heat & cold in space and
specifically talks about bit flip and how electronic parts are sourced for
such endeavors.

[https://www.youtube.com/watch?v=7JwNmdV2QPs](https://www.youtube.com/watch?v=7JwNmdV2QPs)

Interesting to me was the "paper work" cited in the interview for space harden
components. In other words, people are concerned with stuff falling back to
Earth (wouldn't it burn up?) or used for not so friendly purposes (war).

~~~
datenwolf
> For instance, the type of memory was called core rope memory

Rope and core memory were the standard memory technologies of the day and very
likely have not been chosed for they radiation hardness. The fact is, solid
state memory became reliable and available in quantities only in the second
half of the 1970-ies.

------
lukateake
I will now be adding this comment to all of my code: HONI SOIT QUI MAL Y PENSE

[https://github.com/chrislgarry/Apollo-11/blob/master/BURN_BA...](https://github.com/chrislgarry/Apollo-11/blob/master/BURN_BABY_BURN
--MASTER_IGNITION_ROUTINE.s#L66)

~~~
CamperBob2
"Shame on him who thinks ill of it." It's almost as if the authors anticipated
the need to administer percussive therapy, Buzz Aldrin style, to trolls of the
far-distant future.

------
wepple
2.048MHz clock

16-bit wordlength

2048 words of RAM (4k 'bytes'/octets) using magnets?!

36,864 words of ROM

Ok this is a actually a really interesting read:
[https://en.wikipedia.org/wiki/Apollo_Guidance_Computer](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer)

------
crocal
Is this what I think it is?

PINBALL_GAME_BUTTONS_AND_LIGHTS.s

~~~
hobs
Unfortunately no.
[https://news.ycombinator.com/item?id=8063357](https://news.ycombinator.com/item?id=8063357)

"A set of interrupt-driven user interface routines called Pinball provided
keyboard and display services for the jobs and tasks running on the AGC. A
rich set of user-accessible routines were provided to let the operator
(astronaut) display the contents of various memory locations in octal or
decimal in groups of 1, 2, or 3 registers at a time. Monitor routines were
provided so the operator could initiate a task to periodically redisplay the
contents of certain memory locations. Jobs could be initiated. The Pinball
routines performed the (very rough) equivalent of the UNIX shell." \-
[https://en.wikipedia.org/wiki/Apollo_Guidance_Computer#Softw...](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer#Software)

~~~
joezydeco
The DSKY and PINBALL (something flashy with buttons) was a demo.

And that demo got us to the moon.

 _" Apparently, nobody had yet arrived at any kind of software requirements
for the AGC's user interface when the desire arose within the Instrumentation
Laboratory to set up a demo guidance-computer unit with which to impress
visitors to the lab. Of course, this demo would have to do something, if it
was going to be at all impressive, and to do something it would need some
software. In short order, some of the coders threw together a demo program,
inventing and using the verb/noun user-interface concept, but without any idea
that the verb/noun concept would somehow survive into the flight software. As
time passed, and more and more people became familiar with the demo, nobody
got around to inventing an improvement for the user interface, so the coders
simply built it into the flight software without any specific requirements to
do so."_

[http://www.ibiblio.org/apollo/ForDummies.html](http://www.ibiblio.org/apollo/ForDummies.html)

------
akshatpradhan
If this were to be rewritten in a high level language, I wonder what would it
look like?

~~~
nameless912
Has anyone written an AGC->Javascript transpiler?

------
alehander42
people could've really used a higher-level language compiling to optimized
AGC(apollo computer) assembly. Is there any reason why they didn't develop
one? It seems it would've helped tremendously with the productivity and
verification (and a lot of the explanations and equations would be readable as
code, not as an non-executed comment)

~~~
dandrews
It was pretty much taken as gospel everywhere at the time that NO compiler
could match the speed and size of a well crafted assembly language routine.
Back then there were some noble attempts at building optimizing compilers, and
probably the more notable one was IBM's ambitious ForTran H. But that's
50-year-old tech now, kids.

Remember also that memory was at a terrific premium. I don't have any specific
knowledge about the AGC, but there's an interesting story I read once about a
memory shortage in another project - Intel's 8080.

(If you'll permit me an OT digression...)

As the story goes, the program space was so tight in the original microcode
for the Intel 8080 microprocessor there wasn't room to spare for a one-byte
constant in the code! The architects decided that the AAM and AAD instructions
in the 8080 set should have a required operand - 0x0A or 10 - so that the
instruction could refer to itself and know that you were operating in base 10!

A side effect of this is that the Intel processors could actually execute AAM
and AAD instructions in number bases besides 10; Intel had never formally
acknowledged that the instructions do this, and so in the NEC V20 or V30 chips
- which were supposed to be Intel compatible - you couldn't change the AAM or
AAD operand - it had to be 0x0A.

~~~
AstroJetson
This sounds interesting, any link to a second source on this?

------
burnbabyburn
# NOLI SE TANGERE this should be noli me tangere, shouldn't it?

~~~
FroshKiller
While "noli me tangere" is the Biblical phrase this alludes to, "noli se
tangere" would mean in context "don't touch this." It's not that the
programmer misremembered "noli me tangere" but that he played on the
reference.

------
intrasight
No credit to Margaret Hamilton?

~~~
trynewideas
[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/CONTRACT_AND_APPROVALS.s#L46)

------
yeukhon
So how did this guy get the source code and why is he the one publishing it?

------
nerdy
How about the code apparently marked for deletion?
[https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c4646...](https://github.com/chrislgarry/Apollo-11/blob/dc4ea6735c464608d704fa183f3e3d08b013c42f/ORBITAL_INTEGRATION.s)

I've often wondered many things about the cleanliness, maintainability and
style of such code (this particular system, in fact). It's fun to be able to
actually poke through it.

------
strgrd
Previous discussion:
[https://news.ycombinator.com/item?id=8063192](https://news.ycombinator.com/item?id=8063192)

~~~
shepardrtc
Also, two days ago:
[https://news.ycombinator.com/item?id=12037546](https://news.ycombinator.com/item?id=12037546)

------
_pmf_
If you want to be entertained really, really well, watch this:
[https://www.youtube.com/watch?v=4Sso4HtvJsw](https://www.youtube.com/watch?v=4Sso4HtvJsw)

It's an incredibly well done and at times hilarious narration of the moon
mission. (Spoiler: contains a part where Armstrong overrides the automatic
control and lands manually)

This is probably my favorite presentation ever.

------
userbinator
Schematics are also available for the hardware it runs on:

[http://klabs.org/history/ech/agc_schematics/](http://klabs.org/history/ech/agc_schematics/)

The CPU is built entirely from 3-input NOR gates.

------
hockeyman61
I was 14 and listened to this live. We all were turning blue when those
computer alarms were called during the first landing. Turns out it was a
mistake in protocol. Computer was overloaded.

------
j1vms
A less important aside: what license is this available under? Or what's the
history behind this source release?

Edit: .s files indicate:

# Copyright: Public domain.

~~~
cyphar
Since NASA is a US government agency, they don't have any copyright over any
software they write.

------
artellectual
Wow this is surreal. I can't believe I'm seeing this. It's historical, thank
you for sharing.

------
bitfox
What if you'll receive a pull request?

------
therobot24
this is super cool, awesome post

------
vun87
it's amazing they ever got anything to fly

------
jdimov10
From the code comments:

"This source code has been transcribed or otherwise adapted from digitized
images of a hardcopy from the MIT Museum. The digitization was performed by
Paul Fjeld, and arranged for by Deborah Douglas of the Museum. Many thanks to
both. The images (with suitable reduction in storage size and consequent
reduction in image quality as well) are available online at
www.ibiblio.org/apollo. "

I mean, I realise that this is the least of the amazing achievements we're
talking about here, but yea.. respect :)

