Source Code
![]() |
These source code files are a reconstruction of Sundance, the Apollo 9 LM (Lunar Module) AGC
(Apollo Guidance Computer) flight software, created from binary dumps of original core rope
program modules, as follows:
Since only binary dumps (rather than listings) of Sundance are available as source material, all comments and labels are approximate. They have been taken from other AGC programs where possible, or, in some places, written from scratch to match what we believe would have been in the original listing. |
012372,000002: ## Copyright: Public domain. 012373,000003: ## Filename: ATTITUDE_MANEUVER_ROUTINE.agc 012374,000004: ## Purpose: A section of a reconstructed, mixed version of Sundance 012375,000005: ## It is part of the reconstructed source code for the Lunar 012376,000006: ## Module's (LM) Apollo Guidance Computer (AGC) for Apollo 9. 012377,000007: ## No original listings of this program are available; 012378,000008: ## instead, this file was created via disassembly of dumps 012379,000009: ## of various revisions of Sundance core rope modules. 012380,000010: ## Assembler: yaYUL 012381,000011: ## Contact: Ron Burkey <info@sandroid.org>. 012382,000012: ## Website: www.ibiblio.org/apollo/index.html 012383,000013: ## Mod history: 2020-06-17 MAS Created from Luminary 69. 012384,000014: 012385,000015: ## Sundance 302 012386,000016: 012387,000017: # BLOCK 2 LGC ATTITUDE MANEUVER ROUTINE-KALCMANU 012388,000018: 012389,000019: 012390,000020: # MOD 2 DATE 5/1/67 BY DON KEENE 012391,000021: # PROGRAM DESCRIPTION 012392,000022: 012393,000023: # KALCMANU IS A ROUTINE WHICH GENERATES COMMANDS FOR THE LM DAP TO CHANGE THE ATTITUDE OF THE SPACECRAFT 012394,000024: # DURING FREE FALL. IT IS DESIGNED TO MANEUVER THE SPACECRAFT FROM ITS INITIAL ORIENTATION TO SOME DESIRED 012395,000025: # ORIENTATION SPECIFIED BY THE PROGRAM WHICH CALLS KALCMANU, AVOIDING GIMBAL LOCK IN THE PROCESS. IN THE 012396,000026: # MOD 2 VERSION, THIS DESIRED ATTITUDE IS SPECIFIED BY A SET OF THREE COMMANDED CDU ANGLES STORED AS 2S COMPLEMENT 012397,000027: # SINGLE PRECISION ANGLES IN THE THREE CONSECUTIVE LOCATIONS, CPHI, CTHETA, CPSI, WHERE 012398,000028: 012399,000029: # CPHI = COMMANDED OUTER GIMBAL ANGLE 012400,000030: # CTHETA = COMMANDED INNER GIMBAL ANGLE 012401,000031: # CPSI = COMMANDED MIDDLE GIMBAL ANGLE 012402,000032: 012403,000033: # WHEN POINTING A SPACECRAFT AXIS (E.I. X, Y, Z, THE AOT, THRUST AXIS, ETC) THE SUBROUTINE VECPOINT MAY BE 012404,000034: # USED TO GENERATE THIS SET OF DESIRED CDU ANGLES (SEE DESCRIPTION IN R60) - 012405,000035: # WITH THIS INFORMATION KALCMANU DETERMINES THE DIRECTION OF THE SINGLE EQUIVALENT ROTATION (COF ALSO U) AND THE 012406,000036: # MAGNITUDE OF THE ROTATION (AM) TO BRING THE S/C FROM ITS INITIAL ORIENTATION TO ITS FINAL ORIENTATION. 012407,000037: # THIS DIRECTION REMAINS FIXED BOTH IN INERTIAL COORDINATES AND IN COMMANDED S/C AXES THROUGHOUT THE 012408,000038: # - 012409,000039: # MANEUVER. ONCE COF AND AM HAVE BEEN DETERMINED, KALCMANU THEN EXAMINES THE MANEUVER TO SEE IF IT WILL BRING 012410,000040: # - 012411,000041: # THE S/C THROUGH GIMBAL LOCK. IF SO, COF AND AM ARE READJUSTED SO THAT THE S/C WILL JUST SKIM THE GIMBAL 012412,000042: # LOCK ZONE AND ALIGN THE X-AXIS. IN GENERAL A FINAL YAW ABOUT X WILL BE NECESSARY TO COMPLETE THE MANEUVER. 012413,000043: # NEEDLESS TO SAY, NEITHER THE INITIAL NOR THE FINAL ORIENTATION CAN BE IN GIMBAL LOCK. 012414,000044: 012415,000045: # FOR PROPER ATTITUDE CONTROL THE DIGITAL AUTOPILOT MUST BE GIVEN AN ATTITUDE REFERENCE WHICH IT CAN TRACK. 012416,000046: # KALCMANU DOES THIS BY GENERATING A REFERENCE OF DESIRED GIMBAL ANGLES (CDUXD, CDUYD, CDUZD) WHICH ARE UPDATED 012417,000047: # EVERY ONE SECOND DURING THE MANEUVER. TO ACHIEVE A SMOOTHER SEQUENCE OF COMMANDS BETWEEN SUCCESSIVE UPDATES, 012418,000048: # THE PROGRAM ALSO GENERATES A SET OF INCREMENTAL CDU ANGLES (DELDCDU) TO BE ADDED TO CDU DESIRED BY THE DIGITAL 012419,000049: # AUTOPILOT. KALCMANU ALSO CALCULATES THE COMPONENT MANEUVER RATES (OMEGAPD, OMEGAQD, OMEGARD), WHICH CAN 012420,000050: # - 012421,000051: # BE DETERMINED SIMPLY BY MULTIPLYING COF BY SOME SCALAR (ARATE) CORRESPONDING TO THE DESIRED ROTATIONAL RATE. 012422,000052: 012423,000053: # AUTOMATIC MANEUVERS ARE TIMED WITH THE HELP OF WAITLIST SO THAT AFTER A SPECIFIED INTERVAL THE Y AND Z 012424,000054: # DESIRED RATES ARE SET TO ZERO AND THE DESIRED CDU ANGLES (CDUYD, CDUZD) ARE SET EQUAL TO THE FINAL DESIRED CDU 012425,000055: # ANGLES (CTHETA, CPSI). IF ANY YAW REMAINS DUE TO GIMBAL LOCK AVOIDANCE, THE FINAL YAW MANEUVER IS 012426,000056: # CALCULATED AND THE DESIRED YAW RATE SET TO SOME FIXED VALUE (ROLLRATE = + OR - 2 DEGREES PER SEC). 012427,000057: # IN THIS CASE ONLY AN INCREMENTAL CDUX ANGLE (DELFROLL) IS SUPPLIED TO THE DAP. AT THE END OF THE YAW 012428,000058: # MANEUVER OR IN THE EVENT THAT THERE WAS NO FINAL YAW, CDUXD IS SET EQUAL TO CPHI AND THE X-AXIS DESIRED 012429,000059: # RATE SET TO ZERO. THUS, UPON COMPLETION OF THE MANEUVER THE S/C WILL FINISH UP IN A LIMIT CYCLE ABOUT THE 012430,000060: # DESIRED FINAL GIMBAL ANGLES. 012431,000061: 012432,000062: 012433,000063: # PROGRAM LOGIC FLOW 012434,000064: 012435,000065: # KALCMANU IS CALLED AS A HIGH PRIORITY JOB WITH ENTRY POINTS AT KALCMAN3 AND VECPOINT. IT FIRST PICKS 012436,000066: # UP THE CURRENT CDU ANGLES TO BE USED AS THE BASIS FOR ALL COMPUTATIONS INVOLVING THE INITIAL S/C ORIENTATION. 012437,000067: # IT THEN DETERMINES THE DIRECTION COSINE MATRICES RELATING BOTH THE INITIAL AND FINAL S/C ORIENTATION TO STABLE 012438,000068: # * * * 012439,000069: # MEMBER AXES (MIS, MFS). IT ALSO COMPUTES THE MATRIX RELATING FINAL S/C AXES TO INITIAL S/C AXES (MFI). THE 012440,000070: # ANGLE OF ROTATION (AM) IS THEN EXTRACTED FROM THIS MATRIX, AND TESTS ARE MADE TO DETERMINE IF 012441,000071: 012442,000072: # A) AM LESS THAN .25 DEGREES (MINANG) 012443,000073: # B) AM GREATER THAN 170 DEGREES (MAXANG) 012444,000074: 012445,000075: # IF AM LESS THAN .25 DEGREES, NO COMPLICATED AUTOMATIC MANEUVERING IS NECESSARY. THEREFORE WE CAN SIMPLY 012446,000076: # SET CDU DESIRED EQUAL TO THE FINAL CDU DESIRED ANGLES AND TERMINATE THE JOB. 012447,000077: 012448,000078: # IF AM IS GREATER THAN .25 DEGREES BUT LESS THAN 170 DEGREES, THE AXES OF THE SINGLE EQUIVALENT ROTATION 012449,000079: # - * 012450,000080: # (COF) IS EXTRACTED FROM THE SKEW SYMMETRIC COMPONENTS OF MFI. * * 012451,000081: # IF AM GREATER THAN 170 DEGREES AN ALTERNATE METHOD EMPLOYING THE SYMMETRIC PART OF MFI (MFISYM) IS USED 012452,000082: # - 012453,000083: # TO DETERMINE COF. 012454,000084: 012455,000085: # THE PROGRAM THEN CHECKS TO SEE IF THE MANEUVER AS COMPUTED WILL BRING THE S/C THROUGH GIMBAL LOCK. IF 012456,000086: # SO, A NEW MANEUVER IS CALCULATED WHICH WILL JUST SKIM THE GIMBAL LOCK ZONE AND ALIGN THE S/C X-AXIS. THIS 012457,000087: # METHOD ASSURES THAT THE ADDITIONAL MANEUVERING TO AVOID GIMBAL LOCK WILL BE KEPT TO A MINIMUM. SINCE A FINAL 012458,000088: # P AXIS YAW WILL BE NECESSARY, A SWITCH IS RESET (STATE SWITCH 31) TO ALLOW FOR THE COMPUTATION OF THIS FINAL 012459,000089: # YAW. 012460,000090: 012461,000091: # AS STATED PREVIOUSLY KALCMANU GENERATES A SEQUENCE OF DESIRED GIMBAL ANGLES WHICH ARE UPDATED EVERY 012462,000092: # - 012463,000093: # SECOND. THIS IS ACCOMPLISHED BY A SMALL ROTATION OF THE DESIRED S/C FRAME ABOUT THE VECTOR COF. THE NEW 012464,000094: # DESIRED REFERENCE MATRIX IS THEN, 012465,000095: 012466,000096: # * * * 012467,000097: # MIS = MIS DEL 012468,000098: # N+1 N 012469,000099: 012470,000100: # * 012471,000101: # WHERE DEL IS THE MATRIX CORRESPONDING TO THIS SMALL ROTATION. THE NEW CDU ANGLES CAN THEN BE EXTRACTED 012472,000102: # * 012473,000103: # FROM MIS. 012474,000104: 012475,000105: # AT THE BEGINNING OF THE MANEUVER THE AUTOPILOT DESIRED RATES (OMEGAPD, OMEGAQD, OMEGARD) AND THE 012476,000106: # MANEUVER TIMINGS ARE ESTABLISHED. ON THE FIRST PASS AND ON ALL SUBSEQUENT UPDATES THE CDU DESIRED 012477,000107: # ANGLES ARE LOADED WITH THE APPROPRIATE VALUES AND THE INCREMENTAL CDU ANGLES ARE COMPUTED. THE AGC CLOCKS 012478,000108: # (TIME1 AND TIME2) ARE THAN CHECKED TO SEE IF THE MANEUVER WILL TERMINATE BEFORE THE NEXT UPDATE. IF 012479,000109: # NOT, KALCMANU CALLS FOR ANOTHER UPDATE (RUN AS A JOB WITH PRIORITY TBD) IN ONE SECOND. ANY DELAYS IN THIS 012480,000110: # CALLING SEQUENCE ARE AUTOMATICALLY COMPENSATED IN CALLING FOR THE NEXT UPDATE. 012481,000111: 012482,000112: # IF IT IS FOUND THAT THE MANEUVER IS TO TERMINATE BEFORE THE NEXT UPDATE A ROUTINE IS CALLED (AS A WAIT- 012483,000113: # LIST TASK) TO STOP THE MANEUVER AT THE APPROPRIATE TIME AS EXPLAINED ABOVE. 012484,000114: 012485,000115: # CALLING SEQUENCE 012486,000116: 012487,000117: # IN ORDER TO PERFORM A KALCMANU SUPERVISED MANEUVER, THE COMMANDED GIMBAL ANGLES MUST BE PRECOMPUTED AND 012488,000118: # STORED IN LOCATIONS CPHI, CTHETA, CPSI. THE USER:S PROGRAM MUST THEN CLEAR STATE SWITCH NO 33 TO ALLOW THE 012489,000119: # ATTITUDE MANEUVER ROUTINE TO PERFORM ANY FINAL P-AXIS YAW INCURRED BY AVOIDING GIMBAL LOCK. THE MANEUVER IS 012490,000120: # THEN INITIATED BY ESTABLISHING THE FOLLOWING EXECUTIVE JOB 012491,000121: 012492,000122: # * 012493,000123: # CAF PRIO XX 012494,000124: # -- 012495,000125: # INHINT 012496,000126: # TC FINDVAC 012497,000127: # 2CADR KALCMAN3 012498,000128: # RELINT 012499,000129: 012500,000130: # THE USER:S PROGRAM MAY EITHER CONTINUE OR WAIT FOR THE TERMINATION OF THE MANEUVER. IF THE USER WISHES TO 012501,000131: # WAIT, HE MAY PUT HIS JOB TO SLEEP WITH THE FOLLOWING INSTRUCTIONS 012502,000132: 012503,000133: # L TC BANKCALL 012504,000134: # L+1 CADR ATTSTALL 012505,000135: # L+2 (BAD RETURN) 012506,000136: # L+3 (GOOD RETURN) 012507,000137: 012508,000138: # UPON COMPLETION OF THE MANEUVER, THE PROGRAM WILL BE AWAKENED AT L+3 IF THE MANEUVER WAS COMPLETED 012509,000139: # SUCCESSFULLY, OR AT L+2 IF THE MANEUVER WAS ABORTED. THIS ABORT WOULD OCCUR IF THE INITIAL OR FINAL ATTITUDE 012510,000140: # WAS IN GIMBAL LOCK. 012511,000141: 012512,000142: # ***NOTA BENE*** IT IS ASSUMED THAT THE DESIRED MANEUVERING RATE (0.5, 2, 5, 10, DEG/SEC) HAS BEEN SELECTED BY 012513,000143: # KEYBOARD ENTRY PRIOR TO THE EXECUTION OF KALCMANU. 012514,000144: # IT IS ALSO ASSUMED THAT THE AUTOPILOT IS IN THE AUTO MODE. IF THE MODE SWITCH IS CHANGED DURING THE 012515,000145: # MANEUVER, KALCMANU WILL TERMINATE VIA GOODEND WITHIN 1 SECOND SO THAT R60 MAY REQUEST A TRIM OF THE S/C ATTITUDE 012516,000146: # THIS IS THE ONLY MEANS FOR MANUALLY TERMINATING A KALCMANU SUPERVISED MANEUVER. 012517,000147: # SUBROUTINES 012518,000148: 012519,000149: # KALCMANU USES A NUMBER OF INTERPRETIVE SUBROUTINES WHICH MAY BE OF GENERAL INTEREST. SINCE THESE ROUTINES 012520,000150: # WERE PROGRAMMED EXCLUSIVELY FOR KALCMANU, THEY ARE NOT, AS YET, GENERALLY AVAILABLE FOR USE BY OTHER PROGRAMS. 012521,000151: 012522,000152: # MXM3 012523,000153: # ---- 012524,000154: 012525,000155: # THIS SUBROUTINE MULTIPLIES TWO 3X3 MATRICES AND LEAVES THE RESULT IN THE FIRST 18 LOCATIONS OF THE PUSH 012526,000156: # DOWN LIST, I.E., 012527,000157: 012528,000158: # (M M M ) 012529,000159: # ( 0 1 2) 012530,000160: # * ( ) * * 012531,000161: # M = (M M M ) = M1 X M2 012532,000162: # ( 3 4 5) 012533,000163: # ( ) 012534,000164: # (M M M ) 012535,000165: # ( 6 7 8) 012536,000166: 012537,000167: # * 012538,000168: # INDEX REGISTER X1 MUST BE LOADED WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M1, AND X2 MUST BE 012539,000169: # * 012540,000170: # LOADED WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M2. THE ROUTINE USES THE FIRST 20 LOCATIONS OF THE PUSH 012541,000171: # DOWN LIST. THE FIRST ELEMENT OF THE MATRIX APPEARS IN PDO. PUSH UP FOR M . 012542,000172: # 8 012543,000173: 012544,000174: # TRANSPOS 012545,000175: # -------- 012546,000176: 012547,000177: # THIS ROUTINE TRANSPOSES A 3X3 MATRIX AND LEAVES THE RESULT IN THE PUSH DOWN LIST, I.E., 012548,000178: # 012549,000179: # * * T 012550,000180: # M = M1 012551,000181: 012552,000182: # INDEX REGISTER X1 MUST CONTAIN THE COMPLEMENT OF THE STARTING ADDRESS FOR M1. PUSH UP FOR THE FIRST AND SUB- 012553,000183: # * 012554,000184: # SEQUENT COMPONENTS OF M. THIS SUBROUTINE ALSO USES THE FIRST 20 LOCATIONS OF THE PUSH DOWN LIST. 012555,000185: 012556,000186: # CDU TO DCM 012557,000187: # ---------- 012558,000188: 012559,000189: # THIS SUBROUTINE CONVERTS THREE CDU ANGLES IN T(MPAC) TO A DIRECTION COSINE MATRIX (SCALED BY 2) RELATING 012560,000190: # THE CORRESPONDING S/C ORIENTATIONS TO THE STABLE MEMBER FRAME. THE FORMULAS FOR THIS CONVERSION ARE 012561,000191: 012562,000192: # M = COSY COSZ 012563,000193: # 0 012564,000194: 012565,000195: # M = -COSY SINZ COSX + SINY SINX 012566,000196: # 1 012567,000197: 012568,000198: # M = COSY SINZ SINX + SINY COSX 012569,000199: # 2 012570,000200: 012571,000201: # M = SINZ 012572,000202: # 3 012573,000203: 012574,000204: # M = COSZ COSX 012575,000205: # 4 012576,000206: 012577,000207: # M = -COSZ SINX 012578,000208: # 5 012579,000209: 012580,000210: # M = -SINY COSZ 012581,000211: # 6 012582,000212: # 012583,000213: # M = SINY SINZ COSX + COSY SINX 012584,000214: # 7 012585,000215: # M = -SINY SINZ SINX + COSY COSX 012586,000216: # 8 012587,000217: 012588,000218: # WHERE X = OUTER GIMBAL ANGLE 012589,000219: # Y = INNER GIMBAL ANGLE 012590,000220: # Z = MIDDLE GIMBAL ANGLE 012591,000221: 012592,000222: # THE INTERPRETATION OF THIS MATRIX IS AS FOLLOWS 012593,000223: 012594,000224: # IF A , A , A REPRESENT THE COMPONENTS OF A VECTOR IN S/C AXES THEN THE COMPONENTS OF THE SAME VECTOR IN 012595,000225: # X Y Z 012596,000226: # STABLE MEMBER AXES (B , B , B ) ARE 012597,000227: # X Y Z 012598,000228: 012599,000229: # (B ) (A ) 012600,000230: # ( X) ( X) 012601,000231: # ( ) ( ) 012602,000232: # ( ) * ( ) 012603,000233: # (B ) = M (A ) 012604,000234: # ( Y) ( Y) 012605,000235: # ( ) ( ) 012606,000236: # (B ) (A ) 012607,000237: # ( Z) ( Z) 012608,000238: 012609,000239: # THE SUBROUTINE WILL STORE THIS MATRIX IN SEQUENTIAL LOCATIONS OF ERASABLE MEMORY AS SPECIFIED BY THE CALLING 012610,000240: # * 012611,000241: # PROGRAM. TO DO THIS THE CALLING PROGRAM MUST FIRST LOAD X2 WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M. 012612,000242: 012613,000243: # INTERNALLY, THE ROUTINE USES THE FIRST 16 LOCATIONS OF THE PUSH DOWN LIST, ALSO STEP REGISTER S1 AND INDEX 012614,000244: # REGISTER X2. 012615,000245: 012616,000246: 012617,000247: # DCM TO CDU 012618,000248: # ---------- 012619,000249: # * 012620,000250: # THIS ROUTINE EXTRACTS THE CDU ANGLES FROM A DIRECTION COSINE MATRIX (M SCALED BY 2) RELATING S/C AXIS TO 012621,000251: # * 012622,000252: # STABLE MEMBER AXES. X1 MUST CONTAIN THE COMPLEMENT OF THE STARTING ADDRESS FOR M. THE SUBROUTINE LEAVES THE 012623,000253: # CORRESPONDING GIMBAL ANGLES IN V(MPAC) AS DOUBLE PRECISION 1:S COMPLEMENT ANGLES SCALED BY 2PI. THE FORMULAS 012624,000254: # FOR THIS CONVERSION ARE 012625,000255: 012626,000256: # Z = ARCSIN (M ) 012627,000257: # 3 012628,000258: 012629,000259: # Y = ARCSIN (-M /COSZ) 012630,000260: # 6 012631,000261: 012632,000262: # IF M IS NEGATIVE, Y IS REPLACED BY PI SGN Y - Y 012633,000263: # 0 012634,000264: # X = ARCSIN (-M /COSZ) 012635,000265: # 5 012636,000266: 012637,000267: # IF M IS NEGATIVE X IS REPLACED BY PI SGN X - X 012638,000268: # 4 012639,000269: 012640,000270: # THIS ROUTINE DOES NOT SET THE PUSH DOWN POINTER, BUT USES THE NEXT 8 LOCATIONS OF THE PUSH DOWN LIST AND 012641,000271: # RETURNS THE POINTER TO ITS ORIGINAL SETTING. THIS PROCEDURE ALLOWS THE CALLER TO STORE THE MATRIX AT THE TOP OF 012642,000272: # THE PUSH DOWN LIST. 012643,000273: 012644,000274: 012645,000275: # DELCOMP 012646,000276: # ------- 012647,000277: 012648,000278: # * 012649,000279: # THIS ROUTINE COMPUTES THE DIRECTION COSINE MATRIX (DEL) RELATING ON 012650,000280: # - 012651,000281: # IS ROTATED WITH RESPECT TO THE FIRST BY AN ANGLE, A, ABOUT A UNIT VECTOR, U. THE FORMULA FOR THIS MATRIX IS 012652,000282: 012653,000283: # * * --T * 012654,000284: # DEL = I COSA + UU (1-COSA) + V SINA 012655,000285: # X 012656,000286: 012657,000287: # WHERE * (1 0 0) 012658,000288: # I = (0 1 0) 012659,000289: # (0 0 1) 012660,000290: 012661,000291: 012662,000292: # 2 012663,000293: # (U U U U U ) 012664,000294: # ( X X Y X Z) 012665,000295: # ( ) 012666,000296: # --T ( 2 ) 012667,000297: # UU = (U U U U U ) 012668,000298: # ( Y X Y Y Z) 012669,000299: # ( ) 012670,000300: # ( 2 ) 012671,000301: # (U U U U U ) 012672,000302: # ( Z X Z Y Z ) 012673,000303: 012674,000304: 012675,000305: # (0 -U U ) 012676,000306: # ( Z Y ) 012677,000307: # * ( ) 012678,000308: # V = (U 0 -U ) 012679,000309: # X ( Z X) 012680,000310: # ( ) 012681,000311: # (-U U 0 ) 012682,000312: # ( Y X ) 012683,000313: 012684,000314: # - 012685,000315: # U = UNIT ROTATION VECTOR RESOLVED INTO S/C AXES 012686,000316: # A = ROTATION ANGLE 012687,000317: 012688,000318: # * 012689,000319: # THE INTERPRETATION OF DEL IS AS FOLLOWS 012690,000320: 012691,000321: # IF A , A , A REPRESENT THE COMPONENT OF A VECTOR IN THE ROTATED FRAME, THEN THE COMPONENTS OF THE SAME 012692,000322: # X Y Z 012693,000323: # VECTOR IN THE ORIGINAL S/C AXES (B , B , B ) ARE 012694,000324: # X Y Z 012695,000325: 012696,000326: # (B ) (A ) 012697,000327: # ( X) ( X) 012698,000328: # ( ) * ( ) 012699,000329: # (B ) = DEL (A ) 012700,000330: # ( Y) ( Y) 012701,000331: # ( ) ( ) 012702,000332: # (B ) (A ) 012703,000333: # ( Z) ( Z) 012704,000334: 012705,000335: # THE ROUTINE WILL STORE THIS MATRIX (SCALED UNITY) IN SEQUENTIAL LOCATIONS OF ERASABLE MEMORY BEGINNING WITH 012706,000336: # - 012707,000337: # THE LOCATION CALLED DEL. IN ORDER TO USE THE ROUTINE, THE CALLING PROGRAM MUST FIRST STORE U (A HALF UNIT 012708,000338: # DOUBLE PRECISION VECTOR) IN THE SET OF ERASABLE LOCATIONS BEGINNING WITH THE ADDRESS CALLED COF. THE ANGLE, A, 012709,000339: # MUST THEN BE LOADED INTO D(MPAC). 012710,000340: 012711,000341: # INTERNALLY, THE PROGRAM ALSO USES THE FIRST 10 LOCATIONS OF THE PUSH DOWN LIST. 012712,000342: 012713,000343: 012714,000344: 012715,000345: # READCDUK 012716,000346: # -------- 012717,000347: 012718,000348: # THIS BASIC LANGUAGE SUBROUTINE LOADS T(MPAC) WITH THE THREE CDU ANGLES. 012719,000349: 012720,000350: 012721,000351: 012722,000352: # SIGNMPAC 012723,000353: # -------- 012724,000354: 012725,000355: # THIS IS A BASIC LANGUAGE SUBROUTINE WHICH LIMITS THE MAGNITUDE OF D(MPAC) TO + OR - DPOSMAX ON OVERFLOW. 012726,000356: 012727,000357: 012728,000358: 012729,000359: # PROGRAM STORAGE ALLOCATION 012730,000360: 012731,000361: # 1) FIXED MEMORY 1059 WORDS 012732,000362: # 2) ERASABLE MEMORY 98 012733,000363: # 3) STATE SWITCHES 3 012734,000364: # 4) FLAGS 1 012735,000365: 012736,000366: 012737,000367: # JOB PRIORITIES 012738,000368: 012739,000369: # 1) KALCMANU TBD 012740,000370: # 2) ONE SECOND UPDATE TBD 012741,000371: 012742,000372: 012743,000373: # SUMMARY OF STATE SWITCHES AND FLAGWORDS USED BY KALCMANU. 012744,000374: 012745,000375: # STATE FLAGWRD 2 SETTING MEANING 012746,000376: # SWITCH NO. BIT NO. 012747,000377: 012748,000378: # * 012749,000379: # 31 14 0 MANEUVER WENT THROUGH GIMBAL LOCK 012750,000380: # 1 MANEUVER DID NOT GO THROUGH GIMBAL LOCK 012751,000381: # * 012752,000382: # 32 13 0 CONTINUE UPDATE PROCESS 012753,000383: # 1 START UPDATE PROCESS 012754,000384: 012755,000385: # 33 12 0 PERFORM FINAL P-AXIS YAW IF REQUIRED 012756,000386: # 1 IGNORE ANY FINAL P-AXIS YAW 012757,000387: 012758,000388: # 34 11 0 SIGNAL END OF KALCMANU 012759,000389: # 1 KALCMANU IN PROCESS USER MUST SET SWITCH BEFORE INITIATING 012760,000390: 012761,000391: 012762,000392: # * INTERNAL TO KALCMANU 012763,000393: 012764,000394: 012765,000395: # SUGGESTIONS FOR PROGRAM INTEGRATION 012766,000396: 012767,000397: # THE FOLLOWING VARIABLES SHOULD BE ASSIGNED TO UNSWITCH ERASABLE 012768,000398: 012769,000399: # CPHI 012770,000400: # CTHETA 012771,000401: # CPSI 012772,000402: # POINTVSM +5 012773,000403: # SCAXIS +5 012774,000404: # DELDCDU 012775,000405: # DELDCDU1 012776,000406: # DELDCDU2 012777,000407: # RATEINDX 012778,000408: 012779,000409: # THE FOLLOWING SUBROUTINES MAY BE PUT IN A DIFFERENT BANK 012780,000410: 012781,000411: # MXM3 012782,000412: # TRANSPOS 012783,000413: # SIGNMPAC 012784,000414: # READCDUK 012785,000415: # CDUTODCM 012786,000416: 012787,000417: 15,2000 BANK 15 012788,000418: 22,2000 SETLOC KALCMON1 012789,000419: 22,2000 BANK 012790,000420: 012791,000421: 22,2000 E6,1673 EBANK= BCDU 012792,000422: 012793,000423: # THE THREE DESIRED CDU ANGLES MUST BE STORED AS SINGLE PRECISION TWOS COMPLEMENT ANGLES IN THE THREE SUCCESSIVE 012794,000424: # LOCATIONS, CPHI, CTHETA, CPSI. 012795,000425: 012796,000426: 22,2000 COUNT* $$/KALC 012797,000427: 22,2000 06014 KALCMAN3 TC INTPRET # PICK UP THE CURRENT CDU ANGLES AND 012798,000428: 22,2001 77634 RTB # COMPUTE THE MATRIX FROM INITIAL S/C 012799,000429: 22,2002 44377 READCDUK # AXES TO FINAL S/C AXES 012800,000430: 22,2003 03274 STORE BCDU # STORE INITIAL S/C ANGLES 012801,000431: 22,2004 51535 SLOAD ABS # CHECK THE MAGNITUDE OF THE DESIRED 012802,000432: 22,2005 01211 CPSI # MIDDLE GIMBAL ANGLE 012803,000433: 22,2006 51025 DSU BPL 012804,000434: 22,2007 04377 LOCKANGL # IF GREATER THAN 70 DEG ABORT MANEUVER 012805,000435: 22,2010 44720 TOOBADF 012806,000436: 22,2011 72364 AXC,2 TLOAD 012807,000437: 22,2012 03243 MIS 012808,000438: 22,2013 03274 BCDU 012809,000439: 22,2014 77624 CALL # COMPUTE THE TRANSFORMATION FROM INITIAL 012810,000440: 22,2015 44404 CDUTODCM # S/C AXES TO STABLE MEMBER AXES 012811,000441: 22,2016 72364 AXC,2 TLOAD 012812,000442: 22,2017 02236 MFS # PREPARE TO CALCULATE ARRAY MFS 012813,000443: 22,2020 01207 CPHI 012814,000444: 22,2021 77624 CALL 012815,000445: 22,2022 44404 CDUTODCM 012816,000446: 22,2023 45160 SECAD AXC,1 CALL # MIS AND MFS ARRAYS CALCULATED $2 012817,000447: 22,2024 03243 MIS 012818,000448: 22,2025 44322 TRANSPOS 012819,000449: 22,2026 45575 VLOAD STADR 012820,000450: 22,2027 50462 STOVL TMIS +12D 012821,000451: 22,2030 77626 STADR 012822,000452: 22,2031 50470 STOVL TMIS +6 012823,000453: 22,2032 77626 STADR 012824,000454: 22,2033 74476 STORE TMIS # TMIS = TRANSPOSE(MIS) SCALED BY 2 012825,000455: 22,2034 75160 AXC,1 AXC,2 012826,000456: 22,2035 03300 TMIS 012827,000457: 22,2036 02236 MFS 012828,000458: 22,2037 77624 CALL 012829,000459: 22,2040 44306 MXM3 012830,000460: 22,2041 45575 VLOAD STADR 012831,000461: 22,2042 51524 STOVL MFI +12D 012832,000462: 22,2043 77626 STADR 012833,000463: 22,2044 51532 STOVL MFI +6 012834,000464: 22,2045 77626 STADR 012835,000465: 22,2046 75540 STORE MFI # MFI = TMIS MFS (SCALED BY 4) 012836,000466: 22,2047 45001 SETPD CALL # TRANSPOSE MFI IN PD LIST 012837,000467: 22,2050 00023 18D 012838,000468: 22,2051 44331 TRNSPSPD 012839,000469: 22,2052 45575 VLOAD STADR 012840,000470: 22,2053 50462 STOVL TMFI +12D 012841,000471: 22,2054 77626 STADR 012842,000472: 22,2055 50470 STOVL TMFI +6 012843,000473: 22,2056 77626 STADR 012844,000474: 22,2057 74476 STORE TMFI # TMFI = TRANSPOSE (MFI) SCALED BY 4 012845,000475: # 012846,000476: # CALCULATE COFSKEW AND MFISYM 012847,000477: 012848,000478: 22,2060 45345 DLOAD DSU 012849,000479: 22,2061 03303 TMFI +2 012850,000480: 22,2062 02241 MFI +2 012851,000481: 22,2063 45325 PDDL DSU # CALCULATE COF SCALED BY 2/SIN(AM) 012852,000482: 22,2064 02243 MFI +4 012853,000483: 22,2065 03305 TMFI +4 012854,000484: 22,2066 45325 PDDL DSU 012855,000485: 22,2067 03313 TMFI +10D 012856,000486: 22,2070 02251 MFI +10D 012857,000487: 22,2071 77666 VDEF 012858,000488: 22,2072 03323 STORE COFSKEW # EQUALS MFISKEW 012859,000489: # 012860,000490: # CALCULATE AM AND PROCEED ACCORDING TO ITS MAGNITUDE 012861,000491: 012862,000492: 22,2073 43345 DLOAD DAD 012863,000493: 22,2074 02237 MFI 012864,000494: 22,2075 02257 MFI +16D 012865,000495: 22,2076 43225 DSU DAD 012866,000496: 22,2077 06223 DP1/4TH 012867,000497: 22,2100 02247 MFI +8D 012868,000498: 22,2101 03331 STORE CAM # CAM = (MFI0+MFI4+MFI8-1)/2 HALF SCALE 012869,000499: 22,2102 77726 ARCCOS 012870,000500: 22,2103 03333 STORE AM # AM=ARCCOS(CAM) (AM SCALED BY 2) 012871,000501: 22,2104 51025 DSU BPL 012872,000502: 22,2105 04357 MINANG 012873,000503: 22,2106 44113 CHECKMAX 012874,000504: 22,2107 77751 TLOAD # MANEUVER LESS THAN .25 DEGREES 012875,000505: 22,2110 01207 CPHI # GO DIRECTLY INTO ATTITUDE HOLD 012876,000506: 22,2111 37233 STCALL CDUXD # ABOUT COMMANDED ANGLES 012877,000507: 22,2112 44736 TOOBADI # STOP RATE AND EXIT 012878,000508: 012879,000509: 22,2113 45345 CHECKMAX DLOAD DSU 012880,000510: 22,2114 03333 AM 012881,000511: 22,2115 04361 MAXANG 012882,000512: 22,2116 77244 BPL VLOAD 012883,000513: 22,2117 44125 ALTCALC # UNIT 012884,000514: 22,2120 03323 COFSKEW # COFSKEW 012885,000515: 22,2121 77656 UNIT 012886,000516: 22,2122 03266 STORE COF # COF IS THE MANEUVER AXIS 012887,000517: 22,2123 77650 GOTO # SEE IF MANEUVER GOES THRU GIMBAL LOCK 012888,000518: 22,2124 44740 LOCSKIRT 012889,000519: 22,2125 53375 ALTCALC VLOAD VAD # IF AM GREATER THAN 170 DEGREES 012890,000520: 22,2126 02237 MFI 012891,000521: 22,2127 03301 TMFI 012892,000522: 22,2130 77762 VSR1 012893,000523: 22,2131 27301 STOVL MFISYM 012894,000524: 22,2132 02245 MFI +6 012895,000525: 22,2133 74455 VAD VSR1 012896,000526: 22,2134 03307 TMFI +6 012897,000527: 22,2135 27307 STOVL MFISYM +6 012898,000528: 22,2136 02253 MFI +12D 012899,000529: 22,2137 74455 VAD VSR1 012900,000530: 22,2140 03315 TMFI +12D 012901,000531: 22,2141 03315 STORE MFISYM +12D # MFISYM=(MFI+TMFI)/2 SCALED BY 4 012902,000532: 012903,000533: 012904,000534: # CALCULATE COF 012905,000535: 012906,000536: 012907,000537: 22,2142 70545 DLOAD SR1 012908,000538: 22,2143 03331 CAM 012909,000539: 22,2144 45325 PDDL DSU # PDO CAM $4 012910,000540: 22,2145 06231 DPHALF 012911,000541: 22,2146 03331 CAM 012912,000542: 22,2147 65204 BOVB PDDL # PD2 1 - CAM $2 012913,000543: 22,2150 21656 SIGNMPAC 012914,000544: 22,2151 03321 MFISYM +16D 012915,000545: 22,2152 56225 DSU DDV 012916,000546: 22,2153 00001 0 012917,000547: 22,2154 00003 2 012918,000548: 22,2155 65366 SQRT PDDL # COFZ = SQRT(MFISYM8-CAM)/1-CAM) 012919,000549: 22,2156 03311 MFISYM +8D # $ ROOT 2 012920,000550: 22,2157 56225 DSU DDV 012921,000551: 22,2160 00001 0 012922,000552: 22,2161 00003 2 012923,000553: 22,2162 65366 SQRT PDDL # COFY = SQRT(MFISYM4-CAM)/(1-CAM) $ROOT2 012924,000554: 22,2163 03301 MFISYM 012925,000555: 22,2164 56225 DSU DDV 012926,000556: 22,2165 00001 0 012927,000557: 22,2166 00003 2 012928,000558: 22,2167 55566 SQRT VDEF # COFX = SQRT(MFISYM-CAM)/(1-CAM) $ROOT 2 012929,000559: 22,2170 77656 UNIT 012930,000560: 22,2171 03266 STORE COF 012931,000561: # 012932,000562: # DETERMINE LARGEST COF AND ADJUST ACCORDINGLY 012933,000563: 012934,000564: 22,2172 45345 COFMAXGO DLOAD DSU 012935,000565: 22,2173 03266 COF 012936,000566: 22,2174 03270 COF +2 012937,000567: 22,2175 71240 BMN DLOAD # COFY G COFX 012938,000568: 22,2176 44205 COMP12 012939,000569: 22,2177 03266 COF 012940,000570: 22,2200 50025 DSU BMN 012941,000571: 22,2201 03272 COF +4 012942,000572: 22,2202 44262 METHOD3 # COFZ G COFX OR COFY 012943,000573: 22,2203 77650 GOTO 012944,000574: 22,2204 44236 METHOD1 # COFX G COFY OR COFZ 012945,000575: 22,2205 45345 COMP12 DLOAD DSU 012946,000576: 22,2206 03270 COF +2 012947,000577: 22,2207 03272 COF +4 012948,000578: 22,2210 77640 BMN 012949,000579: 22,2211 44262 METHOD3 # COFZ G COFY OR COFX 012950,000580: 012951,000581: 22,2212 51145 METHOD2 DLOAD BPL # COFY MAX 012952,000582: 22,2213 03325 COFSKEW +2 # UY 012953,000583: 22,2214 44220 U2POS 012954,000584: 22,2215 57575 VLOAD VCOMP 012955,000585: 22,2216 03266 COF 012956,000586: 22,2217 03266 STORE COF 012957,000587: 22,2220 51145 U2POS DLOAD BPL 012958,000588: 22,2221 03303 MFISYM +2 # UX UY 012959,000589: 22,2222 44226 OKU21 012960,000590: 22,2223 57545 DLOAD DCOMP # SIGN OF UX OPPOSITE TO UY 012961,000591: 22,2224 03266 COF 012962,000592: 22,2225 03266 STORE COF 012963,000593: 22,2226 51145 OKU21 DLOAD BPL 012964,000594: 22,2227 03313 MFISYM +10D # UY UZ 012965,000595: 22,2230 44740 LOCSKIRT 012966,000596: 22,2231 57545 DLOAD DCOMP # SIGN OF UZ OPPOSITE TO UY 012967,000597: 22,2232 03272 COF +4 012968,000598: 22,2233 03272 STORE COF +4 012969,000599: 22,2234 77650 GOTO 012970,000600: 22,2235 44740 LOCSKIRT 012971,000601: 22,2236 51145 METHOD1 DLOAD BPL # COFX MAX 012972,000602: 22,2237 03323 COFSKEW # UX 012973,000603: 22,2240 44244 U1POS 012974,000604: 22,2241 57575 VLOAD VCOMP 012975,000605: 22,2242 03266 COF 012976,000606: 22,2243 03266 STORE COF 012977,000607: 22,2244 51145 U1POS DLOAD BPL 012978,000608: 22,2245 03303 MFISYM +2 # UX UY 012979,000609: 22,2246 44252 OKU12 012980,000610: 22,2247 57545 DLOAD DCOMP 012981,000611: 22,2250 03270 COF +2 # SIGN OF UY OPPOSITE TO UX 012982,000612: 22,2251 03270 STORE COF +2 012983,000613: 22,2252 51145 OKU12 DLOAD BPL 012984,000614: 22,2253 03305 MFISYM +4 # UX UZ 012985,000615: 22,2254 44740 LOCSKIRT 012986,000616: 22,2255 57545 DLOAD DCOMP # SIGN OF UZ OPPOSITE TO UY 012987,000617: 22,2256 03272 COF +4 012988,000618: 22,2257 03272 STORE COF +4 012989,000619: 22,2260 77650 GOTO 012990,000620: 22,2261 44740 LOCSKIRT 012991,000621: 22,2262 51145 METHOD3 DLOAD BPL # COFZ MAX 012992,000622: 22,2263 03327 COFSKEW +4 # UZ 012993,000623: 22,2264 44270 U3POS 012994,000624: 22,2265 57575 VLOAD VCOMP 012995,000625: 22,2266 03266 COF 012996,000626: 22,2267 03266 STORE COF 012997,000627: 22,2270 51145 U3POS DLOAD BPL 012998,000628: 22,2271 03305 MFISYM +4 # UX UZ 012999,000629: 22,2272 44276 OKU31 013000,000630: 22,2273 57545 DLOAD DCOMP 013001,000631: 22,2274 03266 COF # SIGN OF UX OPPOSITE TO UZ 013002,000632: 22,2275 03266 STORE COF 013003,000633: 22,2276 51145 OKU31 DLOAD BPL 013004,000634: 22,2277 03313 MFISYM +10D # UY UZ 013005,000635: 22,2300 44740 LOCSKIRT 013006,000636: 22,2301 57545 DLOAD DCOMP 013007,000637: 22,2302 03270 COF +2 # SIGN OF UY OPPOSITE TO UZ 013008,000638: 22,2303 03270 STORE COF +2 013009,000639: 22,2304 77650 GOTO 013010,000640: 22,2305 44740 LOCSKIRT 013011,000641: # MATRIX OPERATIONS 013012,000642: 013013,000643: 13,2161 BANK 13 013014,000644: 22,2000 SETLOC KALCMON2 013015,000645: 22,2000 BANK 013016,000646: 013017,000647: 22,2306 E6,1673 EBANK= BCDU 013018,000648: 013019,000649: 22,2306 76601 MXM3 SETPD VLOAD* # MXM3 MULTIPLIES 2 3X3 MATRICES 013020,000650: 22,2307 00001 0 # AND LEAVES RESULT IN PD LIST 013021,000651: 22,2310 00001 0,1 # AND MPAC 013022,000652: 22,2311 62703 VXM* PDVL* 013023,000653: 22,2312 77776 0,2 013024,000654: 22,2313 00007 6,1 013025,000655: 22,2314 62703 VXM* PDVL* 013026,000656: 22,2315 77776 0,2 013027,000657: 22,2316 00015 12D,1 013028,000658: 22,2317 41503 VXM* PUSH 013029,000659: 22,2320 77776 0,2 013030,000660: 22,2321 77616 RVQ 013031,000661: 013032,000662: 013033,000663: # RETURN WITH M1XM2 IN PD LIST 013034,000664: 013035,000665: 22,2322 76601 TRANSPOS SETPD VLOAD* # TRANSPOS TRANSPOSES A 3X3 MATRIX 013036,000666: 22,2323 00001 0 # AND LEAVES RESULT IN PD LIST 013037,000667: 22,2324 00001 0,1 # MATRIX ADDRESS IN XR1 013038,000668: 22,2325 62713 PDVL* PDVL* 013039,000669: 22,2326 00007 6,1 013040,000670: 22,2327 00015 12D,1 013041,000671: 22,2330 77606 PUSH # MATRIX IN PD 013042,000672: 22,2331 77776 TRNSPSPD EXIT # ENTER WITH MATRIX AT 0 IN PD LIST 013043,000673: 22,2332 50120 INDEX FIXLOC 013044,000674: 22,2333 52013 DXCH 12 013045,000675: 22,2334 50120 INDEX FIXLOC 013046,000676: 22,2335 52017 DXCH 16 013047,000677: 22,2336 50120 INDEX FIXLOC 013048,000678: 22,2337 52013 DXCH 12 013049,000679: 22,2340 50120 INDEX FIXLOC 013050,000680: 22,2341 52015 DXCH 14 013051,000681: 22,2342 50120 INDEX FIXLOC 013052,000682: 22,2343 52005 DXCH 4 013053,000683: 22,2344 50120 INDEX FIXLOC 013054,000684: 22,2345 52015 DXCH 14 013055,000685: 22,2346 50120 INDEX FIXLOC 013056,000686: 22,2347 52003 DXCH 2 013057,000687: 22,2350 50120 INDEX FIXLOC 013058,000688: 22,2351 52007 DXCH 6 013059,000689: 22,2352 50120 INDEX FIXLOC 013060,000690: 22,2353 52003 DXCH 2 013061,000691: 22,2354 06014 TC INTPRET 013062,000692: 22,2355 77616 RVQ 013063,000693: 013064,000694: 15,2000 BANK 15 013065,000695: 22,2000 SETLOC KALCMON1 013066,000696: 22,2000 BANK 013067,000697: 013068,000698: 22,2356 E6,1673 EBANK= BCDU 013069,000699: 013070,000700: 22,2356 00013 13563 MINANG 2DEC 0.00069375 013071,000701: 013072,000702: 22,2360 17070 34343 MAXANG 2DEC 0.472222222 013073,000703: 013074,000704: # GIMBAL LOCK CONSTANTS 013075,000705: 013076,000706: # D = MGA CORRESPONDING TO GIMBAL LOCK = 60 DEGREES 013077,000707: # NGL = BUFFER ANGLE (TO AVOID DIVISIONS BY ZERO) = 2 DEGREES 013078,000708: 013079,000709: 22,2362 15666 20443 SD 2DEC .433015 # = SIN(D) $2 013080,000710: 013081,000711: 22,2364 33555 01106 K3S1 2DEC .86603 # = SIN(D) $1 013082,000712: 013083,000713: 22,2366 67777 77777 K4 2DEC -.25 # = -COS(D) $2 013084,000714: 013085,000715: 22,2370 04000 00000 K4SQ 2DEC .125 # = COS(D)COS(D) $2 013086,000716: 013087,000717: 22,2372 00216 36323 SNGLCD 2DEC .008725 # = SIN(NGL)COS(D) $2 013088,000718: 013089,000719: 22,2374 17773 00057 CNGL 2DEC .499695 # COS(NGL) $2 013090,000720: 013091,000721: 22,2376 14344 LOCKANGL DEC .388889 # = 70 DEGREES 013092,000722: # INTERPRETIVE SUBROUTINE TO READ THE CDU ANGLES 013093,000723: 013094,000724: 22,2377 30034 READCDUK CA CDUZ # LOAD T(MPAC) WITH CDU ANGLES 013095,000725: 22,2400 54156 TS MPAC +2 013096,000726: 22,2401 00006 EXTEND 013097,000727: 22,2402 30033 DCA CDUX # AND CHANGE MODE TO TRIPLE PRECISION 013098,000728: 22,2403 16452 TCF TLOAD +6 013099,000729: 013100,000730: 22,2404 66370 CDUTODCM AXT,1 SSP 013101,000731: 22,2405 00003 OCT 3 013102,000732: 22,2406 00051 S1 013103,000733: 22,2407 00001 OCT 1 # SET XR1, S1, AND PD FOR LOOP 013104,000734: 22,2410 00010 STORE 7 013105,000735: 22,2411 77601 SETPD 013106,000736: 22,2412 00001 0 013107,000737: 22,2413 47133 LOOPSIN SLOAD* RTB 013108,000738: 22,2414 00013 10D,1 013109,000739: 22,2415 21457 CDULOGIC 013110,000740: 22,2416 00013 STORE 10D # LOAD PD WITH 0 SIN(PHI) 013111,000741: 22,2417 65356 SIN PDDL # 2 COS(PHI) 013112,000742: 22,2420 00013 10D # 4 SIN(THETA) 013113,000743: 22,2421 41546 COS PUSH # 6 COS(THETA) 013114,000744: 22,2422 71300 TIX,1 DLOAD # 8 SIN(PSI) 013115,000745: 22,2423 44413 LOOPSIN # 10 COS(PSI) 013116,000746: 22,2424 00007 6 013117,000747: 22,2425 72405 DMP SL1 013118,000748: 22,2426 00013 10D 013119,000749: 22,2427 10001 STORE 0,2 # C0=COS(THETA)COS(PSI) 013120,000750: 22,2430 41345 DLOAD DMP 013121,000751: 22,2431 00005 4 013122,000752: 22,2432 00001 0 013123,000753: 22,2433 41325 PDDL DMP # (PD6 SIN(THETA)SIN(PHI)) 013124,000754: 22,2434 00007 6 013125,000755: 22,2435 00011 8D 013126,000756: 22,2436 72405 DMP SL1 013127,000757: 22,2437 00003 2 013128,000758: 22,2440 72421 BDSU SL1 013129,000759: 22,2441 00015 12D 013130,000760: 22,2442 10003 STORE 2,2 # C1=-COS(THETA)SIN(PSI)COS(PHI) 013131,000761: 22,2443 41345 DLOAD DMP 013132,000762: 22,2444 00003 2 013133,000763: 22,2445 00005 4 013134,000764: 22,2446 41325 PDDL DMP # (PD7 COS(PHI)SIN(THETA)) SCALED 4 013135,000765: 22,2447 00007 6 013136,000766: 22,2450 00011 8D 013137,000767: 22,2451 72405 DMP SL1 013138,000768: 22,2452 00001 0 013139,000769: 22,2453 72415 DAD SL1 013140,000770: 22,2454 00017 14D 013141,000771: 22,2455 10005 STORE 4,2 # C2=COS(THETA)SIN(PSI)SIN(PHI) 013142,000772: 22,2456 77745 DLOAD 013143,000773: 22,2457 00011 8D 013144,000774: 22,2460 10007 STORE 6,2 # C3=SIN(PSI) 013145,000775: 22,2461 77745 DLOAD 013146,000776: 22,2462 00013 10D 013147,000777: 22,2463 72405 DMP SL1 013148,000778: 22,2464 00003 2 013149,000779: 22,2465 10011 STORE 8D,2 # C4=COS(PSI)COS(PHI) 013150,000780: 22,2466 41345 DLOAD DMP 013151,000781: 22,2467 00013 10D 013152,000782: 22,2470 00001 0 013153,000783: 22,2471 72476 DCOMP SL1 013154,000784: 22,2472 10013 STORE 10D,2 # C5=-COS(PSI)SIN(PHI) 013155,000785: 22,2473 41345 DLOAD DMP 013156,000786: 22,2474 00005 4 013157,000787: 22,2475 00013 10D 013158,000788: 22,2476 72476 DCOMP SL1 013159,000789: 22,2477 10015 STORE 12D,2 # C6=-SIN(THETA)COS(PSI) 013160,000790: 22,2500 77745 DLOAD 013161,000791: 22,2501 72405 DMP SL1 # (PUSH UP 7) 013162,000792: 22,2502 00011 8D 013163,000793: 22,2503 41325 PDDL DMP # (PD7 COS(PHI)SIN(THETA)SIN(PSI)) SCALE4 013164,000794: 22,2504 00007 6 013165,000795: 22,2505 00001 0 013166,000796: 22,2506 72415 DAD SL1 # (PUSH UP 7) 013167,000797: 22,2507 77626 STADR # C7=COS(PHI)SIN(THETA)SIN(PSI) 013168,000798: 22,2510 67760 STORE 14D,2 # +COS(THETA)SIN(PHI) 013169,000799: 22,2511 77745 DLOAD 013170,000800: 22,2512 72405 DMP SL1 # (PUSH UP 6) 013171,000801: 22,2513 00011 8D 013172,000802: 22,2514 41325 PDDL DMP # (PD6 SIN(THETA)SIN(PHI)SIN(PSI)) SCALE4 013173,000803: 22,2515 00007 6 013174,000804: 22,2516 00003 2 013175,000805: 22,2517 72425 DSU SL1 # (PUSH UP 6) 013176,000806: 22,2520 77626 STADR 013177,000807: 22,2521 67756 STORE 16D,2 # C8=-SIN(THETA)SIN(PHI)SIN(PSI) 013178,000808: 22,2522 77616 RVQ # +COS(THETA)COS(PHI) 013179,000809: 013180,000810: # CALCULATION OF THE MATRIX DEL...... 013181,000811: 013182,000812: # * * --T * 013183,000813: # DEL = (IDMATRIX)COS(A)+UU (1-COS(A))+UX SIN(A) SCALED 1 013184,000814: 013185,000815: # - 013186,000816: # WHERE U IS A UNIT VECTOR (DP SCALED 2) ALONG THE AXIS OF ROTATION. 013187,000817: # A IS THE ANGLE OF ROTATION (DP SCALED 2) 013188,000818: # - 013189,000819: # UPON ENTRY THE STARTING ADDRESS OF U IS COF, AND A IS IN MPAC 013190,000820: 013191,000821: 22,2523 41401 DELCOMP SETPD PUSH # MPAC CONTAINS THE ANGLE A 013192,000822: 22,2524 00001 0 013193,000823: 22,2525 65356 SIN PDDL # PD0 = SIN(A) 013194,000824: 22,2526 41546 COS PUSH # PD2 = COS(A) 013195,000825: 22,2527 65302 SR2 PDDL # PD2 = COS(A) $8 013196,000826: 22,2530 41021 BDSU BOVB 013197,000827: 22,2531 06231 DPHALF 013198,000828: 22,2532 21656 SIGNMPAC 013199,000829: 22,2533 77725 PDDL # PD4 = 1-COS(A) 013200,000830: 013201,000831: # COMPUTE THE DIAGONAL COMPONENTS OF DEL 013202,000832: 013203,000833: 22,2534 03266 COF 013204,000834: 22,2535 41316 DSQ DMP 013205,000835: 22,2536 00005 4 013206,000836: 22,2537 52415 DAD SL3 013207,000837: 22,2540 00003 2 013208,000838: 22,2541 77604 BOVB 013209,000839: 22,2542 21656 SIGNMPAC 013210,000840: 22,2543 16237 STODL KEL # UX UX(1-COS(A)) +COS(A) $1 013211,000841: 22,2544 03270 COF +2 013212,000842: 22,2545 41316 DSQ DMP 013213,000843: 22,2546 00005 4 013214,000844: 22,2547 52415 DAD SL3 013215,000845: 22,2550 00003 2 013216,000846: 22,2551 77604 BOVB 013217,000847: 22,2552 21656 SIGNMPAC 013218,000848: 22,2553 16247 STODL KEL +8D # UY UY(1-COS(A)) +COS(A) $1 013219,000849: 22,2554 03272 COF +4 013220,000850: 22,2555 41316 DSQ DMP 013221,000851: 22,2556 00005 4 013222,000852: 22,2557 52415 DAD SL3 013223,000853: 22,2560 00003 2 013224,000854: 22,2561 77604 BOVB 013225,000855: 22,2562 21656 SIGNMPAC 013226,000856: 22,2563 02257 STORE KEL +16D # UZ UZ(1-COS(A)) +COS(A) $1 013227,000857: 013228,000858: # COMPUTE THE OFF DIAGONAL TERMS OF DEL 013229,000859: 013230,000860: 22,2564 41345 DLOAD DMP 013231,000861: 22,2565 03266 COF 013232,000862: 22,2566 03270 COF +2 013233,000863: 22,2567 72405 DMP SL1 013234,000864: 22,2570 00005 4 013235,000865: 22,2571 41325 PDDL DMP # D6 UX UY (1-COS A) $4 013236,000866: 22,2572 03272 COF +4 013237,000867: 22,2573 00001 0 013238,000868: 22,2574 43206 PUSH DAD # D8 UZ SIN A $4 013239,000869: 22,2575 00007 6 013240,000870: 22,2576 41112 SL2 BOVB 013241,000871: 22,2577 21656 SIGNMPAC 013242,000872: 22,2600 16245 STODL KEL +6 013243,000873: 22,2601 62421 BDSU SL2 013244,000874: 22,2602 77604 BOVB 013245,000875: 22,2603 21656 SIGNMPAC 013246,000876: 22,2604 16241 STODL KEL +2 013247,000877: 22,2605 03266 COF 013248,000878: 22,2606 41205 DMP DMP 013249,000879: 22,2607 03272 COF +4 013250,000880: 22,2610 00005 4 013251,000881: 22,2611 65352 SL1 PDDL # D6 UX UZ (1-COS A) $4 013252,000882: 22,2612 03270 COF +2 013253,000883: 22,2613 41405 DMP PUSH # D8 UY SIN(A) 013254,000884: 22,2614 00001 0 013255,000885: 22,2615 62415 DAD SL2 013256,000886: 22,2616 00007 6 013257,000887: 22,2617 77604 BOVB 013258,000888: 22,2620 21656 SIGNMPAC 013259,000889: 22,2621 16243 STODL KEL +4 # UX UZ (1-COS(A))+UY SIN(A) 013260,000890: 22,2622 62421 BDSU SL2 013261,000891: 22,2623 77604 BOVB 013262,000892: 22,2624 21656 SIGNMPAC 013263,000893: 22,2625 16253 STODL KEL +12D # UX UZ (1-COS(A))-UY SIN(A) 013264,000894: 22,2626 03270 COF +2 013265,000895: 22,2627 41205 DMP DMP 013266,000896: 22,2630 03272 COF +4 013267,000897: 22,2631 00005 4 013268,000898: 22,2632 65352 SL1 PDDL # D6 UY UZ (1-COS(A)) $ 4 013269,000899: 22,2633 03266 COF 013270,000900: 22,2634 41405 DMP PUSH # D8 UX SIN(A) 013271,000901: 22,2635 00001 0 013272,000902: 22,2636 62415 DAD SL2 013273,000903: 22,2637 00007 6 013274,000904: 22,2640 77604 BOVB 013275,000905: 22,2641 21656 SIGNMPAC 013276,000906: 22,2642 16255 STODL KEL +14D # UY UZ(1-COS(A)) +UX SIN(A) 013277,000907: 22,2643 62421 BDSU SL2 013278,000908: 22,2644 77604 BOVB 013279,000909: 22,2645 21656 SIGNMPAC 013280,000910: 22,2646 02251 STORE KEL +10D # UY UZ (1-COS(A)) -UX SIN(A) 013281,000911: 22,2647 77616 RVQ 013282,000912: 013283,000913: 013284,000914: # DIRECTION COSINE MATRIX TO CDU ANGLE ROUTINE 013285,000915: # X1 CONTAINS THE COMPLEMENT OF THE STARTING ADDRESS FOR MATRIX (SCALED 2) 013286,000916: # LEAVES CDU ANGLES SCALED 2PI IN V(MPAC) 013287,000917: # COS(MGA) WILL BE LEFT IN S1 (SCALED 1) 013288,000918: 013289,000919: # THE DIRECTION COSINE MATRIX RELATING S/C AXES TO STABLE MEMBER AXES CAN BE WRITTEN AS*** 013290,000920: 013291,000921: # C =COS(THETA)COS(PSI) 013292,000922: # 0 013293,000923: # C =-COS(THETA)SIN(PSI)COS(PHI)+SI (THETA)SIN(PHI) 013294,000924: # 1 013295,000925: # C =COS(THETA)SIN(PSI)SIN(PHI) + S N(THETA)COS(PHI) 013296,000926: # 2 013297,000927: # C =SIN(PSI) 013298,000928: # 3 013299,000929: # C =COS(PSI)COS(PHI) 013300,000930: # 4 013301,000931: # C =-COS(PSI)SIN(PHI) 013302,000932: # 5 013303,000933: # C =-SIN(THETA)COS(PSI) 013304,000934: # 6 013305,000935: # C =SIN(THETA)SIN(PSI)COS(PHI)+COS THETA)SIN(PHI) 013306,000936: # 7 013307,000937: # C =-SIN(THETA)SIN(PSI)SIN(PHI)+CO (THETA)COS(PHI) 013308,000938: # 8 013309,000939: # WHERE PHI = OGA 013310,000940: # THETA = IGA 013311,000941: # PSI = MGA 013312,000942: 013313,000943: 22,2650 67543 DCMTOCDU DLOAD* ARCSIN 013314,000944: 22,2651 00007 6,1 013315,000945: 22,2652 71406 PUSH COS # PD +0 PSI 013316,000946: 22,2653 41152 SL1 BOVB 013317,000947: 22,2654 21656 SIGNMPAC 013318,000948: 22,2655 00051 STORE S1 013319,000949: 22,2656 57543 DLOAD* DCOMP 013320,000950: 22,2657 00015 12D,1 013321,000951: 22,2660 67471 DDV ARCSIN 013322,000952: 22,2661 00051 S1 013323,000953: 22,2662 51123 PDDL* BPL # PD +2 THETA 013324,000954: 22,2663 00001 0,1 # MUST CHECK THE SIGN OF COS(THETA) 013325,000955: 22,2664 44676 OKTHETA # TO DETERMINE THE PROPER QUADRANT 013326,000956: 22,2665 57545 DLOAD DCOMP 013327,000957: 22,2666 43244 BPL DAD 013328,000958: 22,2667 44673 SUHALFA 013329,000959: 22,2670 06231 DPHALF 013330,000960: 22,2671 77650 GOTO 013331,000961: 22,2672 44675 CALCPHI 013332,000962: 22,2673 77625 SUHALFA DSU 013333,000963: 22,2674 06231 DPHALF 013334,000964: 22,2675 77606 CALCPHI PUSH 013335,000965: 22,2676 57543 OKTHETA DLOAD* DCOMP 013336,000966: 22,2677 00013 10D,1 013337,000967: 22,2700 67471 DDV ARCSIN 013338,000968: 22,2701 00051 S1 013339,000969: 22,2702 51123 PDDL* BPL # PUSH DOWN PHI 013340,000970: 22,2703 00011 8D,1 013341,000971: 22,2704 44716 OKPHI 013342,000972: 22,2705 57545 DLOAD DCOMP # PUSH UP PHI 013343,000973: 22,2706 43244 BPL DAD 013344,000974: 22,2707 44713 SUHALFAP 013345,000975: 22,2710 06231 DPHALF 013346,000976: 22,2711 77650 GOTO 013347,000977: 22,2712 44717 VECOFANG 013348,000978: 22,2713 52025 SUHALFAP DSU GOTO 013349,000979: 22,2714 06231 DPHALF 013350,000980: 22,2715 44717 VECOFANG 013351,000981: 22,2716 77745 OKPHI DLOAD # PUSH UP PHI 013352,000982: 22,2717 43466 VECOFANG VDEF RVQ 013353,000983: # ROUTINES FOR TERMINATING THE AUTOMATIC MANEUVER AND RETURNING TO USER 013354,000984: 013355,000985: 22,2720 77776 TOOBADF EXIT 013356,000986: 22,2721 05646 TC ALARM 013357,000987: 22,2722 00401 OCT 00401 013358,000988: 013359,000989: 22,2723 12726 TCF NOGO # DO NOT ZERO ATTITUDE ERRORS 013360,000990: 013361,000991: 22,2724 04655 TC BANKCALL 013362,000992: 22,2725 40232 CADR ZATTEROR # ZERO ATTITUDE ERRORS 013363,000993: 013364,000994: 22,2726 04655 NOGO TC BANKCALL 013365,000995: 22,2727 40244 CADR STOPRATE # STOP RATES 013366,000996: 013367,000997: 22,2730 35025 CAF TWO 013368,000998: 22,2731 00004 INHINT # ALL RETURNS ARE NOW MADE VIA GOODEND 013369,000999: 22,2732 05252 TC WAITLIST 013370,001000: 22,2733 E6,1673 EBANK= BCDU 013371,001001: 22,2733 03230 44066 2CADR GOODMANU 013372,001002: 013373,001003: 22,2735 15225 TCF ENDOFJOB 013374,001004: 013375,001005: 22,2736 77776 TOOBADI EXIT 013376,001006: 22,2737 12726 TCF NOGO End of include-file ATTITUDE_MANEUVER_ROUTINE.agc. Parent file is MAIN.agc