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. |
058613,000002: ## Copyright: Public domain.
058614,000003: ## Filename: RTB_OP_CODES.agc
058615,000004: ## Purpose: A section of Luminary 1C, revision 131.
058616,000005: ## It is part of the source code for the Lunar Module's (LM)
058617,000006: ## Apollo Guidance Computer (AGC) for Apollo 13.
058618,000007: ## This file is intended to be a faithful transcription, except
058619,000008: ## that the code format has been changed to conform to the
058620,000009: ## requirements of the yaYUL assembler rather than the
058621,000010: ## original YUL assembler.
058622,000011: ## Reference: pp. 1389-1394
058623,000012: ## Contact: Ron Burkey <info@sandroid.org>.
058624,000013: ## Website: www.ibiblio.org/apollo/index.html
058625,000014: ## Mod history: 06/07/03 RSB. Began transcribing.
058626,000015: ## 05/14/05 RSB Corrected website references above.
058627,000016: ## 2017-01-06 RSB Page numbers now agree with those on the
058628,000017: ## original hardcopy, as opposed to the PDF page
058629,000018: ## numbers in 1701.pdf.
058630,000019: ## 2017-02-28 RSB Proofed comment text using octopus/ProoferComments.
058631,000020:
![]() |
Page 1389 |
058633,000022: 22,3773 BANK 22
058634,000023: 10,2000 SETLOC RTBCODES
058635,000024: 10,2000 BANK
058636,000025:
058637,000026: 10,3574 E5,1664 EBANK= XNB
058638,000027: 10,3574 COUNT* $$/RTB
058639,000028:
058640,000029: # LOAD TIME2, TIME1 INTO MPAC:
058641,000030:
058642,000031: 10,3574 00006 LOADTIME EXTEND
058643,000032: 10,3575 30025 DCA TIME2
058644,000033: 10,3576 16060 TCF SLOAD2
058645,000034:
058646,000035: # CONVERT THE SINGLE PRECISION 2'S COMPLEMENT NUMBER ARRIVING IN MPAC (SCALED IN HALF-REVOLUTIONS) TO A
058647,000036: # DP 1'S COMPLEMENT NUMBER SCALED IN REVOLUTIONS.
058648,000037:
058649,000038: 10,3577 10154 CDULOGIC CCS MPAC
058650,000039: 10,3600 34755 CAF ZERO
058651,000040: 10,3601 13604 TCF +3
058652,000041: 10,3602 13603 NOOP
058653,000042: 10,3603 44736 CS HALF
058654,000043:
058655,000044: 10,3604 54155 TS MPAC +1
058656,000045: 10,3605 34755 CAF ZERO
058657,000046: 10,3606 56154 XCH MPAC
058658,000047: 10,3607 00006 EXTEND
058659,000048: 10,3610 74736 MP HALF
058660,000049: 10,3611 20155 DAS MPAC
058661,000050: 10,3612 16064 TCF DANZIG # MODE IS ALREADY AT DOUBLE-PRECISION
058662,000051:
058663,000052: # FORCE TP SIGN AGREEMENT IN MPAC:
058664,000053:
058665,000054: 10,3613 07262 SGNAGREE TC TPAGREE
058666,000055: 10,3614 16064 TCF DANZIG
058667,000056:
058668,000057: # CONVERT THE DP 1'S COMPLEMENT ANGLE SCALED IN REVOLUTIONS TO A SINGLE PRECISION 2'S COMPLEMENT ANGLE
058669,000058: # SCALED IN HALF-REVOLUTIONS.
058670,000059:
058671,000060: 10,3615 03645 1STO2S TC 1TO2SUB
058672,000061: 10,3616 34755 CAF ZERO
058673,000062: 10,3617 54155 TS MPAC +1
058674,000063: 10,3620 16063 TCF NEWMODE
058675,000064:
058676,000065: # DO 1STO2S ON A VECTOR OF ANGLES:
058677,000066:
058678,000067: 10,3621 03645 V1STO2S TC 1TO2SUB # ANSWER ARRIVES IN A AND MPAC.
058679,000068:
058680,000069: 10,3622 52162 DXCH MPAC +5
058681,000070: 10,3623 52155 DXCH MPAC
058682,000071: 10,3624 03645 TC 1TO2SUB
![]() |
Page 1390 |
058684,000073: 10,3625 54156 TS MPAC +2
058685,000074:
058686,000075: 10,3626 52160 DXCH MPAC +3
058687,000076: 10,3627 52155 DXCH MPAC
058688,000077: 10,3630 03645 TC 1TO2SUB
058689,000078: 10,3631 54155 TS MPAC +1
058690,000079:
058691,000080: 10,3632 30161 CA MPAC +5
058692,000081: 10,3633 54154 TS MPAC
058693,000082:
058694,000083: 10,3634 34753 TPMODE CAF ONE # MODE IS TP.
058695,000084: 10,3635 16063 TCF NEWMODE
058696,000085:
058697,000086: # V1STO2S FOR 2 COMPONENT VECTOR. USED BY RR.
058698,000087:
058699,000088: 10,3636 03645 2V1STO2S TC 1TO2SUB
058700,000089: 10,3637 52160 DXCH MPAC +3
058701,000090: 10,3640 52155 DXCH MPAC
058702,000091: 10,3641 03645 TC 1TO2SUB
058703,000092: 10,3642 54001 TS L
058704,000093: 10,3643 30157 CA MPAC +3
058705,000094: 10,3644 16060 TCF SLOAD2
058706,000095:
058707,000096: # SUBROUTINE TO DO DOUBLING AND 1'S TO 2'S CONVERSION:
058708,000097:
058709,000098: 10,3645 52155 1TO2SUB DXCH MPAC # FINAL MPAC +1 UNSPECIFIED.
058710,000099: 10,3646 20001 DDOUBL
058711,000100: 10,3647 10000 CCS A
058712,000101: 10,3650 64753 AD ONE
058713,000102: 10,3651 13653 TCF +2
058714,000103: 10,3652 40000 COM # THIS WAS REVERSE OF MSU.
058715,000104:
058716,000105: 10,3653 54154 TS MPAC # AND SKIP ON OVERFLOW.
058717,000106: 10,3654 00002 TC Q
058718,000107:
058719,000108: 10,3655 50000 INDEX A # OVERFLOW UNCORRECT AND IN MSU.
058720,000109: 10,3656 34734 CAF LIMITS
058721,000110: 10,3657 26154 ADS MPAC
058722,000111: 10,3660 00002 TC Q
058723,000112:
058724,000113: # THE FOLLOWING ROUTINE INCREMENTS IN 2S COMPLEMENT THE REGISTER WHOSE ADDRESS IS IN BUF BY THE 1S COMPL.
058725,000114: # QUANTITY FOUND IN TEM2. THIS MAY BE USED TO INCREMENT DESIRED IMU AND OPTICS CDU ANGLES OR ANY OTHER 2S COMPL.
058726,000115: # (+0 UNEQUAL TO -0) QUANTITY. MAY BE CALLED BY BANKCALL/SWCALL.
058727,000116:
058728,000117: 10,3661 54142 CDUINC TS TEM2 # 1S COMPL. QUANT. ARRIVES IN ACC. STORE IT
058729,000118: 10,3662 50130 INDEX BUF
058730,000119: 10,3663 10000 CCS 0 # CHANGE 2S COMPL. ANGLE(IN BUF)INTO 1S
058731,000120: 10,3664 64753 AD ONE
058732,000121: 10,3665 13671 TCF +4
058733,000122: 10,3666 64753 AD ONE
![]() |
Page 1391 |
058735,000124: 10,3667 64753 AD ONE # OVERFLOW HERE IF 2S COMPL. IS 180 DEG.
058736,000125: 10,3670 40000 COM
058737,000126:
058738,000127: 10,3671 60142 AD TEM2 # SULT MOVES FROM 2ND TO 3D QUAD. (OR BACK)
058739,000128: 10,3672 10000 CCS A # BACK TO 2S COMPL.
058740,000129: 10,3673 64753 AD ONE
058741,000130: 10,3674 13676 TCF +2
058742,000131: 10,3675 40000 COM
058743,000132: 10,3676 54142 TS TEM2 # STORE 14BIT QUANTITY WITH PRESENT SIGN
058744,000133: 10,3677 13703 TCF +4
058745,000134: 10,3700 50000 INDEX A # SIGN.
058746,000135: 10,3701 34734 CAF LIMITS # FIX IT, BY ADDING IN 37777 OR 40000
058747,000136: 10,3702 60142 AD TEM2
058748,000137:
058749,000138: 10,3703 50130 INDEX BUF
058750,000139: 10,3704 54000 TS 0 # STORE NEW ANGLE IN 2S COMPLEMENT.
058751,000140: 10,3705 00002 TC Q
058752,000141:
![]() |
Page 1392 |
058754,000143: # RTB TO TORQUE GYROS, EXCEPT FOR THE CALL TO IMUSTALL. ECADR OF COMMANDS ARRIVES IN X1.
058755,000144:
058756,000145: 10,3706 50120 PULSEIMU INDEX FIXLOC # ADDRESS OF GYRO COMMANDS SHOULD BE IN X1
058757,000146: 10,3707 30046 CA X1
058758,000147: 10,3710 04616 TC BANKCALL
058759,000148: 10,3711 17314 CADR IMUPULSE
058760,000149: 10,3712 16064 TCF DANZIG
058761,000150:
![]() |
Page 1393 |
058763,000152: # THE SUBROUTINE SIGNMPAC SETS C(MPAC, MPAC +1) TO SIGN(MPAC).
058764,000153: # FOR THIS, ONLY THE CONTENTS OF MPAC ARE EXAMINED. ALSO +0 YIELDS POSMAX AND -0 YIELDS NEGMAX.
058765,000154:
058766,000155: # ENTRY MAY BE BY EITHER OF THE FOLLOWING:
058767,000156: # 1. LIMIT THE SIZE OF MPAC ON INTERPRETIVE OVERFLOW:
058768,000157: # ENTRY: BOVB
058769,000158: # SIGNMPAC
058770,000159: # 2. GENERATE IN MPAC THE SIGNUM FUNCTION OF MPAC:
058771,000160: # ENTRY: RTB
058772,000161: # SIGNMPAC
058773,000162: # IN EITHER CASE, RETURN IS TO THE NEXT INTERPRETIVE INSTRUCTION IN THE CALLING SEQUENCE.
058774,000163:
058775,000164: 10,3713 00006 SIGNMPAC EXTEND
058776,000165: 10,3714 34733 DCA DPOSMAX
058777,000166: 10,3715 52155 DXCH MPAC
058778,000167: 10,3716 10000 CCS A
058779,000168: 10,3717 34755 DPMODE CAF ZERO # SETS MPAC +2 TO ZERO IN THE PROCESS
058780,000169: 10,3720 16062 TCF SLOAD2 +2
058781,000170: 10,3721 13722 TCF +1
058782,000171: 10,3722 00006 EXTEND
058783,000172: 10,3723 44733 DCS DPOSMAX
058784,000173: 10,3724 16060 TCF SLOAD2
058785,000174:
058786,000175: # RTB OP CODE NORMUNIT IS LIKE INTERPRETIVE INSTRUCTION UNIT, EXCEPT THAT IT CAN BE DEPENDED ON NOT TO BLOW
058787,000176: # UP WHEN THE VECTOR BEING UNITIZED IS VERY SMALL -- IT WILL BLOW UP WHEN ALL COMPONENTS ARE ZERO. IF NORMUNIT
058788,000177: # IS USED AND THE UPPER ORDER HALVES OF ALL COMPONENTS ARE ZERO, THE MAGNITUDE RETURNED IN 36D WILL BE TOO LARGE
058789,000178: # BY A FACTOR OF 2(13) AND THE SQUARED MAGNITUDE RETURNED AT 34D WILL BE TOO BIG BY A FACTOR OF 2(26).
058790,000179:
058791,000180: 10,3725 34753 NORMUNX1 CAF ONE
058792,000181: 10,3726 13730 TCF NORMUNIT +1
058793,000182: 10,3727 34755 NORMUNIT CAF ZERO
058794,000183: 10,3730 60120 AD FIXLOC
058795,000184: 10,3731 54156 TS MPAC +2
058796,000185: 10,3732 04616 TC BANKCALL # GET SIGN AGREEMENT IN ALL COMPONENTS
058797,000186: 10,3733 01010 CADR VECAGREE
058798,000187: 10,3734 10154 CCS MPAC
058799,000188: 10,3735 13771 TCF NOSHIFT
058800,000189: 10,3736 13740 TCF +2
058801,000190: 10,3737 13771 TCF NOSHIFT
058802,000191: 10,3740 10157 CCS MPAC +3
058803,000192: 10,3741 13771 TCF NOSHIFT
058804,000193: 10,3742 13744 TCF +2
058805,000194: 10,3743 13771 TCF NOSHIFT
058806,000195: 10,3744 10161 CCS MPAC +5
058807,000196: 10,3745 13771 TCF NOSHIFT
058808,000197: 10,3746 13750 TCF +2
058809,000198: 10,3747 13771 TCF NOSHIFT
![]() |
Page 1394 |
058811,000200: 10,3750 30155 CA MPAC +1 # SHIFT ALL COMPONENTS LEFT 13
058812,000201: 10,3751 00006 EXTEND
058813,000202: 10,3752 74736 MP BIT14
058814,000203: 10,3753 20155 DAS MPAC # DAS GAINS A LITTLE ACCURACY
058815,000204: 10,3754 30160 CA MPAC +4
058816,000205: 10,3755 00006 EXTEND
058817,000206: 10,3756 74736 MP BIT14
058818,000207: 10,3757 20160 DAS MPAC +3
058819,000208: 10,3760 30162 CA MPAC +6
058820,000209: 10,3761 00006 EXTEND
058821,000210: 10,3762 74736 MP BIT14
058822,000211: 10,3763 20162 DAS MPAC +5
058823,000212: 10,3764 34761 CAF THIRTEEN
058824,000213: 10,3765 50156 INDEX MPAC +2
058825,000214: 10,3766 54045 TS 37D
058826,000215: 10,3767 04635 OFFTUNIT TC POSTJUMP
058827,000216: 10,3770 01024 CADR UNIT +1 # SKIP THE "TC VECAGREE" DONE AT UNIT
058828,000217:
058829,000218: 10,3771 34755 NOSHIFT CAF ZERO
058830,000219: 10,3772 13765 TCF OFFTUNIT -2
058831,000220:
058832,000221: # RTB VECSGNAG ... FORCES SIGN AGREEMENT OF VECTOR IN MPAC.
058833,000222:
058834,000223: 10,3773 04616 VECSGNAG TC BANKCALL
058835,000224: 10,3774 01010 CADR VECAGREE
058836,000225: 10,3775 06064 TC DANZIG
058837,000226:
058838,000227:
End of include-file RTB_OP_CODES.agc. Parent file is MAIN.agc