Source Code
![]() |
These source-code files derive from a printout of Luminary 210 (Apollo 15-17
Lunar Module guidance computer program), from the personal library of
original AGC developer Don Eyles, digitally photographed at archive.org,
financially sponsored by Jim Lawton, and transcribed to source code by a
team of volunteers. This colorized, syntax-highlighted form was created
by assembling that transcribed source code. Note that the full page images
are available on the
Virtual AGC project page at archive.org, while reduced-size images
are presented at the VirtualAGC project website. Report or fix any
transcription errors at
the Virtual AGC project code repository. Notations on the program listing read, in part: GAP: ASSEMBLE REVISION 210 OF AGC PROGRAM LUMINARY BY NASA 2021112-161 17:11 MAR. 19,1971Note that the date is the date of the printout, not the date of the program revision. |
015338,000002: ## Copyright: Public domain.
015339,000003: ## Filename: ATTITUDE_MANEUVER_ROUTINE.agc
015340,000004: ## Purpose: A section of Luminary revision 210.
015341,000005: ## It is part of the source code for the Lunar Module's (LM)
015342,000006: ## Apollo Guidance Computer (AGC) for Apollo 15-17.
015343,000007: ## This file is intended to be a faithful transcription, except
015344,000008: ## that the code format has been changed to conform to the
015345,000009: ## requirements of the yaYUL assembler rather than the
015346,000010: ## original YUL assembler.
015347,000011: ## Reference: pp. 354-375
015348,000012: ## Assembler: yaYUL
015349,000013: ## Contact: Ron Burkey <info@sandroid.org>.
015350,000014: ## Website: www.ibiblio.org/apollo/index.html
015351,000015: ## Mod history: 2016-11-17 JL Created from Luminary131 version.
015352,000016: ## 2016-11-24 HG Transcribed
015353,000017: ## 2016-12-23 RSB Proofed comment text with octopus/ProoferComments
015354,000018: ## and fixed all errors found.
015355,000019: ## 2017-03-15 RSB Comment-text fixes identified in 5-way
015356,000020: ## side-by-side diff of Luminary 69/99/116/131/210.
015357,000021:
![]() |
Page 354 |
015359,000023: # BLOCK 2 LGC ATTITUDE MANEUVER ROUTINE-KALCMANU
015360,000024:
015361,000025:
015362,000026: # MOD 2 DATE 5/1/67 BY DON KEENE
015363,000027:
015364,000028: # PROGRAM DESCRIPTION
015365,000029:
015366,000030: # KALCMANU IS A ROUTINE WHICH GENERATES COMMANDS FOR THE LM DAP TO CHANGE THE ATTITUDE OF THE SPACECRAFT
015367,000031: # DURING FREE FALL. IT IS DESIGNED TO MANEUVER THE SPACECRAFT FROM ITS INITIAL ORIENTATION TO SOME DESIRED
015368,000032: # ORIENTATION SPECIFIED BY THE PROGRAM WHICH CALLS KALCMANU, AVOIDING GIMBAL LOCK IN THE PROCESS. IN THE
015369,000033: # MOD 2 VERSION, THIS DESIRED ATTITUDE IS SPECIFIED BY A SET OF THREE COMMANDED CDU ANGLES STORED AS 2S COMPLEMENT
015370,000034: # SINGLE PRECISION ANGLES IN THE THREE CONSECUTIVE LOCATIONS, CPHI, CTHETA, CPSI, WHERE
015371,000035:
015372,000036: # CPHI = COMMANDED OUTER GIMBAL ANGLE
015373,000037: # CTHETA = COMMANDED INNER GIMBAL ANGLE
015374,000038: # CPSI = COMMANDED MIDDLE GIMBAL ANGLE
015375,000039:
015376,000040: # WHEN POINTING A SPACECRAFT AXIS (E.I. X, Y, Z, THE AOT, THRUST AXIS, ETC) THE SUBROUTINE VECPOINT MAY BE
015377,000041: # USED TO GENERATE THIS SET OF DESIRED CDU ANGLES (SEE DESCRIPTION IN R60) -
015378,000042: # WITH THIS INFORMATION KALCMANU DETERMINES THE DIRECTION OF THE SINGLE EQUIVALENT ROTATION (COF ALSO U) AND THE
015379,000043: # MAGNITUDE OF THE ROTATION (AM) TO BRING THE S/C FROM ITS INITIAL ORIENTATION TO ITS FINAL ORIENTATION.
015380,000044: # THIS DIRECTION REMAINS FIXED BOTH IN INERTIAL COORDINATES AND IN COMMANDED S/C AXES THROUGHOUT THE
015381,000045: # -
015382,000046: # MANEUVER. ONCE COF AND AM HAVE BEEN DETERMINED, KALCMANU THEN EXAMINES THE MANEUVER TO SEE IF IT WILL BRING
015383,000047: # -
015384,000048: # THE S/C THROUGH GIMBAL LOCK. IF SO, COF AND AM ARE READJUSTED SO THAT THE S/C WILL JUST SKIM THE GIMBAL
015385,000049: # LOCK ZONE AND ALIGN THE X-AXIS. IN GENERAL A FINAL YAW ABOUT X WILL BE NECESSARY TO COMPLETE THE MANEUVER.
015386,000050: # NEEDLESS TO SAY, NEITHER THE INITIAL NOR THE FINAL ORIENTATION CAN BE IN GIMBAL LOCK.
015387,000051:
015388,000052: # FOR PROPER ATTITUDE CONTROL THE DIGITAL AUTOPILOT MUST BE GIVEN AN ATTITUDE REFERENCE WHICH IT CAN TRACK.
015389,000053: # KALCMANU DOES THIS BY GENERATING A REFERENCE OF DESIRED GIMBAL ANGLES (CDUXD, CDUYD, CDUZD) WHICH ARE UPDATED
015390,000054: # EVERY ONE SECOND DURING THE MANEUVER. TO ACHIEVE A SMOOTHER SEQUENCE OF COMMANDS BETWEEN SUCCESSIVE UPDATES,
015391,000055: # THE PROGRAM ALSO GENERATES A SET OF INCREMENTAL CDU ANGLES (DELDCDU) TO BE ADDED TO CDU DESIRED BY THE DIGITAL
015392,000056: # AUTOPILOT. KALCMANU ALSO CALCULATES THE COMPONENT MANEUVER RATES (OMEGAPD, OMEGAQD, OMEGARD), WHICH CAN
015393,000057: # -
015394,000058: # BE DETERMINED SIMPLY BY MULTIPLYING COF BY SOME SCALAR (ARATE) CORRESPONDING TO THE DESIRED ROTATIONAL RATE.
015395,000059:
015396,000060: # AUTOMATIC MANEUVERS ARE TIMED WITH THE HELP OF WAITLIST SO THAT AFTER A SPECIFIED INTERVAL THE Y AND Z
015397,000061: # DESIRED RATES ARE SET TO ZERO AND THE DESIRED CDU ANGLES (CDUYD, CDUZD) ARE SET EQUAL TO THE FINAL DESIRED CDU
015398,000062: # ANGLES (CTHETA, CPSI). IF ANY YAW REMAINS DUE TO GIMBAL LOCK AVOIDANCE, THE FINAL YAW MANEUVER IS
015399,000063: # CALCULATED AND THE DESIRED YAW RATE SET TO SOME FIXED VALUE (ROLLRATE = + OR - 2 DEGREES PER SEC).
015400,000064: # IN THIS CASE ONLY AN INCREMENTAL CDUX ANGLE (DELFROLL) IS SUPPLIED TO THE DAP. AT THE END OF THE YAW
015401,000065: # MANEUVER OR IN THE EVENT THAT THERE WAS NO FINAL YAW, CDUXD IS SET EQUAL TO CPHI AND THE X-AXIS DESIRED
015402,000066: # RATE SET TO ZERO. THUS, UPON COMPLETION OF THE MANEUVER THE S/C WILL FINISH UP IN A LIMIT CYCLE ABOUT THE
015403,000067: # DESIRED FINAL GIMBAL ANGLES.
015404,000068:
015405,000069:
015406,000070: # PROGRAM LOGIC FLOW
015407,000071:
015408,000072: # KALCMANU IS CALLED AS A HIGH PRIORITY JOB WITH ENTRY POINTS AT KALCMAN3 AND VECPOINT. IT FIRST PICKS
015409,000073: # UP THE CURRENT CDU ANGLES TO BE USED AS THE BASIS FOR ALL COMPUTATIONS INVOLVING THE INITIAL S/C ORIENTATION.
015410,000074:
![]() |
Page 355 |
015412,000076: # IT THEN DETERMINES THE DIRECTION COSINE MATRICES RELATING BOTH THE INITIAL AND FINAL S/C ORIENTATION TO STABLE
015413,000077: # * * *
015414,000078: # MEMBER AXES (MIS, MFS). IT ALSO COMPUTES THE MATRIX RELATING FINAL S/C AXES TO INITIAL S/C AXES (MFI). THE
015415,000079: # ANGLE OF ROTATION (AM) IS THEN EXTRACTED FROM THIS MATRIX, AND TESTS ARE MADE TO DETERMINE IF
015416,000080:
015417,000081: # A) AM LESS THAN .25 DEGREES (MINANG)
015418,000082: # B) AM GREATER THAN 170 DEGREES (MAXANG)
015419,000083:
015420,000084: # IF AM LESS THAN .25 DEGREES, NO COMPLICATED AUTOMATIC MANEUVERING IS NECESSARY. THEREFORE WE CAN SIMPLY
015421,000085: # SET CDU DESIRED EQUAL TO THE FINAL CDU DESIRED ANGLES AND TERMINATE THE JOB.
015422,000086:
015423,000087: # IF AM IS GREATER THAN .25 DEGREES BUT LESS THAN 170 DEGREES, THE AXES OF THE SINGLE EQUIVALENT ROTATION
015424,000088: # - *
015425,000089: # (COF) IS EXTRACTED FROM THE SKEW SYMMETRIC COMPONENTS OF MFI. * *
015426,000090: # IF AM GREATER THAN 170 DEGREES AN ALTERNATE METHOD EMPLOYING THE SYMMETRIC PART OF MFI (MFISYM) IS USED
015427,000091: # -
015428,000092: # TO DETERMINE COF.
015429,000093:
015430,000094: # THE PROGRAM THEN CHECKS TO SEE IF THE MANEUVER AS COMPUTED WILL BRING THE S/C THROUGH GIMBAL LOCK. IF
015431,000095: # SO, A NEW MANEUVER IS CALCULATED WHICH WILL JUST SKIM THE GIMBAL LOCK ZONE AND ALIGN THE S/C X-AXIS. THIS
015432,000096: # METHOD ASSURES THAT THE ADDITIONAL MANEUVERING TO AVOID GIMBAL LOCK WILL BE KEPT TO A MINIMUM. SINCE A FINAL
015433,000097: # P AXIS YAW WILL BE NECESSARY, A SWITCH IS RESET (STATE SWITCH 31) TO ALLOW FOR THE COMPUTATION OF THIS FINAL
015434,000098: # YAW.
015435,000099:
015436,000100: # AS STATED PREVIOUSLY KALCMANU GENERATES A SEQUENCE OF DESIRED GIMBAL ANGLES WHICH ARE UPDATED EVERY
015437,000101: # -
015438,000102: # SECOND. THIS IS ACCOMPLISHED BY A SMALL ROTATION OF THE DESIRED S/C FRAME ABOUT THE VECTOR COF. THE NEW
015439,000103: # DESIRED REFERENCE MATRIX IS THEN,
015440,000104:
015441,000105: # * * *
015442,000106: # MIS = MIS DEL
015443,000107: # N+1 N
015444,000108: # *
015445,000109: # WHERE DEL IS THE MATRIX CORRESPONDING TO THIS SMALL ROTATION. THE NEW CDU ANGLES CAN THEN BE EXTRACTED
015446,000110: # *
015447,000111: # FROM MIS.
015448,000112:
015449,000113: # AT THE BEGINNING OF THE MANEUVER THE AUTOPILOT DESIRED RATES (OMEGAPD, OMEGAQD, OMEGARD) AND THE
015450,000114: # MANEUVER TIMINGS ARE ESTABLISHED. ON THE FIRST PASS AND ON ALL SUBSEQUENT UPDATES THE CDU DESIRED
015451,000115: # ANGLES ARE LOADED WITH THE APPROPRIATE VALUES AND THE INCREMENTAL CDU ANGLES ARE COMPUTED. THE AGC CLOCKS
015452,000116: # (TIME1 AND TIME2) ARE THAN CHECKED TO SEE IF THE MANEUVER WILL TERMINATE BEFORE THE NEXT UPDATE. IF
015453,000117: # NOT, KALCMANU CALLS FOR ANOTHER UPDATE (RUN AS A JOB WITH PRIORITY TBD) IN ONE SECOND. ANY DELAYS IN THIS
015454,000118: # CALLING SEQUENCE ARE AUTOMATICALLY COMPENSATED IN CALLING FOR THE NEXT UPDATE.
015455,000119:
015456,000120: # IF IT IS FOUND THAT THE MANEUVER IS TO TERMINATE BEFORE THE NEXT UPDATE A ROUTINE IS CALLED (AS A WAIT-
015457,000121: # LIST TASK) TO STOP THE MANEUVER AT THE APPROPRIATE TIME AS EXPLAINED ABOVE.
015458,000122:
![]() |
Page 356 |
015460,000124: # CALLING SEQUENCE
015461,000125:
015462,000126: # IN ORDER TO PERFORM A KALCMANU SUPERVISED MANEUVER, THE COMMANDED GIMBAL ANGLES MUST BE PRECOMPUTED AND
015463,000127: # STORED IN LOCATIONS CPHI, CTHETA, CPSI. THE USER:S PROGRAM MUST THEN CLEAR STATE SWITCH NO 33 TO ALLOW THE
015464,000128: # ATTITUDE MANEUVER ROUTINE TO PERFORM ANY FINAL P-AXIS YAW INCURRED BY AVOIDING GIMBAL LOCK. THE MANEUVER IS
015465,000129: # THEN INITIATED BY ESTABLISHING THE FOLLOWING EXECUTIVE JOB
015466,000130:
015467,000131: # *
015468,000132: # CAF PRIO XX
015469,000133: # --
015470,000134: # INHINT
015471,000135: # TC FINDVAC
015472,000136: # 2CADR KALCMAN3
015473,000137: # RELINT
015474,000138:
015475,000139: # THE USER:S PROGRAM MAY EITHER CONTINUE OR WAIT FOR THE TERMINATION OF THE MANEUVER. IF THE USER WISHES TO
015476,000140: # WAIT, HE MAY PUT HIS JOB TO SLEEP WITH THE FOLLOWING INSTRUCTIONS
015477,000141:
015478,000142: # L TC BANKCALL
015479,000143: # L+1 CADR ATTSTALL
015480,000144: # L+2 (BAD RETURN)
015481,000145: # L+3 (GOOD RETURN)
015482,000146:
015483,000147: # UPON COMPLETION OF THE MANEUVER, THE PROGRAM WILL BE AWAKENED AT L+3 IF THE MANEUVER WAS COMPLETED
015484,000148: # SUCCESSFULLY, OR AT L+2 IF THE MANEUVER WAS ABORTED. THIS ABORT WOULD OCCUR IF THE INITIAL OR FINAL ATTITUDE
015485,000149: # WAS IN GIMBAL LOCK.
015486,000150:
015487,000151: # ***NOTA BENE*** IT IS ASSUMED THAT THE DESIRED MANEUVERING RATE (0.5, 2, 5, 10, DEG/SEC) HAS BEEN SELECTED BY
015488,000152: # KEYBOARD ENTRY PRIOR TO THE EXECUTION OF KALCMANU.
015489,000153: # IT IS ALSO ASSUMED THAT THE AUTOPILOT IS IN THE AUTO MODE. IF THE MODE SWITCH IS CHANGED DURING THE
015490,000154: # MANEUVER, KALCMANU WILL TERMINATE VIA GOODEND WITHIN 1 SECOND SO THAT R60 MAY REQUEST A TRIM OF THE S/C ATTITUDE
015491,000155: # THIS IS THE ONLY MEANS FOR MANUALLY TERMINATING A KALCMANU SUPERVISED MANEUVER.
015492,000156: # SUBROUTINES
015493,000157:
015494,000158: # KALCMANU USES A NUMBER OF INTERPRETIVE SUBROUTINES WHICH MAY BE OF GENERAL INTEREST. SINCE THESE ROUTINES
015495,000159: # WERE PROGRAMMED EXCLUSIVELY FOR KALCMANU, THEY ARE NOT, AS YET, GENERALLY AVAILABLE FOR USE BY OTHER PROGRAMS.
015496,000160:
015497,000161: # MXM3
015498,000162: # ----
015499,000163:
015500,000164: # THIS SUBROUTINE MULTIPLIES TWO 3X3 MATRICES AND LEAVES THE RESULT IN THE FIRST 18 LOCATIONS OF THE PUSH
015501,000165: # DOWN LIST, I.E.,
015502,000166:
015503,000167: # (M M M )
015504,000168: # ( 0 1 2)
015505,000169: # * ( ) * *
015506,000170: # M = (M M M ) = M1 X M2
015507,000171: # ( 3 4 5)
015508,000172: # ( )
015509,000173: # (M M M )
015510,000174:
![]() |
Page 357 |
015512,000176: # ( 6 7 8)
015513,000177:
015514,000178: # *
015515,000179: # INDEX REGISTER X1 MUST BE LOADED WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M1, AND X2 MUST BE
015516,000180: # *
015517,000181: # LOADED WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M2. THE ROUTINE USES THE FIRST 20 LOCATIONS OF THE PUSH
015518,000182: # DOWN LIST. THE FIRST ELEMENT OF THE MATRIX APPEARS IN PDO. PUSH UP FOR M .
015519,000183: # 8
015520,000184:
015521,000185: # TRANSPOS
015522,000186: # --------
015523,000187:
015524,000188: # THIS ROUTINE TRANSPOSES A 3X3 MATRIX AND LEAVES THE RESULT IN THE PUSH DOWN LIST, I.E.,
015525,000189:
015526,000190: # * * T
015527,000191: # M = M1
015528,000192:
015529,000193: # INDEX REGISTER X1 MUST CONTAIN THE COMPLEMENT OF THE STARTING ADDRESS FOR M1. PUSH UP FOR THE FIRST AND SUB-
015530,000194: # *
015531,000195: # SEQUENT COMPONENTS OF M. THIS SUBROUTINE ALSO USES THE FIRST 20 LOCATIONS OF THE PUSH DOWN LIST.
015532,000196:
015533,000197: # CDU TO DCM
015534,000198: # ----------
015535,000199:
015536,000200: # THIS SUBROUTINE CONVERTS THREE CDU ANGLES IN T(MPAC) TO A DIRECTION COSINE MATRIX (SCALED BY 2) RELATING
015537,000201: # THE CORRESPONDING S/C ORIENTATIONS TO THE STABLE MEMBER FRAME. THE FORMULAS FOR THIS CONVERSION ARE
015538,000202:
015539,000203: # M = COSY COSZ
015540,000204: # 0
015541,000205:
015542,000206: # M = -COSY SINZ COSX + SINY SINX
015543,000207: # 1
015544,000208:
015545,000209: # M = COSY SINZ SINX + SINY COSX
015546,000210: # 2
015547,000211:
015548,000212: # M = SINZ
015549,000213: # 3
015550,000214:
015551,000215: # M = COSZ COSX
015552,000216: # 4
015553,000217:
015554,000218: # M = -COSZ SINX
015555,000219: # 5
015556,000220:
015557,000221: # M = -SINY COSZ
015558,000222: # 6
015559,000223:
015560,000224: # M = SINY SINZ COSX + COSY SINX
015561,000225: # 7
015562,000226:
![]() |
Page 358 |
015564,000228: # M = -SINY SINZ SINX + COSY COSX
015565,000229: # 8
015566,000230:
015567,000231: # WHERE X = OUTER GIMBAL ANGLE
015568,000232: # Y = INNER GIMBAL ANGLE
015569,000233: # Z = MIDDLE GIMBAL ANGLE
015570,000234:
015571,000235: # THE INTERPRETATION OF THIS MATRIX IS AS FOLLOWS
015572,000236:
015573,000237: # IF A , A , A REPRESENT THE COMPONENTS OF A VECTOR IN S/C AXES THEN THE COMPONENTS OF THE SAME VECTOR IN
015574,000238: # X Y Z
015575,000239: # STABLE MEMBER AXES (B , B , B ) ARE
015576,000240: # X Y Z
015577,000241:
015578,000242: # (B ) (A )
015579,000243: # ( X) ( X)
015580,000244: # ( ) ( )
015581,000245: # ( ) * ( )
015582,000246: # (B ) = M (A )
015583,000247: # ( Y) ( Y)
015584,000248: # ( ) ( )
015585,000249: # (B ) (A )
015586,000250: # (Z ) ( Z)
015587,000251:
015588,000252: # THE SUBROUTINE WILL STORE THIS MATRIX IN SEQUENTIAL LOCATIONS OF ERASABLE MEMORY AS SPECIFIED BY THE CALLING
015589,000253: # *
015590,000254: # PROGRAM. TO DO THIS THE CALLING PROGRAM MUST FIRST LOAD X2 WITH THE COMPLEMENT OF THE STARTING ADDRESS FOR M.
015591,000255:
015592,000256: # INTERNALLY, THE ROUTINE USES THE FIRST 16 LOCATIONS OF THE PUSH DOWN LIST, ALSO STEP REGISTER S1 AND INDEX
015593,000257: # REGISTER X2.
015594,000258:
015595,000259:
015596,000260: # DCM TO CDU
015597,000261: # ----------
015598,000262: # *
015599,000263: # THIS ROUTINE EXTRACTS THE CDU ANGLES FROM A DIRECTION COSINE MATRIX (M SCALED BY 2) RELATING S/C AXIS TO
015600,000264: # *
015601,000265: # STABLE MEMBER AXES. X1 MUST CONTAIN THE COMPLEMENT OF THE STARTING ADDRESS FOR M. THE SUBROUTINE LEAVES THE
015602,000266: # CORRESPONDING GIMBAL ANGLES IN V(MPAC) AS DOUBLE PRECISION 1:S COMPLEMENT ANGLES SCALED BY 2PI. THE FORMULAS
015603,000267: # FOR THIS CONVERSION ARE
015604,000268:
015605,000269: # Z = ARCSIN (M )
015606,000270: # 3
015607,000271:
015608,000272: # Y = ARCSIN (-M /COSZ)
015609,000273: # 6
015610,000274:
015611,000275: # IF M IS NEGATIVE, Y IS REPLACED BY PI SGN Y - Y
015612,000276: # 0
015613,000277:
![]() |
Page 359 |
015615,000279: # X = ARCSIN (-M /COSZ)
015616,000280: # 5
015617,000281:
015618,000282: # IF M IS NEGATIVE X IS REPLACED BY PI SGN X - X
015619,000283: # 4
015620,000284:
015621,000285: # THIS ROUTINE DOES NOT SET THE PUSH DOWN POINTER, BUT USES THE NEXT 8 LOCATIONS OF THE PUSH DOWN LIST AND
015622,000286: # RETURNS THE POINTER TO ITS ORIGINAL SETTING. THIS PROCEDURE ALLOWS THE CALLER TO STORE THE MATRIX AT THE TOP OF
015623,000287: # THE PUSH DOWN LIST.
015624,000288:
015625,000289:
015626,000290: # DELCOMP
015627,000291: # -------
015628,000292:
015629,000293: # *
015630,000294: # THIS ROUTINE COMPUTES THE DIRECTION COSINE MATRIX (DEL) RELATING ON
015631,000295: # -
015632,000296: # IS ROTATED WITH RESPECT TO THE FIRST BY AN ANGLE, A, ABOUT A UNIT VECTOR, U. THE FORMULA FOR THIS MATRIX IS
015633,000297:
015634,000298: # * * --T *
015635,000299: # DEL = I COSA + UU (1-COSA) + V SINA
015636,000300: # X
015637,000301:
015638,000302: # WHERE * (1 0 0)
015639,000303: # I = (0 1 0)
015640,000304: # (0 0 1)
015641,000305:
015642,000306:
015643,000307: # 2
015644,000308: # (U U U U U )
015645,000309: # ( X X Y X Z)
015646,000310: # ( )
015647,000311: # --T ( 2 )
015648,000312: # U U = (U U U U U )
015649,000313: # ( Y X Y Y Z )
015650,000314: # ( )
015651,000315: # ( 2 )
015652,000316: # (U U U U U )
015653,000317: # ( Z X Z Y Z )
015654,000318:
015655,000319:
015656,000320: # (0 -U U )
015657,000321: # ( Z Y )
015658,000322: # * ( )
015659,000323: # V = (U 0 -U )
015660,000324: # X ( Z X)
015661,000325: # ( )
015662,000326: # (-U U 0 )
015663,000327: # ( Y X )
015664,000328:
![]() |
Page 360 |
015666,000330: # -
015667,000331: # U = UNIT ROTATION VECTOR RESOLVED INTO S/C AXES
015668,000332: # A = ROTATION ANGLE
015669,000333:
015670,000334: # *
015671,000335: # THE INTERPRETATION OF DEL IS AS FOLLOWS
015672,000336:
015673,000337: # IF A , A , A REPRESENT THE COMPONENT OF A VECTOR INTHE ROTATED FRAME, THEN THE COMPONENTS OF THE SAME
015674,000338: # X Y Z
015675,000339: # VECTOR IN THE ORIGINAL S/C AXES (B , B , B ) ARE
015676,000340: # X Y Z
015677,000341:
015678,000342: # (B ) (A )
015679,000343: # ( X) ( X)
015680,000344: # ( ) * ( )
015681,000345: # (B ) = DEL (A )
015682,000346: # ( Y) ( Y)
015683,000347: # ( ) ( )
015684,000348: # (B ) (A )
015685,000349: # ( Z) ( Z)
015686,000350:
015687,000351: # THE ROUTINE WILL STORE THIS MATRIX (SCALED UNITY) IN SEQUENTIAL LOCATIONS OF ERASABLE MEMORY BEGINNING WITH
015688,000352: # -
015689,000353: # THE LOCATION CALLED DEL. IN ORDER TO USE THE ROUTINE, THE CALLING PROGRAM MUST FIRST STORE U (A HALF UNIT
015690,000354: # DOUBLE PRECISION VECTOR) IN THE SET OF ERASABLE LOCATIONS BEGINNING WITH THE ADDRESS CALLED COF. THE ANGLE, A,
015691,000355: # MUST THEN BE LOADED INTO D(MPAC).
015692,000356:
015693,000357: # INTERNALLY, THE PROGRAM ALSO USES THE FIRST 10 LOCATIONS OF THE PUSH DOWN LIST.
015694,000358:
015695,000359:
015696,000360: # READCDUK
015697,000361: # --------
015698,000362:
015699,000363: # THIS BASIC LANGUAGE SUBROUTINE LOADS T(MPAC) WITH THE THREE CDU ANGLES.
015700,000364:
015701,000365:
015702,000366: # SIGNMPAC
015703,000367: # --------
015704,000368:
015705,000369: # THIS IS A BASIC LANGUAGE SUBROUTINE WHICH LIMITS THE MAGNITUDE OF D(MPAC) TO + OR - DPOSMAX ON OVERFLOW.
015706,000370:
015707,000371:
015708,000372: # PROGRAM STORAGE ALLOCATION
015709,000373:
015710,000374: # 1) FIXED MEMORY 1059 WORDS
015711,000375: # 2) ERASABLE MEMORY 98
015712,000376: # 3) STATE SWITCHES 3
015713,000377:
![]() |
Page 361 |
015715,000379: # 4) FLAGS 1
015716,000380:
015717,000381:
015718,000382: # JOB PRIORITIES
015719,000383:
015720,000384: # 1) KALCMANU TBD
015721,000385: # 2) ONE SECOND UPDATE TBD
015722,000386:
015723,000387:
015724,000388: # SUMMARY OF STATE SWITCHES AND FLAGWORDS USED BY KALCMANU.
015725,000389:
015726,000390:
015727,000391: # STATE FLAGWRD 2 SETTING MEANING
015728,000392: # SWITCH NO. BIT NO.
015729,000393:
015730,000394: # *
015731,000395: # 31 14 0 MANEUVER WENT THROUGH GIMBAL LOCK
015732,000396: # 1 MANEUVER DID NOT GO THROUGH GIMBAL LOCK
015733,000397:
015734,000398: # *
015735,000399: # 32 13 0 CONTINUE UPDATE PROCESS
015736,000400: # 1 START UPDATE PROCESS
015737,000401:
015738,000402: # 33 12 0 PERFORM FINAL P-AXIS YAW IF REQUIRED
015739,000403: # 1 IGNORE ANY FINAL P-AXIS YAW
015740,000404:
015741,000405: # 34 11 0 SIGNAL END OF KALCMANU
015742,000406: # 1 KALCMANU IN PROCESS USER MUST SET SWITCH BEFORE INITIATING
015743,000407:
015744,000408:
015745,000409: # * INTERNAL TO KALCMANU
015746,000410:
015747,000411:
015748,000412: # SUGGESTIONS FOR PROGRAM INTEGRATION
015749,000413:
015750,000414: # THE FOLLOWING VARIABLES SHOULD BE ASSIGNED TO UNSWITCH ERASABLE
015751,000415:
015752,000416: # CPHI
015753,000417: # CTHETA
015754,000418: # CPSI
015755,000419: # POINTVSM +5
015756,000420: # SCAXIS +5
015757,000421: # DELDCDU
015758,000422: # DELDCDU1
015759,000423: # DELDCDU2
015760,000424: # RATEINDX
015761,000425:
015762,000426: # THE FOLLOWING SUBROUTINES MAY BE PUT IN A DIFFERENT BANK
015763,000427:
015764,000428: # MXM3
015765,000429:
![]() |
Page 362 |
015767,000431: # TRANSPOS
015768,000432: # SIGNMPAC
015769,000433: # READCDUK
015770,000434: # CDUTODCM
015771,000435:
![]() |
Page 363 |
015773,000437: 15,2162 BANK 15
015774,000438: 22,2000 SETLOC KALCMON1
015775,000439: 22,2000 BANK
015776,000440:
015777,000441: 22,2004 E6,1675 EBANK= BCDU
015778,000442:
015779,000443: # THE THREE DESIRED CDU ANGLES MUST BE STORED AS SINGLE PRECISION TWOS COMPLEMENT ANGLES IN THE THREE SUCCESSIVE
015780,000444: # LOCATIONS, CPHI, CTHETA, CPSI.
015781,000445:
015782,000446: 22,2004 COUNT* $$/KALC
015783,000447: 22,2004 06060 KALCMAN3 TC INTPRET # PICK UP THE CURRENT CDU ANGLES AND
015784,000448: 22,2005 77634 RTB # COMPUTE THE MATRIX FROM INITIAL S/C
015785,000449: 22,2006 44403 READCDUK # AXES TO FINAL S/C AXES
015786,000450: 22,2007 03276 STORE BCDU # STORE INITIAL S/C ANGLES
015787,000451: 22,2010 51535 SLOAD ABS # CHECK THE MAGNITUDE OF THE DESIRED
015788,000452: 22,2011 00324 CPSI # MIDDLE GIMBAL ANGLE
015789,000453: 22,2012 51025 DSU BPL
015790,000454: 22,2013 04403 LOCKANGL # IF GREATER THAN 70 DEG ABORT MANEUVER
015791,000455: 22,2014 44724 TOOBADF
015792,000456: 22,2015 72364 AXC,2 TLOAD
015793,000457: 22,2016 03245 MIS
015794,000458: 22,2017 03276 BCDU
015795,000459: 22,2020 77624 CALL # COMPUTE THE TRANSFORMATION FROM INITIAL
015796,000460: 22,2021 44410 CDUTODCM # S/C AXES TO STABLE MEMBER AXES
015797,000461: 22,2022 72364 AXC,2 TLOAD
015798,000462: 22,2023 02221 MFS # PREPARE TO CALCULATE ARRAY MFS
015799,000463: 22,2024 00322 CPHI
015800,000464: 22,2025 77624 CALL
015801,000465: 22,2026 44410 CDUTODCM
015802,000466: 22,2027 45160 SECAD AXC,1 CALL # MIS AND MFS ARRAYS CALCULATED $2
015803,000467: 22,2030 03245 MIS
015804,000468: 22,2031 44326 TRANSPOS
015805,000469: 22,2032 45575 VLOAD STADR
015806,000470: 22,2033 50460 STOVL TMIS +12D
015807,000471: 22,2034 77626 STADR
015808,000472: 22,2035 50466 STOVL TMIS +6
015809,000473: 22,2036 77626 STADR
015810,000474: 22,2037 74474 STORE TMIS # TMIS = TRANSPOSE(MIS) SCALED BY 2
015811,000475: 22,2040 75160 AXC,1 AXC,2
015812,000476: 22,2041 03302 TMIS
015813,000477: 22,2042 02221 MFS
015814,000478: 22,2043 77624 CALL
015815,000479: 22,2044 44312 MXM3
015816,000480: 22,2045 45575 VLOAD STADR
015817,000481: 22,2046 51541 STOVL MFI +12D
015818,000482: 22,2047 77626 STADR
015819,000483: 22,2050 51547 STOVL MFI +6
015820,000484: 22,2051 77626 STADR
015821,000485: 22,2052 75555 STORE MFI # MFI = TMIS MFS (SCALED BY 4)
015822,000486: 22,2053 45001 SETPD CALL # TRANSPOSE MFI IN PD LIST
015823,000487:
![]() |
Page 364 |
015825,000489: 22,2054 00023 18D
015826,000490: 22,2055 44335 TRNSPSPD
015827,000491: 22,2056 45575 VLOAD STADR
015828,000492: 22,2057 50460 STOVL TMFI +12D
015829,000493: 22,2060 77626 STADR
015830,000494: 22,2061 50466 STOVL TMFI +6
015831,000495: 22,2062 77626 STADR
015832,000496: 22,2063 74474 STORE TMFI # TMFI = TRANSPOSE (MFI) SCALED BY 4
015833,000497:
015834,000498: # CALCULATE COFSKEW AND MFISYM
015835,000499:
015836,000500: 22,2064 45345 DLOAD DSU
015837,000501: 22,2065 03305 TMFI +2
015838,000502: 22,2066 02224 MFI +2
015839,000503: 22,2067 45325 PDDL DSU # CALCULATE COF SCALED BY 2/SIN(AM)
015840,000504: 22,2070 02226 MFI +4
015841,000505: 22,2071 03307 TMFI +4
015842,000506: 22,2072 45325 PDDL DSU
015843,000507: 22,2073 03315 TMFI +10D
015844,000508: 22,2074 02234 MFI +10D
015845,000509: 22,2075 77666 VDEF
015846,000510: 22,2076 03325 STORE COFSKEW # EQUALS MFISKEW
015847,000511:
015848,000512: # CALCULATE AM AND PROCEED ACCORDING TO ITS MAGNITUDE
015849,000513:
015850,000514: 22,2077 43345 DLOAD DAD
015851,000515: 22,2100 02222 MFI
015852,000516: 22,2101 02242 MFI +16D
015853,000517: 22,2102 43225 DSU DAD
015854,000518: 22,2103 06475 DP1/4TH
015855,000519: 22,2104 02232 MFI +8D
015856,000520: 22,2105 03333 STORE CAM # CAM = (MFI0+MFI4+MFI8-1)/2 HALF SCALE
015857,000521: 22,2106 77726 ARCCOS
015858,000522: 22,2107 03335 STORE AM # AM=ARCCOS(CAM) (AM SCALED BY 2)
015859,000523: 22,2110 51025 DSU BPL
015860,000524: 22,2111 04363 MINANG
015861,000525: 22,2112 44117 CHECKMAX
015862,000526: 22,2113 77751 TLOAD # MANEUVER LESS THAN .25 DEGREES
015863,000527: 22,2114 00322 CPHI # GO DIRECTLY INTO ATTITUDE HOLD
015864,000528: 22,2115 37235 STCALL CDUXD # ABOUT COMMANDED ANGLES
015865,000529: 22,2116 44742 TOOBADI # STOP RATE AND EXIT
015866,000530:
015867,000531: 22,2117 45345 CHECKMAX DLOAD DSU
015868,000532: 22,2120 03335 AM
015869,000533: 22,2121 04365 MAXANG
015870,000534: 22,2122 77244 BPL VLOAD
015871,000535: 22,2123 44131 ALTCALC # UNIT
015872,000536: 22,2124 03325 COFSKEW # COFSKEW
015873,000537: 22,2125 77656 UNIT
015874,000538: 22,2126 03270 STORE COF # COF IS THE MANEUVER AXIS
015875,000539:
![]() |
Page 365 |
015877,000541: 22,2127 77650 GOTO # SEE IF MANEUVER GOES THRU GIMBAL LOCK
015878,000542: 22,2130 44744 LOCSKIRT
015879,000543: 22,2131 53375 ALTCALC VLOAD VAD # IF AM GREATER THAN 170 DEGREES
015880,000544: 22,2132 02222 MFI
015881,000545: 22,2133 03303 TMFI
015882,000546: 22,2134 77762 VSR1
015883,000547: 22,2135 27303 STOVL MFISYM
015884,000548: 22,2136 02230 MFI +6
015885,000549: 22,2137 74455 VAD VSR1
015886,000550: 22,2140 03311 TMFI +6
015887,000551: 22,2141 27311 STOVL MFISYM +6
015888,000552: 22,2142 02236 MFI +12D
015889,000553: 22,2143 74455 VAD VSR1
015890,000554: 22,2144 03317 TMFI +12D
015891,000555: 22,2145 03317 STORE MFISYM +12D # MFISYM=(MFI+TMFI)/2 SCALED BY 4
015892,000556:
015893,000557:
015894,000558: # CALCULATE COF
015895,000559:
015896,000560:
015897,000561: 22,2146 70545 DLOAD SR1
015898,000562: 22,2147 03333 CAM
015899,000563: 22,2150 45325 PDDL DSU # PDO CAM $4
015900,000564: 22,2151 06503 DPHALF
015901,000565: 22,2152 03333 CAM
015902,000566: 22,2153 65204 BOVB PDDL # PD2 1 - CAM $2
015903,000567: 22,2154 31765 SIGNMPAC
015904,000568: 22,2155 03323 MFISYM +16D
015905,000569: 22,2156 56225 DSU DDV
015906,000570: 22,2157 00001 0
015907,000571: 22,2160 00003 2
015908,000572: 22,2161 65366 SQRT PDDL # COFZ = SQRT(MFISYM8-CAM)/1-CAM)
015909,000573: 22,2162 03313 MFISYM +8D # $ ROOT 2
015910,000574: 22,2163 56225 DSU DDV
015911,000575: 22,2164 00001 0
015912,000576: 22,2165 00003 2
015913,000577: 22,2166 65366 SQRT PDDL # COFY = SQRT(MFISYM4-CAM)/(1-CAM) $ROOT2
015914,000578: 22,2167 03303 MFISYM
015915,000579: 22,2170 56225 DSU DDV
015916,000580: 22,2171 00001 0
015917,000581: 22,2172 00003 2
015918,000582: 22,2173 55566 SQRT VDEF # COFX = SQRT(MFISYM-CAM)/(1-CAM) $ROOT 2
015919,000583: 22,2174 77656 UNIT
015920,000584: 22,2175 03270 STORE COF
015921,000585:
015922,000586: # DETERMINE LARGEST COF AND ADJUST ACCORDINGLY
015923,000587:
015924,000588: 22,2176 45345 COFMAXGO DLOAD DSU
015925,000589: 22,2177 03270 COF
015926,000590: 22,2200 03272 COF +2
015927,000591: 22,2201 71240 BMN DLOAD # COFY G COFX
015928,000592:
![]() |
Page 366 |
015930,000594: 22,2202 44211 COMP12
015931,000595: 22,2203 03270 COF
015932,000596: 22,2204 50025 DSU BMN
015933,000597: 22,2205 03274 COF +4
015934,000598: 22,2206 44266 METHOD3 # COFZ G COFX OR COFY
015935,000599: 22,2207 77650 GOTO
015936,000600: 22,2210 44242 METHOD1 # COFX G COFY OR COFZ
015937,000601: 22,2211 45345 COMP12 DLOAD DSU
015938,000602: 22,2212 03272 COF +2
015939,000603: 22,2213 03274 COF +4
015940,000604: 22,2214 77640 BMN
015941,000605: 22,2215 44266 METHOD3 # COFZ G COFY OR COFX
015942,000606:
015943,000607: 22,2216 51145 METHOD2 DLOAD BPL # COFY MAX
015944,000608: 22,2217 03327 COFSKEW +2 # UY
015945,000609: 22,2220 44224 U2POS
015946,000610: 22,2221 57575 VLOAD VCOMP
015947,000611: 22,2222 03270 COF
015948,000612: 22,2223 03270 STORE COF
015949,000613: 22,2224 51145 U2POS DLOAD BPL
015950,000614: 22,2225 03305 MFISYM +2 # UX UY
015951,000615: 22,2226 44232 OKU21
015952,000616: 22,2227 57545 DLOAD DCOMP # SIGN OF UX OPPOSITE TO UY
015953,000617: 22,2230 03270 COF
015954,000618: 22,2231 03270 STORE COF
015955,000619: 22,2232 51145 OKU21 DLOAD BPL
015956,000620: 22,2233 03315 MFISYM +10D # UY UZ
015957,000621: 22,2234 44744 LOCSKIRT
015958,000622: 22,2235 57545 DLOAD DCOMP # SIGN OF UZ OPPOSITE TO UY
015959,000623: 22,2236 03274 COF +4
015960,000624: 22,2237 03274 STORE COF +4
015961,000625: 22,2240 77650 GOTO
015962,000626: 22,2241 44744 LOCSKIRT
015963,000627: 22,2242 51145 METHOD1 DLOAD BPL # COFX MAX
015964,000628: 22,2243 03325 COFSKEW # UX
015965,000629: 22,2244 44250 U1POS
015966,000630: 22,2245 57575 VLOAD VCOMP
015967,000631: 22,2246 03270 COF
015968,000632: 22,2247 03270 STORE COF
015969,000633: 22,2250 51145 U1POS DLOAD BPL
015970,000634: 22,2251 03305 MFISYM +2 # UX UY
015971,000635: 22,2252 44256 OKU12
015972,000636: 22,2253 57545 DLOAD DCOMP
015973,000637: 22,2254 03272 COF +2 # SIGN OF UY OPPOSITE TO UX
015974,000638: 22,2255 03272 STORE COF +2
015975,000639: 22,2256 51145 OKU12 DLOAD BPL
015976,000640: 22,2257 03307 MFISYM +4 # UX UZ
015977,000641: 22,2260 44744 LOCSKIRT
015978,000642: 22,2261 57545 DLOAD DCOMP # SIGN OF UZ OPPOSITE TO UY
015979,000643: 22,2262 03274 COF +4
015980,000644:
![]() |
Page 367 |
015982,000646: 22,2263 03274 STORE COF +4
015983,000647: 22,2264 77650 GOTO
015984,000648: 22,2265 44744 LOCSKIRT
015985,000649: 22,2266 51145 METHOD3 DLOAD BPL # COFZ MAX
015986,000650: 22,2267 03331 COFSKEW +4 # UZ
015987,000651: 22,2270 44274 U3POS
015988,000652: 22,2271 57575 VLOAD VCOMP
015989,000653: 22,2272 03270 COF
015990,000654: 22,2273 03270 STORE COF
015991,000655: 22,2274 51145 U3POS DLOAD BPL
015992,000656: 22,2275 03307 MFISYM +4 # UX UZ
015993,000657: 22,2276 44302 OKU31
015994,000658: 22,2277 57545 DLOAD DCOMP
015995,000659: 22,2300 03270 COF # SIGN OF UX OPPOSITE TO UZ
015996,000660: 22,2301 03270 STORE COF
015997,000661: 22,2302 51145 OKU31 DLOAD BPL
015998,000662: 22,2303 03315 MFISYM +10D # UY UZ
015999,000663: 22,2304 44744 LOCSKIRT
016000,000664: 22,2305 57545 DLOAD DCOMP
016001,000665: 22,2306 03272 COF +2 # SIGN OF UY OPPOSITE TO UZ
016002,000666: 22,2307 03272 STORE COF +2
016003,000667: 22,2310 77650 GOTO
016004,000668: 22,2311 44744 LOCSKIRT
![]() |
Page 368 |
016006,000670: # MATRIX OPERATIONS
016007,000671:
016008,000672: 13,2207 BANK 13
016009,000673: 22,2000 SETLOC KALCMON2
016010,000674: 22,2000 BANK
016011,000675:
016012,000676: 22,2312 E6,1675 EBANK= BCDU
016013,000677:
016014,000678: 22,2312 76601 MXM3 SETPD VLOAD* # MXM3 MULTIPLIES 2 3X3 MATRICES
016015,000679: 22,2313 00001 0 # AND LEAVES RESULT IN PD LIST
016016,000680: 22,2314 00001 0,1 # AND MPAC
016017,000681: 22,2315 62703 VXM* PDVL*
016018,000682: 22,2316 77776 0,2
016019,000683: 22,2317 00007 6,1
016020,000684: 22,2320 62703 VXM* PDVL*
016021,000685: 22,2321 77776 0,2
016022,000686: 22,2322 00015 12D,1
016023,000687: 22,2323 41503 VXM* PUSH
016024,000688: 22,2324 77776 0,2
016025,000689: 22,2325 77616 RVQ
016026,000690:
016027,000691:
016028,000692: # RETURN WITH M1XM2 IN PD LIST
016029,000693:
016030,000694: 22,2326 76601 TRANSPOS SETPD VLOAD* # TRANSPOS TRANSPOSES A 3X3 MATRIX
016031,000695: 22,2327 00001 0 # AND LEAVES RESULT IN PD LIST
016032,000696: 22,2330 00001 0,1 # MATRIX ADDRESS IN XR1
016033,000697: 22,2331 62713 PDVL* PDVL*
016034,000698: 22,2332 00007 6,1
016035,000699: 22,2333 00015 12D,1
016036,000700: 22,2334 77606 PUSH # MATRIX IN PD
016037,000701: 22,2335 77776 TRNSPSPD EXIT # ENTER WITH MATRIX AT 0 IN PD LIST
016038,000702: 22,2336 50120 INDEX FIXLOC
016039,000703: 22,2337 52013 DXCH 12
016040,000704: 22,2340 50120 INDEX FIXLOC
016041,000705: 22,2341 52017 DXCH 16
016042,000706: 22,2342 50120 INDEX FIXLOC
016043,000707: 22,2343 52013 DXCH 12
016044,000708: 22,2344 50120 INDEX FIXLOC
016045,000709: 22,2345 52015 DXCH 14
016046,000710: 22,2346 50120 INDEX FIXLOC
016047,000711: 22,2347 52005 DXCH 4
016048,000712: 22,2350 50120 INDEX FIXLOC
016049,000713: 22,2351 52015 DXCH 14
016050,000714: 22,2352 50120 INDEX FIXLOC
016051,000715: 22,2353 52003 DXCH 2
016052,000716: 22,2354 50120 INDEX FIXLOC
016053,000717: 22,2355 52007 DXCH 6
016054,000718: 22,2356 50120 INDEX FIXLOC
016055,000719: 22,2357 52003 DXCH 2
016056,000720:
![]() |
Page 369 |
016058,000722: 22,2360 06060 TC INTPRET
016059,000723: 22,2361 77616 RVQ
016060,000724:
016061,000725: 15,2162 BANK 15
016062,000726: 22,2000 SETLOC KALCMON1
016063,000727: 22,2000 BANK
016064,000728:
016065,000729: 22,2362 E6,1675 EBANK= BCDU
016066,000730:
016067,000731: 22,2362 00013 13563 MINANG 2DEC 0.00069375
016068,000732: 22,2364 17070 34343 MAXANG 2DEC 0.472222222
016069,000733: # GIMBAL LOCK CONSTANTS
016070,000734:
016071,000735: # D = MGA CORRESPONDING TO GIMBAL LOCK = 60 DEGREES
016072,000736: # NGL = BUFFER ANGLE (TO AVOID DIVISIONS BY ZERO) = 2 DEGREES
016073,000737:
016074,000738: 22,2366 15666 20443 SD 2DEC .433015 # = SIN(D) $2
016075,000739: 22,2370 33555 01106 K3S1 2DEC .86603 # = SIN(D) $1
016076,000740: 22,2372 67777 77777 K4 2DEC -.25 # = -COS(D) $2
016077,000741: 22,2374 04000 00000 K4SQ 2DEC .125 # = COS(D)COS(D) $2
016078,000742: 22,2376 00216 36323 SNGLCD 2DEC .008725 # = SIN(NGL)COS(D) $2
016079,000743: 22,2400 17773 00057 CNGL 2DEC .499695 # COS(NGL) $2
016080,000744: 22,2402 14344 LOCKANGL DEC .388889 # = 70 DEGREES
016081,000745: # INTERPRETIVE SUBROUTINE TO READ THE CDU ANGLES
016082,000746:
016083,000747: 22,2403 30034 READCDUK CA CDUZ # LOAD T(MPAC) WITH CDU ANGLES
016084,000748: 22,2404 54156 TS MPAC +2
016085,000749: 22,2405 00006 EXTEND
016086,000750: 22,2406 30033 DCA CDUX # AND CHANGE MODE TO TRIPLE PRECISION
016087,000751: 22,2407 16517 TCF TLOAD +6
016088,000752:
016089,000753:
016090,000754: 22,2410 66370 CDUTODCM AXT,1 SSP
016091,000755: 22,2411 00003 OCT 3
016092,000756: 22,2412 00051 S1
016093,000757: 22,2413 00001 OCT 1 # SET XR1, S1, AND PD FOR LOOP
016094,000758: 22,2414 00010 STORE 7
016095,000759: 22,2415 77601 SETPD
016096,000760: 22,2416 00001 0
016097,000761: 22,2417 47133 LOOPSIN SLOAD* RTB
016098,000762: 22,2420 00013 10D,1
016099,000763: 22,2421 21606 CDULOGIC
016100,000764:
![]() |
Page 370 |
016102,000766: 22,2422 00013 STORE 10D # LOAD PD WITH 0 SIN(PHI)
016103,000767: 22,2423 65356 SIN PDDL # 2 COS(PHI)
016104,000768: 22,2424 00013 10D # 4 SIN(THETA)
016105,000769: 22,2425 41546 COS PUSH # 6 COS(THETA)
016106,000770: 22,2426 71300 TIX,1 DLOAD # 8 SIN(PSI)
016107,000771: 22,2427 44417 LOOPSIN # 10 COS(PSI)
016108,000772: 22,2430 00007 6
016109,000773: 22,2431 72405 DMP SL1
016110,000774: 22,2432 00013 10D
016111,000775: 22,2433 10001 STORE 0,2 # C0=COS(THETA)COS(PSI)
016112,000776: 22,2434 41345 DLOAD DMP
016113,000777: 22,2435 00005 4
016114,000778: 22,2436 00001 0
016115,000779: 22,2437 41325 PDDL DMP # (PD6 SIN(THETA)SIN(PHI))
016116,000780: 22,2440 00007 6
016117,000781: 22,2441 00011 8D
016118,000782: 22,2442 72405 DMP SL1
016119,000783: 22,2443 00003 2
016120,000784: 22,2444 72421 BDSU SL1
016121,000785: 22,2445 00015 12D
016122,000786: 22,2446 10003 STORE 2,2 # C1=-COS(THETA)SIN(PSI)COS(PHI)
016123,000787: 22,2447 41345 DLOAD DMP
016124,000788: 22,2450 00003 2
016125,000789: 22,2451 00005 4
016126,000790: 22,2452 41325 PDDL DMP # (PD7 COS(PHI)SIN(THETA)) SCALED 4
016127,000791: 22,2453 00007 6
016128,000792: 22,2454 00011 8D
016129,000793: 22,2455 72405 DMP SL1
016130,000794: 22,2456 00001 0
016131,000795: 22,2457 72415 DAD SL1
016132,000796: 22,2460 00017 14D
016133,000797: 22,2461 10005 STORE 4,2 # C2=COS(THETA)SIN(PSI)SIN(PHI)
016134,000798: 22,2462 77745 DLOAD
016135,000799: 22,2463 00011 8D
016136,000800: 22,2464 10007 STORE 6,2 # C3=SIN(PSI)
016137,000801: 22,2465 77745 DLOAD
016138,000802: 22,2466 00013 10D
016139,000803: 22,2467 72405 DMP SL1
016140,000804: 22,2470 00003 2
016141,000805: 22,2471 10011 STORE 8D,2 # C4=COS(PSI)COS(PHI)
016142,000806: 22,2472 41345 DLOAD DMP
016143,000807: 22,2473 00013 10D
016144,000808: 22,2474 00001 0
016145,000809: 22,2475 72476 DCOMP SL1
016146,000810: 22,2476 10013 STORE 10D,2 # C5=-COS(PSI)SIN(PHI)
016147,000811: 22,2477 41345 DLOAD DMP
016148,000812: 22,2500 00005 4
016149,000813: 22,2501 00013 10D
016150,000814: 22,2502 72476 DCOMP SL1
016151,000815: 22,2503 10015 STORE 12D,2 # C6=-SIN(THETA)COS(PSI)
016152,000816:
![]() |
Page 371 |
016154,000818: 22,2504 77745 DLOAD
016155,000819: 22,2505 72405 DMP SL1 # (PUSH UP 7)
016156,000820: 22,2506 00011 8D
016157,000821: 22,2507 41325 PDDL DMP # (PD7 COS(PHI)SIN(THETA)SIN(PSI)) SCALE 4
016158,000822: 22,2510 00007 6
016159,000823: 22,2511 00001 0
016160,000824: 22,2512 72415 DAD SL1 # (PUSH UP 7)
016161,000825: 22,2513 77626 STADR # C7=COS(PHI)SIN(THETA)SIN(PSI)
016162,000826: 22,2514 67760 STORE 14D,2 # +COS(THETA)SIN(PHI)
016163,000827: 22,2515 77745 DLOAD
016164,000828: 22,2516 72405 DMP SL1 # (PUSH UP 6)
016165,000829: 22,2517 00011 8D
016166,000830: 22,2520 41325 PDDL DMP # (PD6 SIN(THETA)SIN(PHI)SIN(PSI)) SCALE 4
016167,000831: 22,2521 00007 6
016168,000832: 22,2522 00003 2
016169,000833: 22,2523 72425 DSU SL1 # (PUSH UP 6)
016170,000834: 22,2524 77626 STADR
016171,000835: 22,2525 67756 STORE 16D,2 # C8=-SIN(THETA)SIN(PHI)SIN(PSI)
016172,000836: 22,2526 77616 RVQ # +COS(THETA)COS(PHI)
016173,000837:
016174,000838: # CALCULATION OF THE MATRIX DEL......
016175,000839:
016176,000840: # * * --T *
016177,000841: # DEL = (IDMATRIX)COS(A)+UU (1-COS(A))+UX SIN(A) SCALED 1
016178,000842:
016179,000843: # -
016180,000844: # WHERE U IS A UNIT VECTOR (DP SCALED 2) ALONG THE AXIS OF ROTATION.
016181,000845: # A IS THE ANGLE OF ROTATION (DP SCALED 2)
016182,000846: # -
016183,000847: # UPON ENTRY THE STARTING ADDRESS OF U IS COF, AND A IS IN MPAC
016184,000848:
016185,000849: 22,2527 41401 DELCOMP SETPD PUSH # MPAC CONTAINS THE ANGLE A
016186,000850: 22,2530 00001 0
016187,000851: 22,2531 65356 SIN PDDL # PD0 = SIN(A)
016188,000852: 22,2532 41546 COS PUSH # PD2 = COS(A)
016189,000853: 22,2533 65302 SR2 PDDL # PD2 = COS(A) $8
016190,000854: 22,2534 41021 BDSU BOVB
016191,000855: 22,2535 06503 DPHALF
016192,000856: 22,2536 31765 SIGNMPAC
016193,000857: 22,2537 77725 PDDL # PD4 = 1-COS(A)
016194,000858:
016195,000859: # COMPUTE THE DIAGONAL COMPONENTS OF DEL
016196,000860:
016197,000861: 22,2540 03270 COF
016198,000862: 22,2541 41316 DSQ DMP
016199,000863: 22,2542 00005 4
016200,000864: 22,2543 52415 DAD SL3
016201,000865: 22,2544 00003 2
016202,000866: 22,2545 77604 BOVB
016203,000867: 22,2546 31765 SIGNMPAC
016204,000868:
![]() |
Page 372 |
016206,000870: 22,2547 16222 STODL KEL # UX UX(1-COS(A)) +COS(A) $1
016207,000871: 22,2550 03272 COF +2
016208,000872: 22,2551 41316 DSQ DMP
016209,000873: 22,2552 00005 4
016210,000874: 22,2553 52415 DAD SL3
016211,000875: 22,2554 00003 2
016212,000876: 22,2555 77604 BOVB
016213,000877: 22,2556 31765 SIGNMPAC
016214,000878: 22,2557 16232 STODL KEL +8D # UY UY(1-COS(A)) +COS(A) $1
016215,000879: 22,2560 03274 COF +4
016216,000880: 22,2561 41316 DSQ DMP
016217,000881: 22,2562 00005 4
016218,000882: 22,2563 52415 DAD SL3
016219,000883: 22,2564 00003 2
016220,000884: 22,2565 77604 BOVB
016221,000885: 22,2566 31765 SIGNMPAC
016222,000886: 22,2567 02242 STORE KEL +16D # UZ UZ(1-COS(A)) +COS(A) $1
016223,000887:
016224,000888: # COMPUTE THE OFF DIAGONAL TERMS OF DEL
016225,000889:
016226,000890: 22,2570 41345 DLOAD DMP
016227,000891: 22,2571 03270 COF
016228,000892: 22,2572 03272 COF +2
016229,000893: 22,2573 72405 DMP SL1
016230,000894: 22,2574 00005 4
016231,000895: 22,2575 41325 PDDL DMP # D6 UX UY (1-COS A) $4
016232,000896: 22,2576 03274 COF +4
016233,000897: 22,2577 00001 0
016234,000898: 22,2600 43206 PUSH DAD # D8 UZ SIN A $4
016235,000899: 22,2601 00007 6
016236,000900: 22,2602 41112 SL2 BOVB
016237,000901: 22,2603 31765 SIGNMPAC
016238,000902: 22,2604 16230 STODL KEL +6
016239,000903: 22,2605 62421 BDSU SL2
016240,000904: 22,2606 77604 BOVB
016241,000905: 22,2607 31765 SIGNMPAC
016242,000906: 22,2610 16224 STODL KEL +2
016243,000907: 22,2611 03270 COF
016244,000908: 22,2612 41205 DMP DMP
016245,000909: 22,2613 03274 COF +4
016246,000910: 22,2614 00005 4
016247,000911: 22,2615 65352 SL1 PDDL # D6 UX UZ (1-COS A) $4
016248,000912: 22,2616 03272 COF +2
016249,000913: 22,2617 41405 DMP PUSH # D8 UY SIN(A)
016250,000914: 22,2620 00001 0
016251,000915: 22,2621 62415 DAD SL2
016252,000916: 22,2622 00007 6
016253,000917: 22,2623 77604 BOVB
016254,000918: 22,2624 31765 SIGNMPAC
016255,000919: 22,2625 16226 STODL KEL +4 # UX UZ (1-COS(A))+UY SIN(A)
016256,000920:
![]() |
Page 373 |
016258,000922: 22,2626 62421 BDSU SL2
016259,000923: 22,2627 77604 BOVB
016260,000924: 22,2630 31765 SIGNMPAC
016261,000925: 22,2631 16236 STODL KEL +12D # UX UZ (1-COS(A))-UY SIN(A)
016262,000926: 22,2632 03272 COF +2
016263,000927: 22,2633 41205 DMP DMP
016264,000928: 22,2634 03274 COF +4
016265,000929: 22,2635 00005 4
016266,000930: 22,2636 65352 SL1 PDDL # D6 UY UZ (1-COS(A)) $4
016267,000931: 22,2637 03270 COF
016268,000932: 22,2640 41405 DMP PUSH # D8 UX SIN(A)
016269,000933: 22,2641 00001 0
016270,000934: 22,2642 62415 DAD SL2
016271,000935: 22,2643 00007 6
016272,000936: 22,2644 77604 BOVB
016273,000937: 22,2645 31765 SIGNMPAC
016274,000938: 22,2646 16240 STODL KEL +14D # UY UZ(1-COS(A)) +UX SIN(A)
016275,000939: 22,2647 62421 BDSU SL2
016276,000940: 22,2650 77604 BOVB
016277,000941: 22,2651 31765 SIGNMPAC
016278,000942: 22,2652 02234 STORE KEL +10D # UY UZ (1-COS(A)) -UX SIN(A)
016279,000943: 22,2653 77616 RVQ
016280,000944:
016281,000945:
016282,000946: # DIRECTION COSINE MATRIX TO CDU ANGLE ROUTINE
016283,000947: # X1 CONTAINS THE COMPLEMENT OF THE STARTING ADDRESS FOR MATRIX (SCALED 2)
016284,000948: # LEAVES CDU ANGLES SCALED 2PI IN V(MPAC)
016285,000949: # COS(MGA) WILL BE LEFT IN S1 (SCALED 1)
016286,000950:
016287,000951: # THE DIRECTION COSINE MATRIX RELATING S/C AXES TO STABLE MEMBER AXES CAN BE WRITTEN AS***
016288,000952:
016289,000953: # C =COS(THETA)COS(PSI)
016290,000954: # 0
016291,000955: # C =-COS(THETA)SIN(PSI)COS(PHI)+SI (THETA)SIN(PHI)
016292,000956: # 1
016293,000957: # C =COS(THETA)SIN(PSI)SIN(PHI) + S N(THETA)COS(PHI)
016294,000958: # 2
016295,000959: # C = SIN(PSI)
016296,000960: # 3
016297,000961: # C = COS(PSI)COS(PHI)
016298,000962: # 4
016299,000963: # C =-COS(PSI)SIN(PHI)
016300,000964: # 5
016301,000965: # C =-SIN(THETA)COS(PSI)
016302,000966: # 6
016303,000967: # C =SIN(THETA)SIN(PSI)COS(PHI)+COS THETA) SIN(PHI)
016304,000968: # 7
016305,000969: # C =-SIN(THETA)SIN(PSI)SIN(PHI)+CO (THETA)COS(PHI)
016306,000970: # 8
016307,000971:
![]() |
Page 374 |
016309,000973:
016310,000974: # WHERE PHI = OGA
016311,000975: # THETA = IGA
016312,000976: # PSI = MGA
016313,000977:
016314,000978: 22,2654 67543 DCMTOCDU DLOAD* ARCSIN
016315,000979: 22,2655 00007 6,1
016316,000980: 22,2656 71406 PUSH COS # PD +0 PSI
016317,000981: 22,2657 41152 SL1 BOVB
016318,000982: 22,2660 31765 SIGNMPAC
016319,000983: 22,2661 00051 STORE S1
016320,000984: 22,2662 57543 DLOAD* DCOMP
016321,000985: 22,2663 00015 12D,1
016322,000986: 22,2664 67471 DDV ARCSIN
016323,000987: 22,2665 00051 S1
016324,000988: 22,2666 51123 PDDL* BPL # PD +2 THETA
016325,000989: 22,2667 00001 0,1 # MUST CHECK THE SIGN OF COS(THETA)
016326,000990: 22,2670 44702 OKTHETA # TO DETERMINE THE PROPER QUADRANT
016327,000991: 22,2671 57545 DLOAD DCOMP
016328,000992: 22,2672 43244 BPL DAD
016329,000993: 22,2673 44677 SUHALFA
016330,000994: 22,2674 06503 DPHALF
016331,000995: 22,2675 77650 GOTO
016332,000996: 22,2676 44701 CALCPHI
016333,000997: 22,2677 77625 SUHALFA DSU
016334,000998: 22,2700 06503 DPHALF
016335,000999: 22,2701 77606 CALCPHI PUSH
016336,001000: 22,2702 57543 OKTHETA DLOAD* DCOMP
016337,001001: 22,2703 00013 10D,1
016338,001002: 22,2704 67471 DDV ARCSIN
016339,001003: 22,2705 00051 S1
016340,001004: 22,2706 51123 PDDL* BPL # PUSH DOWN PHI
016341,001005: 22,2707 00011 8D,1
016342,001006: 22,2710 44722 OKPHI
016343,001007: 22,2711 57545 DLOAD DCOMP # PUSH UP PHI
016344,001008: 22,2712 43244 BPL DAD
016345,001009: 22,2713 44717 SUHALFAP
016346,001010: 22,2714 06503 DPHALF
016347,001011: 22,2715 77650 GOTO
016348,001012: 22,2716 44723 VECOFANG
016349,001013: 22,2717 52025 SUHALFAP DSU GOTO
016350,001014: 22,2720 06503 DPHALF
016351,001015: 22,2721 44723 VECOFANG
016352,001016: 22,2722 77745 OKPHI DLOAD # PUSH UP PHI
016353,001017: 22,2723 43466 VECOFANG VDEF RVQ
016354,001018:
![]() |
Page 375 |
016356,001020: # ROUTINES FOR TERMINATING THE AUTOMATIC MANEUVER AND RETURNING TO USER
016357,001021:
016358,001022: 22,2724 77776 TOOBADF EXIT
016359,001023: 22,2725 05571 TC ALARM
016360,001024: 22,2726 00401 OCT 00401
016361,001025:
016362,001026: 22,2727 12732 TCF NOGO # DO NOT ZERO ATTITUDE ERRORS
016363,001027:
016364,001028: 22,2730 04607 TC BANKCALL
016365,001029: 22,2731 40154 CADR ZATTEROR # ZERO ATTITUDE ERRORS
016366,001030:
016367,001031: 22,2732 04607 NOGO TC BANKCALL
016368,001032: 22,2733 40166 CADR STOPRATE # STOP RATES
016369,001033:
016370,001034: 22,2734 34743 CAF TWO
016371,001035: 22,2735 00004 INHINT # ALL RETURNS ARE NOW MADE VIA GOODEND
016372,001036: 22,2736 05205 TC WAITLIST
016373,001037: 22,2737 E6,1675 EBANK= BCDU
016374,001038: 22,2737 03234 44066 2CADR GOODMANU
016375,001039:
016376,001040: 22,2741 15146 TCF ENDOFJOB
016377,001041:
016378,001042: 22,2742 77776 TOOBADI EXIT
016379,001043: 22,2743 12732 TCF NOGO
End of include-file ATTITUDE_MANEUVER_ROUTINE.agc. Parent file is MAIN.agc