Source Code
![]() |
This source code is very close to the Apollo Guidance Computer software for the
Apollo 13 Lunar module. This revision of the Luminary 131 program is from December
of 1969, whereas there was a later revision in January of 1970, and still another
revision in February, which is the code that flew on the mission.
As far as this transcription is concerned, it was originally from a copy made in 1991 of
a printout from the collection of AGC developer Don Eyles for collector David Craig.
It was subsequently scanned by Gary Neff, reprocessed for online
presentation at the now-discontinued History of Recent Science and Technology (HRST) website
of MIT's Dibner Institute (the full-quality scans being discarded in the process),
and finally transcribed by Ron Burkey for the Virtual AGC Project. Although a
high-quality replacement scan for a completely illegible page was later provided by Gary
Neff, the reduced legibility of the reprocessed HRST posting nevertheless caused many
errors to be introduced into the transcription. Accordingly, a second scan of the same physical
printout was made in 2017 for the Virtual AGC Project's collection at the Internet Archive,
and used to correct the transcription errors. All of the scanned materials mentioned,
as well as other Luminary 131 related material, are available online.
Don Eyles apprently made additional hand-written notes in printout between 1991 and 2017,
so the two scans are not identical in that respect. The page-headings in the printout read, in part:GAP: ASSEMBLE REVISION 131 OF AGC PROGRAM LUMINARY BY NASA 2021112-091 17:53 DEC. 19, 1969Note that the date is the date the printout was made, not the date on which the program revision was released, although these happen to be very close together. |
052280,000002: ## Copyright: Public domain.
052281,000003: ## Filename: INFLIGHT_ALIGNMENT_ROUTINES.agc
052282,000004: ## Purpose: A section of Luminary 1C, revision 131.
052283,000005: ## It is part of the source code for the Lunar Module's (LM)
052284,000006: ## Apollo Guidance Computer (AGC) for Apollo 13.
052285,000007: ## This file is intended to be a faithful transcription, except
052286,000008: ## that the code format has been changed to conform to the
052287,000009: ## requirements of the yaYUL assembler rather than the
052288,000010: ## original YUL assembler.
052289,000011: ## Reference: pp. 1241-1250
052290,000012: ## Contact: Ron Burkey <info@sandroid.org>.
052291,000013: ## Website: www.ibiblio.org/apollo/index.html
052292,000014: ## Mod history: 06/03/03 RSB. Began transcribing.
052293,000015: ## 05/14/05 RSB. Corrected website reference above.
052294,000016: ## 2017-01-06 RSB Page numbers now agree with those on the
052295,000017: ## original hardcopy, as opposed to the PDF page
052296,000018: ## numbers in 1701.pdf.
052297,000019: ## 2017-02-27 RSB Proofed comment text using octopus/ProoferComments.
052298,000020: ## 2017-03-17 RSB Comment-text fixes identified in diff'ing
052299,000021: ## Luminary 99 vs Comanche 55.
052300,000022:
![]() |
Page 1241 |
052302,000024: 22,3773 BANK 22
052303,000025: 23,2000 SETLOC INFLIGHT
052304,000026: 23,2000 BANK
052305,000027:
052306,000028: 23,3251 E5,1642 EBANK= XSM
052307,000029:
052308,000030: # CALCGTA COMPUTES THE GYRO TORQUE ANGLES REQUIRED TO BRING THE STABLE MEMBER INTO THE DESIRED ORIENTATION.
052309,000031:
052310,000032: # THE INPUT IS THE DESIRED STABLE MEMBER COORDINATES REFERRED TO PRESENT STABLE MEMBER COORDINATES. THE THREE
052311,000033: # HALF-UNIT VECTORS ARE STORED AT XDC, YDC, AND ZDC.
052312,000034:
052313,000035: # THE OUTPUTS ARE THE THREE GYRO TORQUING ANGLES TO BE APPLIED TO THE Y, Z, AND X GYROS AND ARE STORED DP AT IGC,
052314,000036: # MGC, AND OGC RESPECTIVELY.
052315,000037:
052316,000038: 23,3251 COUNT* $$/INFLT
052317,000039: 23,3251 71220 CALCGTA ITA DLOAD # PUSHDOWN 00-03, 16D-27D, 34D-37D
052318,000040: 23,3252 00051 S2 # XDC = (XD1 XD2 XD3)
052319,000041: 23,3253 02665 XDC # YDC = (YD1 YD2 YD3)
052320,000042: 23,3254 65325 PDDL PDDL # ZDC = (ZD1 ZD2 ZD3)
052321,000043: 23,3255 06524 HI6ZEROS
052322,000044: 23,3256 02671 XDC +4
052323,000045: 23,3257 55476 DCOMP VDEF
052324,000046: 23,3260 77656 UNIT
052325,000047: 23,3261 14027 STODL ZPRIME # ZP = UNIT(-XD3 0 XD1) = (ZP1 ZP2 ZP3)
052326,000048: 23,3262 00027 ZPRIME
052327,000049:
052328,000050: 23,3263 77742 SR1
052329,000051: 23,3264 14023 STODL SINTH # SIN(IGC) = ZP1
052330,000052: 23,3265 00033 ZPRIME +4
052331,000053: 23,3266 77742 SR1
052332,000054: 23,3267 34021 STCALL COSTH # COS(IGC) = ZP3
052333,000055: 23,3270 47322 ARCTRIG
052334,000056:
052335,000057: 23,3271 16742 STODL IGC # Y GYRO TORQUING ANGLE FRACTION OF REV.
052336,000058: 23,3272 02667 XDC +2
052337,000059: 23,3273 77742 SR1
052338,000060: 23,3274 14023 STODL SINTH # SIN(MGC) = XD2
052339,000061: 23,3275 00027 ZPRIME
052340,000062:
052341,000063: 23,3276 65205 DMP PDDL
052342,000064: 23,3277 02671 XDC +4 # PD00 = (ZP1)(XD3)
052343,000065: 23,3300 00033 ZPRIME +4
052344,000066:
052345,000067: 23,3301 45205 DMP DSU
052346,000068: 23,3302 02665 XDC # MPAC = (ZP3)(XD1)
052347,000069: 23,3303 77626 STADR
052348,000070: 23,3304 43756 STCALL COSTH # COS(MGC) = MPAC - PD00
052349,000071: 23,3305 47322 ARCTRIG
![]() |
Page 1242 |
052351,000073: 23,3306 26744 STOVL MGC # Z GYRO TORQUING ANGLE FRACTION OF REV.
052352,000074: 23,3307 00027 ZPRIME
052353,000075: 23,3310 77641 DOT
052354,000076: 23,3311 02701 ZDC
052355,000077: 23,3312 24021 STOVL COSTH # COS(OGC) = ZP . ZDC
052356,000078: 23,3313 00027 ZPRIME
052357,000079: 23,3314 77641 DOT
052358,000080: 23,3315 02673 YDC
052359,000081: 23,3316 34023 STCALL SINTH # SIN(OGC) = ZP . YDC
052360,000082: 23,3317 47322 ARCTRIG
052361,000083:
052362,000084: 23,3320 36740 STCALL OGC # X GYRO TORQUING ANGLE FRACTION OF REV.
052363,000085: 23,3321 00051 S2
052364,000086:
![]() |
Page 1243 |
052366,000088: # ARCTRIG COMPUTES AN ANGLE GIVEN THE SINE AND COSINE OF THIS ANGLE.
052367,000089:
052368,000090: # THE INPUTS ARE SIN/4 AND COS/4 STORED DP AT SINTH AND COSTH.
052369,000091:
052370,000092: # THE OUTPUT IS THE CALCULATED ANGLE BETWEEN +.5 AND -.5 REVOLUTIONS AND STORED AT THETA. THE OUTPUT IS ALSO
052371,000093: # AVAILABLE AT MPAC.
052372,000094:
052373,000095: 23,3322 51545 ARCTRIG DLOAD ABS # PUSHDOWN 16D-21D
052374,000096: 23,3323 00023 SINTH
052375,000097: 23,3324 50025 DSU BMN
052376,000098: 23,3325 07536 QTSN45 # ABS(SIN/4) - SIN(45)/4
052377,000099: 23,3326 47335 TRIG1 # IF (-45,45) OR (135,-135)
052378,000100:
052379,000101: 23,3327 72545 DLOAD SL1 # (45,135) OR (-135,-45)
052380,000102: 23,3330 00021 COSTH
052381,000103: 23,3331 75326 ACOS SIGN
052382,000104: 23,3332 00023 SINTH
052383,000105: 23,3333 00025 STORE THETA # X = ARCCOS(COS) WITH SIGN(SIN)
052384,000106: 23,3334 77616 RVQ
052385,000107:
052386,000108: 23,3335 72545 TRIG1 DLOAD SL1 # (-45,45) OR (135,-135)
052387,000109: 23,3336 00023 SINTH
052388,000110: 23,3337 77736 ASIN
052389,000111: 23,3340 14025 STODL THETA # X = ARCSIN(SIN) WITH SIGN(SIN)
052390,000112: 23,3341 00021 COSTH
052391,000113: 23,3342 77640 BMN
052392,000114: 23,3343 47346 TRIG2 # IF (135,-135)
052393,000115:
052394,000116: 23,3344 43545 DLOAD RVQ
052395,000117: 23,3345 00025 THETA # X = ARCSIN(SIN) (-45,45)
052396,000118:
052397,000119: 23,3346 75345 TRIG2 DLOAD SIGN # (135,-135)
052398,000120: 23,3347 06522 HIDPHALF
052399,000121: 23,3350 00023 SINTH
052400,000122: 23,3351 77625 DSU
052401,000123: 23,3352 00025 THETA
052402,000124: 23,3353 00025 STORE THETA # X = .5 WITH SIGN(SIN) - ARCSIN(SIN)
052403,000125: 23,3354 77616 RVQ # (+) - (+) OR (-) - (-)
052404,000126:
![]() |
Page 1244 |
052406,000128: # SMNB, NBSM, AND AXISROT, WHICH USED TO APPEAR HERE, HAVE BEEN
052407,000129: # COMBINED IN A ROUTINE CALLED AX*SR*T, WHICH APPEARS AMONG THE POWERED
052408,000130: # FLIGHT SUBROUTINES.
052409,000131:
![]() |
Page 1245 |
052411,000133: # CALCGA COMPUTES THE CDU DRIVING ANGLES REQUIRED TO BRING THE STABLE MEMBER INTO THE DESIRED ORIENTATION.
052412,000134:
052413,000135: # THE INPUTS ARE 1) THE NAVIGATION BASE COORDINATES REFERRED TO ANY COORDINATE SYSTEM. THE THREE HALF-UNIT
052414,000136: # VECTORS ARE STORED AT XNB, YNB, AND ZNB. 2) THE DESIRED STABLE MEMBER COORDINATES REFERRED TO THE SAME
052415,000137: # COORDINATE SYSTEM ARE STORED AT XSM, YSM, AND ZSM.
052416,000138:
052417,000139: # THE OUTPUTS ARE THE THREE CDU DRIVING ANGLES AND ARE STORED SP AT THETAD, THETAD +1, AND THETAD +2.
052418,000140:
052419,000141: 23,3355 77601 CALCGA SETPD # PUSHDOWN 00-05, 16D-21D, 34D-37D
052420,000142: 23,3356 00001 0
052421,000143: 23,3357 47375 VLOAD VXV
052422,000144: 23,3360 02665 XNB # XNB = OGA (OUTER GIMBAL AXIS)
052423,000145: 23,3361 02651 YSM # YSM = IGA (INNER GIMBAL AXIS)
052424,000146: 23,3362 41456 UNIT PUSH # PD0 = UNIT(OGA X IGA) = MGA
052425,000147:
052426,000148: 23,3363 44041 DOT ITA
052427,000149: 23,3364 02701 ZNB
052428,000150: 23,3365 00051 S2
052429,000151: 23,3366 24021 STOVL COSTH # COS(OG) = MGA . ZNB
052430,000152: 23,3367 00001 0
052431,000153: 23,3370 77641 DOT
052432,000154: 23,3371 02673 YNB
052433,000155: 23,3372 34023 STCALL SINTH # SIN(OG) = MGA . YNB
052434,000156: 23,3373 47322 ARCTRIG
052435,000157: 23,3374 26740 STOVL OGC
052436,000158: 23,3375 00001 0
052437,000159:
052438,000160: 23,3376 50235 VXV DOT # PROVISION FOR MG ANGLE OF 90 DEGREES
052439,000161: 23,3377 02665 XNB
052440,000162: 23,3400 02651 YSM
052441,000163: 23,3401 77752 SL1
052442,000164: 23,3402 24021 STOVL COSTH # COS(MG) = IGA . (MGA X OGA)
052443,000165: 23,3403 02651 YSM
052444,000166: 23,3404 77641 DOT
052445,000167: 23,3405 02665 XNB
052446,000168: 23,3406 34023 STCALL SINTH # SIN(MG) = IGA . OGA
052447,000169: 23,3407 47322 ARCTRIG
052448,000170: 23,3410 02744 STORE MGC
052449,000171:
052450,000172: 23,3411 45246 ABS DSU
052451,000173: 23,3412 07540 .166...
052452,000174: 23,3413 77644 BPL
052453,000175: 23,3414 47433 GIMLOCK1 # IF ANGLE GREATER THAN 60 DEGREES
052454,000176:
052455,000177: 23,3415 50375 CALCGA1 VLOAD DOT
052456,000178: 23,3416 02657 ZSM
052457,000179: 23,3417 00001 0
052458,000180: 23,3420 24021 STOVL COSTH # COS(IG) = ZSM . MGA
052459,000181: 23,3421 02643 XSM
![]() |
Page 1246 |
052461,000183: 23,3422 45441 DOT STADR
052462,000184: 23,3423 43754 STCALL SINTH # SIN(IG) = XSM . MGA
052463,000185: 23,3424 47322 ARCTRIG
052464,000186:
052465,000187: 23,3425 26742 STOVL IGC
052466,000188: 23,3426 02740 OGC
052467,000189: 23,3427 77634 RTB
052468,000190: 23,3430 21621 V1STO2S
052469,000191: 23,3431 34322 STCALL THETAD
052470,000192: 23,3432 00051 S2
052471,000193:
052472,000194: 23,3433 77776 GIMLOCK1 EXIT
052473,000195: 23,3434 05567 TC ALARM
052474,000196: 23,3435 00401 OCT 00401
052475,000197: 23,3436 05504 TC UPFLAG # GIMBAL LOCK HAS OCCURED
052476,000198: 23,3437 00056 ADRES GLOKFAIL
052477,000199:
052478,000200: 23,3440 06042 TC INTPRET
052479,000201: 23,3441 77650 GOTO
052480,000202: 23,3442 47415 CALCGA1
052481,000203:
![]() |
Page 1247 |
052483,000205: # AXISGEN COMPUTES THE COORDINATES OF ONE COORDINATE SYSTEM REFERRED TO ANOTHER COORDINATE SYSTEM.
052484,000206:
052485,000207: # THE INPUTS ARE 1) THE STAR1 VECTOR REFERRED TO COORDINATE SYSTEM A STORED AT STARAD. 2) THE STAR2 VECTOR
052486,000208: # REFERRED TO COORDINATE SYSTEM A STORED AT STARAD +6. 3) THE STAR1 VECTOR REFERRED TO COORDINATE SYSTEM B STORED
052487,000209: # AT LOCATION 6 OF THE VAC AREA. 4) THE STAR2 VECTOR REFERRED TO COORDINATE SYSTEM B STORED AT LOCATION 12D OF
052488,000210: # THE VAC AREA.
052489,000211:
052490,000212: # THE OUTPUT DEFINES COORDINATE SYSTEM A REFERRED TO COORDINATE SYSTEM B. THE THREE HALF-UNIT VECTORS ARE STORED
052491,000213: # AT LOCATIONS XDC, XDC +6, XDC +12D, AND STARAD, STARAD +6, STARAD +12D.
052492,000214:
052493,000215: 23,3443 66370 AXISGEN AXT,1 SSP # PUSHDOWN 00-30D, 34D-37D
052494,000216: 23,3444 02714 STARAD +6
052495,000217: 23,3445 00051 S1
052496,000218: 23,3446 02700 STARAD -6
052497,000219:
052498,000220: 23,3447 77601 SETPD
052499,000221: 23,3450 00001 0
052500,000222: 23,3451 46773 AXISGEN1 VLOAD* VXV* # 06D UA = S1
052501,000223: 23,3452 02723 STARAD +12D,1 # STARAD +00D UB = S1
052502,000224: 23,3453 02731 STARAD +18D,1
052503,000225: 23,3454 77656 UNIT # 12D VA = UNIT(S1 X S2)
052504,000226: 23,3455 06731 STORE STARAD +18D,1 # STARAD +06D VB = UNIT(S1 X S2)
052505,000227: 23,3456 77773 VLOAD*
052506,000228: 23,3457 02723 STARAD +12D,1
052507,000229:
052508,000230: 23,3460 76433 VXV* VSL1
052509,000231: 23,3461 02731 STARAD +18D,1 # 18D WA = UA X VA
052510,000232: 23,3462 06737 STORE STARAD +24D,1 # STARAD +12D WB = UB X VB
052511,000233:
052512,000234: 23,3463 77700 TIX,1
052513,000235: 23,3464 47451 AXISGEN1
052514,000236:
052515,000237: 23,3465 66160 AXC,1 SXA,1
052516,000238: 23,3466 00006 6
052517,000239: 23,3467 00036 30D
052518,000240:
052519,000241: 23,3470 66370 AXT,1 SSP
052520,000242: 23,3471 00022 18D
052521,000243: 23,3472 00051 S1
052522,000244: 23,3473 00006 6
052523,000245:
052524,000246: 23,3474 66374 AXT,2 SSP
052525,000247: 23,3475 00006 6
052526,000248: 23,3476 00052 S2
052527,000249: 23,3477 00002 2
052528,000250:
052529,000251: 23,3500 76720 AXISGEN2 XCHX,1 VLOAD*
052530,000252: 23,3501 00036 30D # X1=-6 X2=+6 X1=-6 X2=+4 X1=-6 X2=+2
052531,000253: 23,3502 00001 0,1
052532,000254:
![]() |
Page 1248 |
052534,000256: 23,3503 62757 VXSC* PDVL* # J=(UA)(UB1) J=(UA)(UB2) J=(UA)(UB3)
052535,000257: 23,3504 75062 STARAD +6,2
052536,000258: 23,3505 00007 6,1
052537,000259: 23,3506 77757 VXSC*
052538,000260: 23,3507 75054 STARAD +12D,2
052539,000261: 23,3510 30031 STOVL* 24D # K=(VA)(VB1) J=(VA)(VB2) J=(VA)(VB3)
052540,000262: 23,3511 00015 12D,1
052541,000263:
052542,000264: 23,3512 53357 VXSC* VAD
052543,000265: 23,3513 75046 STARAD +18D,2 # L=(WA)(WB1) J=(WA)(WB2) J=(WA)(WB3)
052544,000266: 23,3514 76455 VAD VSL1
052545,000267: 23,3515 00031 24D
052546,000268: 23,3516 53520 XCHX,1 UNIT
052547,000269: 23,3517 00036 30D
052548,000270: 23,3520 06707 STORE XDC +18D,1 # XDC = L+J+K YDC = L+J+K ZDC = L+J+K
052549,000271:
052550,000272: 23,3521 77700 TIX,1
052551,000273: 23,3522 47523 AXISGEN3
052552,000274:
052553,000275: 23,3523 77704 AXISGEN3 TIX,2
052554,000276: 23,3524 47500 AXISGEN2
052555,000277:
052556,000278: 23,3525 77775 VLOAD
052557,000279: 23,3526 02665 XDC
052558,000280: 23,3527 26707 STOVL STARAD
052559,000281: 23,3530 02673 YDC
052560,000282: 23,3531 26715 STOVL STARAD +6
052561,000283: 23,3532 02701 ZDC
052562,000284: 23,3533 02723 STORE STARAD +12D
052563,000285:
052564,000286: 23,3534 77616 RVQ
052565,000287:
![]() |
Page 1249 |
052567,000289: 23,3535 05520 26075 QTSN45 2DEC .1768
052568,000290: 23,3537 05252 25253 .166... 2DEC .1666666667
052569,000291:
![]() |
Page 1250 There is no source code on this page of the original assembly listing. |
End of include-file INFLIGHT_ALIGNMENT_ROUTINES.agc. Parent file is MAIN.agc