Source Code
These source-code files are part of a reconstructed copy of Comanche 45, the
second release, though not the final mission release, of the Apollo 10
Command Module (CM) Apollo Guidance Computer (AGC) software. Comanche 45 was
preceded by Comanche 44 and followed by Comanche 45/2 (the flown release). The reconstruction
is believed to be exactly accurate, but in the absence of an actual Apollo-era
listing of Comanche 45, some explanation of the reconstruction process is needed
to insure confidence in that accuracy.
The starting point was the source code of Comanche 44 (itself previously accurately reconstructed). Comanche 44 source code was then modified by incorporating changes known from contemporary documentation to have been made between revisions 44 and 45. The now-reconstructed Comanche 45 source code was verified by assembling it and checking that the assembled code had the expected known-correct memory-bank checksums. Note that page numbers in the reconstructed code tend to match those in the Comanche 55, the most-similar revision of Comanche for which we have access to an actual non-reconstructed hardcopy; the source code would likely have different page numbers in a contemporary Comanche 45 listing. Annotations that were not present in the contemporary source code have been added to the reconstructed code to justify each change relative to Comanche 44. Here's a guide to the Apollo documentation referenced in those annotations:
Comments expected to have been present in the original source code are prefixed with a single '#' symbol, whereas comments added later are prefixed by "##" or "###". Report any errors noted by creating an issue report at the Virtual AGC Project's GitHub repository. |
064068,000002: ## Copyright: Public domain.
064069,000003: ## Filename: RTB_OP_CODES.agc
064070,000004: ## Purpose: A section of Comanche revision 045.
064071,000005: ## It is part of the reconstructed source code for the
064072,000006: ## second release of the flight software for the Command
064073,000007: ## Module's (CM) Apollo Guidance Computer (AGC) for Apollo 10.
064074,000008: ## The code has been recreated from a copy of Comanche 055. It
064075,000009: ## has been adapted such that the resulting bugger words
064076,000010: ## exactly match those specified for Comanche 45 in NASA drawing
064077,000011: ## 2021153D, which gives relatively high confidence that the
064078,000012: ## reconstruction is correct.
064079,000013: ## Assembler: yaYUL
064080,000014: ## Contact: Ron Burkey <info@sandroid.org>.
064081,000015: ## Website: www.ibiblio.org/apollo/index.html
064082,000016: ## Mod history: 2020-12-06 MAS Created from Comanche 44. Added a stub for the
064083,000017: ## COM-4 anomaly fix.
064084,000018: ## 2020-12-23 MAS Implemented a fix for COM-4 that gives correct
064085,000019: ## checksums, and renamed the function to the more
064086,000020: ## mundane but more likely "S40.1A".
064087,000021:
Page 1508 |
064089,000023: 22,3510 BANK 22
064090,000024: 22,2000 SETLOC RTBCODES
064091,000025: 22,2000 BANK
064092,000026:
064093,000027: 22,3510 E5,1713 EBANK= XNB
064094,000028: 22,3510 COUNT* $$/RTB
064095,000029:
064096,000030: # LOAD TIME2, TIME1 INTO MPAC:
064097,000031:
064098,000032: 22,3510 00006 LOADTIME EXTEND
064099,000033: 22,3511 30025 DCA TIME2
064100,000034: 22,3512 16024 TCF SLOAD2
064101,000035:
064102,000036: # CONVERT THE SINGLE PRECISION 2'S COMPLEMENT NUMBER ARRIVING IN MPAC (SCALED IN HALF-REVOLUTIONS) TO A
064103,000037: # DP 1'S COMPLEMENT NUMBER SCALED IN REVOLUTIONS.
064104,000038:
064105,000039: 22,3513 10154 CDULOGIC CCS MPAC
064106,000040: 22,3514 35021 CAF ZERO
064107,000041: 22,3515 13520 TCF +3
064108,000042: 22,3516 13517 NOOP
064109,000043: 22,3517 45002 CS HALF
064110,000044:
064111,000045: 22,3520 54155 TS MPAC +1
064112,000046: 22,3521 35021 CAF ZERO
064113,000047: 22,3522 56154 XCH MPAC
064114,000048: 22,3523 00006 EXTEND
064115,000049: 22,3524 75002 MP HALF
064116,000050: 22,3525 20155 DAS MPAC
064117,000051: 22,3526 16030 TCF DANZIG # MODE IS ALREADY AT DOUBLE-PRECISION
064118,000052:
064119,000053: # READ THE PIPS INTO MPAC WITHOUT CHANGING THEM:
064120,000054:
064121,000055: 22,3527 00004 READPIPS INHINT
064122,000056: 22,3530 30037 CA PIPAX
064123,000057: 22,3531 54154 TS MPAC
064124,000058: 22,3532 30040 CA PIPAY
064125,000059: 22,3533 54157 TS MPAC +3
064126,000060: 22,3534 30041 CA PIPAZ
064127,000061: 22,3535 00003 RELINT
064128,000062: 22,3536 54161 TS MPAC +5
064129,000063:
064130,000064: 22,3537 35021 CAF ZERO
064131,000065: 22,3540 54155 TS MPAC +1
064132,000066: 22,3541 54160 TS MPAC +4
064133,000067: 22,3542 54162 TS MPAC +6
064134,000068: 22,3543 16470 VECMODE TCF VMODE
064135,000069:
064136,000070: # FORCE TP SIGN AGREEMENT IN MPAC:
064137,000071:
064138,000072: 22,3544 07226 SGNAGREE TC TPAGREE
064139,000073:
Page 1509 |
064141,000075:
064142,000076: 22,3545 16030 TCF DANZIG
064143,000077:
064144,000078: # CONVERT THE DP 1'S COMPLEMENT ANGLE SCALED IN REVOLUTIONS TO A SINGLE PRECISION 2'S COMPLEMENT ANGLE
064145,000079: # SCALED IN HALF-REVOLUTIONS.
064146,000080:
064147,000081: 22,3546 03576 1STO2S TC 1TO2SUB
064148,000082: 22,3547 35021 CAF ZERO
064149,000083: 22,3550 54155 TS MPAC +1
064150,000084: 22,3551 16027 TCF NEWMODE
064151,000085:
064152,000086: # DO 1STO2S ON A VECTOR OF ANGLES:
064153,000087:
064154,000088: 22,3552 03576 V1STO2S TC 1TO2SUB # ANSWER ARRIVES IN A AND MPAC.
064155,000089:
064156,000090: 22,3553 52162 DXCH MPAC +5
064157,000091: 22,3554 52155 DXCH MPAC
064158,000092: 22,3555 03576 TC 1TO2SUB
064159,000093: 22,3556 54156 TS MPAC +2
064160,000094:
064161,000095: 22,3557 52160 DXCH MPAC +3
064162,000096: 22,3560 52155 DXCH MPAC
064163,000097: 22,3561 03576 TC 1TO2SUB
064164,000098: 22,3562 54155 TS MPAC +1
064165,000099:
064166,000100: 22,3563 30161 CA MPAC +5
064167,000101: 22,3564 54154 TS MPAC
064168,000102:
064169,000103: 22,3565 35017 TPMODE CAF ONE # MODE IS TP.
064170,000104: 22,3566 16027 TCF NEWMODE
064171,000105:
064172,000106: # V1STO2S FOR 2 COMPONENT VECTOR. USED BY RR.
064173,000107:
064174,000108: 22,3567 03576 2V1STO2S TC 1TO2SUB
064175,000109: 22,3570 52160 DXCH MPAC +3
064176,000110: 22,3571 52155 DXCH MPAC
064177,000111: 22,3572 03576 TC 1TO2SUB
064178,000112: 22,3573 54001 TS L
064179,000113: 22,3574 30157 CA MPAC +3
064180,000114: 22,3575 16024 TCF SLOAD2
064181,000115:
064182,000116: # SUBROUTINE TO DO DOUBLING AND 1'S TO 2'S CONVERSION:
064183,000117:
064184,000118: 22,3576 52155 1TO2SUB DXCH MPAC # FINAL MPAC +1 UNSPECIFIED.
064185,000119: 22,3577 20001 DDOUBL
064186,000120: 22,3600 10000 CCS A
064187,000121: 22,3601 65017 AD ONE
064188,000122: 22,3602 13604 TCF +2
064189,000123: 22,3603 40000 COM # THIS WAS REVERSE OF MSU.
064190,000124:
064191,000125: 22,3604 54154 TS MPAC # AND SKIP ON OVERFLOW.
Page 1510 |
064193,000127: 22,3605 00002 TC Q
064194,000128:
064195,000129: 22,3606 50000 INDEX A # OVERFLOW UNCORRECT AND IN MSU.
064196,000130: 22,3607 35000 CAF LIMITS
064197,000131: 22,3610 26154 ADS MPAC
064198,000132: 22,3611 00002 TC Q
064199,000133:
Page 1511 |
064201,000135: # SUBROUTINE TO INCREMENT CDUS
064202,000136:
064203,000137: 22,3612 33625 INCRCDUS CAF LOCTHETA
064204,000138: 22,3613 54130 TS BUF # PLACE ADRES(THETA) IN BUF.
064205,000139: 22,3614 30154 CAE MPAC # INCREMENT IN 1S COMPL.
064206,000140: 22,3615 03626 TC CDUINC
064207,000141:
064208,000142: 22,3616 24130 INCR BUF
064209,000143: 22,3617 30157 CAE MPAC +3
064210,000144: 22,3620 03626 TC CDUINC
064211,000145:
064212,000146: 22,3621 24130 INCR BUF
064213,000147: 22,3622 30161 CAE MPAC +5
064214,000148: 22,3623 03626 TC CDUINC
064215,000149:
064216,000150: 22,3624 13543 TCF VECMODE
064217,000151:
064218,000152: 22,3625 01155 LOCTHETA ADRES THETAD
064219,000153:
064220,000154: # THE FOLLOWING ROUTINE INCREMENTS IN 2S COMPLEMENT THE REGISTER WHOSE ADDRESS IS IN BUF BY THE 1S COMPL.
064221,000155: # QUANTITY FOUND IN TEM2. THIS MAY BE USED TO INCREMENT DESIRED IMU AND OPTICS CDU ANGLES OR ANY OTHER 2S COMPL.
064222,000156: # (+0 UNEQUAL TO -0) QUANTITY. MAY BE CALLED BY BANKCALL/SWCALL.
064223,000157:
064224,000158: 22,3626 54142 CDUINC TS TEM2 # 1S COMPL. QUANT. ARRIVES IN ACC. STORE IT
064225,000159: 22,3627 50130 INDEX BUF
064226,000160: 22,3630 10000 CCS 0 # CHANGE 2S COMPL. ANGLE (IN BUF) INTO 1S
064227,000161: 22,3631 65017 AD ONE
064228,000162: 22,3632 13636 TCF +4
064229,000163: 22,3633 65017 AD ONE
064230,000164: 22,3634 65017 AD ONE # OVERFLOW HERE IF 2S COMPL. IS 180 DEG.
064231,000165: 22,3635 40000 COM
064232,000166:
064233,000167: 22,3636 60142 AD TEM2 # SULT MOVES FROM 2ND TO 3D QUAD. (OR BACK)
064234,000168: 22,3637 10000 CCS A # BACK TO 2S COMPL.
064235,000169: 22,3640 65017 AD ONE
064236,000170: 22,3641 13643 TCF +2
064237,000171: 22,3642 40000 COM
064238,000172: 22,3643 54142 TS TEM2 # STORE 14BIT QUANTITY WITH PRESENT SIGN
064239,000173: 22,3644 13650 TCF +4
064240,000174: 22,3645 50000 INDEX A # SIGN.
064241,000175: 22,3646 35000 CAF LIMITS # FIX IT, BY ADDING IN 37777 OR 40000
064242,000176: 22,3647 60142 AD TEM2
064243,000177:
064244,000178: 22,3650 50130 INDEX BUF
064245,000179: 22,3651 54000 TS 0 # STORE NEW ANGLE IN 2S COMPLEMENT.
064246,000180: 22,3652 00002 TC Q
064247,000181:
Page 1512 |
064249,000183: # RTB TO TORQUE GYROS, EXCEPT FOR THE CALL TO IMUSTALL. ECADR OF COMMANDS ARRIVES IN X1.
064250,000184:
064251,000185: 22,3653 50120 PULSEIMU INDEX FIXLOC # ADDRESS OF GYRO COMMANDS SHOULD BE IN X1
064252,000186: 22,3654 30046 CA X1
064253,000187: 22,3655 04662 TC BANKCALL
064254,000188: 22,3656 17206 CADR IMUPULSE
064255,000189: 22,3657 16030 TCF DANZIG
064256,000190:
Page 1513 |
064258,000192: # EACH ROUTINE TAKES A 3X3 MATRIX STORED IN DOUBLE PRECISION IN A FIXED AREA OF ERASABLE MEMORY AND REPLACES IT
064259,000193: # WITH THE TRANSPOSE MATRIX. TRANSP1 USES LOCATIONS XNB+0,+1 THROUGH XNB+16D, 17D AND TRANSP2 USES LOCATIONS
064260,000194: # XNB1+0,+1 THROUGH XNB1+16D, 17D. EACH MATRIX IS STORED BY ROWS.
064261,000195:
064262,000196: 22,3660 02713 XNBEB ECADR XNB
064263,000197: 22,3661 02554 XNB1EB ECADR XNB1
064264,000198:
064265,000199: 22,3662 E5,1713 EBANK= XNB
064266,000200:
064267,000201: 22,3662 33660 TRANSP1 CAF XNBEB
064268,000202: 22,3663 54003 TS EBANK
064269,000203: 22,3664 53716 DXCH XNB +2
064270,000204: 22,3665 53722 DXCH XNB +6
064271,000205: 22,3666 53716 DXCH XNB +2
064272,000206:
064273,000207: 22,3667 53720 DXCH XNB +4
064274,000208: 22,3670 53730 DXCH XNB +12D
064275,000209: 22,3671 53720 DXCH XNB +4
064276,000210:
064277,000211: 22,3672 53726 DXCH XNB +10D
064278,000212: 22,3673 53732 DXCH XNB +14D
064279,000213: 22,3674 53726 DXCH XNB +10D
064280,000214: 22,3675 16030 TCF DANZIG
064281,000215: 22,3676 E5,1554 EBANK= XNB1
064282,000216:
064283,000217: 22,3676 33661 TRANSP2 CAF XNB1EB
064284,000218: 22,3677 54003 TS EBANK
064285,000219: 22,3700 53557 DXCH XNB1 +2
064286,000220: 22,3701 53563 DXCH XNB1 +6
064287,000221: 22,3702 53557 DXCH XNB1 +2
064288,000222:
064289,000223: 22,3703 53561 DXCH XNB1 +4
064290,000224: 22,3704 53571 DXCH XNB1 +12D
064291,000225: 22,3705 53561 DXCH XNB1 +4
064292,000226:
064293,000227: 22,3706 53567 DXCH XNB1 +10D
064294,000228: 22,3707 53573 DXCH XNB1 +14D
064295,000229: 22,3710 53567 DXCH XNB1 +10D
064296,000230: 22,3711 16030 TCF DANZIG
064297,000231:
Page 1514 |
064299,000233: # THE SUBROUTINE SIGNMPAC SETS C(MPAC, MPAC +1) TO SIGN(MPAC).
064300,000234: # FOR THIS, ONLY THE CONTENTS OF MPAC ARE EXAMINED. ALSO +0 YIELDS POSMAX AND -0 YIELDS NEGMAX.
064301,000235:
064302,000236: # ENTRY MAY BE BY EITHER OF THE FOLLOWING:
064303,000237: # 1. LIMIT THE SIZE OF MPAC ON INTERPRETIVE OVERFLOW:
064304,000238: # ENTRY: BOVB
064305,000239: # SIGNMPAC
064306,000240: # 2. GENERATE IN MPAC THE SIGNUM FUNCTION OF MPAC:
064307,000241: # ENTRY: RTB
064308,000242: # SIGNMPAC
064309,000243: # IN EITHER CASE, RETURN IS TO THE NEXT INTERPRETIVE INSTRUCTION IN THE CALLING SEQUENCE.
064310,000244:
064311,000245: 22,3712 00006 SIGNMPAC EXTEND
064312,000246: 22,3713 34777 DCA DPOSMAX
064313,000247: 22,3714 52155 DXCH MPAC
064314,000248: 22,3715 10000 CCS A
064315,000249: 22,3716 35021 DPMODE CAF ZERO # SETS MPAC +2 TO ZERO IN THE PROCESS
064316,000250: 22,3717 16026 TCF SLOAD2 +2
064317,000251: 22,3720 13721 TCF +1
064318,000252: 22,3721 00006 EXTEND
064319,000253: 22,3722 44777 DCS DPOSMAX
064320,000254: 22,3723 16024 TCF SLOAD2
064321,000255:
064322,000256: # RTB OP CODE NORMUNIT IS LIKE INTERPRETIVE INSTRUCTION UNIT, EXCEPT THAT IT CAN BE DEPENDED ON NOT TO BLOW
064323,000257: # UP WHEN THE VECTOR BEING UNITIZED IS VERY SMALL -- IT WILL BLOW UP WHEN ALL COMPONENTS ARE ZERO. IF NORMUNIT
064324,000258: # IS USED AND THE UPPER ORDER HALVES OF ALL COMPONENTS ARE ZERO, THE MAGNITUDE RETURNED IN 36D WILL BE TOO LARGE
064325,000259: # BY A FACTOR OF 2(13) AND THE SQUARED MAGNITUDE RETURNED AT 34D WILL BE TOO BIG BY A FACTOR OF 2(26).
064326,000260:
064327,000261: 22,3724 35017 NORMUNX1 CAF ONE
064328,000262: 22,3725 13727 TCF NORMUNIT +1
064329,000263: 22,3726 35021 NORMUNIT CAF ZERO
064330,000264: 22,3727 60120 AD FIXLOC
064331,000265: 22,3730 54156 TS MPAC +2
064332,000266: 22,3731 04662 TC BANKCALL # GET SIGN AGREEMENT IN ALL COMPONENTS
064333,000267: 22,3732 01010 CADR VECAGREE
064334,000268: 22,3733 10154 CCS MPAC
064335,000269: 22,3734 13770 TCF NOSHIFT
064336,000270: 22,3735 13737 TCF +2
064337,000271: 22,3736 13770 TCF NOSHIFT
064338,000272: 22,3737 10157 CCS MPAC +3
064339,000273: 22,3740 13770 TCF NOSHIFT
064340,000274: 22,3741 13743 TCF +2
064341,000275: 22,3742 13770 TCF NOSHIFT
064342,000276: 22,3743 10161 CCS MPAC +5
064343,000277: 22,3744 13770 TCF NOSHIFT
064344,000278: 22,3745 13747 TCF +2
064345,000279: 22,3746 13770 TCF NOSHIFT
Page 1515 |
064347,000281: 22,3747 30155 CA MPAC +1 # SHIFT ALL COMPONENTS LEFT 13
064348,000282: 22,3750 00006 EXTEND
064349,000283: 22,3751 75002 MP BIT14
064350,000284: 22,3752 20155 DAS MPAC # DAS GAINS A LITTLE ACCURACY
064351,000285: 22,3753 30160 CA MPAC +4
064352,000286: 22,3754 00006 EXTEND
064353,000287: 22,3755 75002 MP BIT14
064354,000288: 22,3756 20160 DAS MPAC +3
064355,000289: 22,3757 30162 CA MPAC +6
064356,000290: 22,3760 00006 EXTEND
064357,000291: 22,3761 75002 MP BIT14
064358,000292: 22,3762 20162 DAS MPAC +5
064359,000293: 22,3763 35025 CAF THIRTEEN
064360,000294: 22,3764 50156 INDEX MPAC +2
064361,000295: 22,3765 54045 TS 37D
064362,000296: 22,3766 04701 OFFTUNIT TC POSTJUMP
064363,000297: 22,3767 01024 CADR UNIT +1 # SKIP THE "TC VECAGREE" DONE AT UNIT
064364,000298:
064365,000299: 22,3770 35021 NOSHIFT CAF ZERO
064366,000300: 22,3771 13764 TCF OFFTUNIT -2
064367,000301:
064368,000302: # RTB VECSGNAG ... FORCES SIGN AGREEMENT OF VECTOR IN MPAC.
064369,000303:
064370,000304: 22,3772 04662 VECSGNAG TC BANKCALL
064371,000305: 22,3773 01010 CADR VECAGREE
064372,000306: 22,3774 06030 TC DANZIG
064373,000307:
Page 1516 |
064375,000309:
Reconstruction: From this point through the end of the RTB OP CODES log section, we have code in Comanche 45 that was not present in Comanche 44. This is the very end of memory-bank 16. It is part of the fix for the problem described in MIT Software Anomaly Report COM-4. This is discussed in detail in the related annotation in log section P40-P47. |
064381,000315: 16,2000 SETLOC MODCHG1
064382,000316: 16,2000 BANK
064383,000317: 16,3715 51575 S40.1A VLOAD ABVAL
064384,000318: 16,3716 03646 DELVSIN
064385,000319: 16,3717 27654 STOVL DELVSAB # COMPUTE FOR P30/P40 INTERFACE
064386,000320: 16,3720 03640 VTIG
064387,000321: 16,3721 77616 RVQ
End of include-file RTB_OP_CODES.agc. Parent file is MAIN.agc