β18679403[Quote]
# Copyright:Public domain.
# Filename:ANGLFIND.agc
# Purpose:Part of the source code for Colossus 2A, AKA Comanche 055.
#It is part of the source code for the Command Module's (CM)
#Apollo Guidance Computer (AGC), for Apollo 11.
# Assembler:yaYUL
# Contact:Ron Burkey <info@sandroid.org>.
# Website:www.ibiblio.org/apollo.
# Pages:399-411
# Mod history:2009-05-09 RSBAdapted from the Colossus249/ file
#of the same name, using Comanche055 page
#images.
#2009-05-22 RSBIn NOGOM2, TC ZEROEROR corrected to
#CADR ZEROEROR.
#
# This source code has been transcribed or otherwise adapted from digitized
# images of a hardcopy from the MIT Museum. The digitization was performed
# by Paul Fjeld, and arranged for by Deborah Douglas of the Museum. Many
# thanks to both. The images (with suitable reduction in storage size and
# consequent reduction in image quality as well) are available online at
# www.ibiblio.org/apollo. If for some reason you find that the images are
# illegible, contact me at info@sandroid.org about getting access to the
# (much) higher-quality images which Paul actually created.
#
# Notations on the hardcopy document read, in part:
#
#Assemble revision 055 of AGC program Comanche by NASA
#2021113-051. 10:28 APR. 1, 1969
#
#This AGC program shall also be referred to as
#Colossus 2A
# Page 399
BANK15
SETLOCKALCMON1
BANK
EBANK=BCDU
COUNT22/KALC
KALCMAN3TCINTPRET
RTB
READCDUK# PICK UP CURRENT CDU ANGLES
STOREBCDU# STORE THE INITIAL S/C ANGLES
AXC,2TLOAD# COMPUTE THE TRANSFORMATION FROM
MIS# INITIAL S/C AXES TO STABLE MEMBER AXES
BCDU# (MIS)
CALL
CDUTODCM
AXC,2TLOAD# COMPUTE THE TRANSFORMATION FROM
MFS# FINAL S/C AXES TO STABLE MEMBER AXES
CPHI# (MFS)
CALL
CDUTODCM
SECADAXC,1CALL# MIS AND MFS ARRAYS CALCULATED$2
MIS
TRANSPOS
VLOAD
STADR
STOVLTMIS +12D
STADR
STOVLTMIS +6
STADR
STORETMIS# TMIS = TRANSPOSE(MIS) SCALED BY 2
AXC,1AXC,2
TMIS
MFS
CALL
MXM3
VLOADSTADR
STOVLMFI +12D
STADR
STOVLMFI +6
STADR
STOREMFI# MFI = TMIS MFS (SCALED BY 4)
SETPDCALL# TRANSPOSE MFI IN PD LIST
18D
TRNSPSPD
VLOADSTADR
STOVLTMFI +12D
STADR
STOVLTMFI +6
# Page 400
STADR
STORETMFI# TMFI = TRANSPOSE (MFI) SCALED BY 4
# CALCULATE COFSKEW AND MFISYM
DLOADDSU
TMFI +2
MFI +2
PDDLDSU# CALCULATE COF SCALED BY 2/SIN(AM)
MFI +4
TMFI +4
PDDLDSU
TMFI +10D
MFI +10D
VDEF
STORECOFSKEW# EQUALS MFISKEW
# CALCULATE AM AND PROCEED ACCORDING TO ITS MAGNITUDE
DLOADDAD
MFI
MFI +16D
DSUDAD
DP1/4TH
MFI +8D
STORECAM# CAM = (MFI0+MFI4+MFI8-1)/2 HALF SCALE
ARCCOS
STOREAM# AM=ARCCOS(CAM) (AM SCALED BY 2)
DSUBPL
MINANG
CHECKMAX
EXIT# MANEUVER LESS THAN 0.25 DEG
INHINT# GO DIRECTLY INTO ATTITUDE HOLD
CSONE# ABOUT COMMANDED ANGLES
TSHOLDFLAG# NOGO WILL STOP ANY RATE AND SET UP FOR A
TCLOADCDUD# GOOD RETURN
TCFNOGO
CHECKMAXDLOADDSU
AM
MAXANG
BPLVLOAD
ALTCALC# UNIT
COFSKEW# COFSKEW
UNIT
STORECOF# COF IS THE MANEUVER AXIS
GOTO# SEE IF MANEUVER GOES THRU GIMBAL LOCK
LOCSKIRT
ALTCALCVLOADVAD# IF AM GREATER THAN 170 DEGREES
MFI
# Page 401
β18679414[Quote]
TMFI
VSR1
STOVLMFISYM
MFI +6
VADVSR1
TMFI +6
STOVLMFISYM +6
MFI +12D
VADVSR1
TMFI +12D
STOREMFISYM +12D# MFISYM=(MFI+TMFI)/2SCALED BY 4
# CALCULATE COF
DLOADSR1
β18679417[Quote]
CAM
PDDLDSU# PD0 CAM $4
DPHALF
CAM
BOVBPDDL# PD2 1 - CAM $2
SIGNMPAC
MFISYM +16D
DSUDDV
0
2
SQRTPDDL# COFZ = SQRT(MFISYM8-CAM)/(1-CAM)
MFISYM +8D# $ ROOT 2
DSUDDV
0
2
SQRTPDDL# COFY = SQRT(MFISYM4-CAM)/(1-CAM) $ROOT2
MFISYM
DSUDDV
0
2
SQRTVDEF# COFX = SQRT(MFISYM-CAM)/(1-CAM) $ROOT 2
UNIT
STORECOF
# DETERMINE LARGEST COF AND ADJUST ACCORDINGLY
COFMAXGODLOADDSU
COF
COF +2
BMNDLOAD# COFY G COFX
COMP12
COF
DSUBMN
COF +4
# Page 402
METHOD3# COFZ G COFX OR COFY
GOTO
METHOD1# COFX G COFY OR COFZ
COMP12DLOADDSU
COF +2
COF +4
BMN
METHOD3# COFZ G COFY OR COFX
METHOD2DLOADBPL# COFY MAX
COFSKEW +2# UY
U2POS
VLOADVCOMP
COF
STORECOF
U2POSDLOADBPL
MFISYM +2# UX UY
OKU21
DLOADDCOMP# SIGN OF UX OPPOSITE TO UY
COF
STORECOF
OKU21DLOADBPL
MFISYM +10D# UY UZ
LOCSKIRT
DLOADDCOMP# SIGN OF UZ OPPOSITE TO UY
COF +4
STORECOF +4
GOTO
LOCSKIRT
METHOD1DLOADBPL# COFX MAX
COFSKEW# UX
U1POS
VLOADVCOMP
COF
STORECOF
U1POSDLOADBPL
MFISYM +2# UX UY
OKU12
DLOADDCOMP
COF +2# SIGN OF UY OPPOSITE TO UX
STORECOF +2
OKU12DLOADBPL
MFISYM +4# UX UZ
LOCSKIRT
DLOADDCOMP# SIGN OF UZ OPPOSITE TO UY
COF +4
STORECOF +4
GOTO
LOCSKIRT
METHOD3DLOADBPL# COFZ MAX
# Page 403
COFSKEW+4# UZ
U3POS
VLOADVCOMP
COF
STORECOF
U3POSDLOADBPL
MFISYM +4# UX UZ
OKU31
DLOADDCOMP
COF# SIGN OF UX OPPOSITE TO UZ
STORECOF
OKU31DLOADBPL
MFISYM +10D# UY UZ
LOCSKIRT
DLOADDCOMP
COF +2# SIGN OF UY OPPOSITE TO UZ
STORECOF +2
GOTO
LOCSKIRT
# Page 404
# MATRIX OPERATIONS
MXM3SETPD# MXM3 MULTIPLIES 2 3X3 MATRICES
0# AND LEAVES RESULT IN PD LIST
DLOAD*PDDL*# ADDRESS OF 1ST MATRIX IN XR1
12D,2# ADDRESS OF 2ND MATRIX IN XR2
6,2
PDDL*VDEF# DEFINE VECTOR M2(COL 1)
0,2
MXV*PDDL*# M1XM2(COL 1) IN PD
0,1
14D,2
PDDL*PDDL*
8D,2
2,2
VDEFMXV*# DEFINE VECTOR M2(COL 2)
0,1
PDDL*PDDL*# M1XM2(COL 2) IN PD
16D,2
10D,2
PDDL*VDEF# DEFINE VECTOR M2(COL 3)
4,2
MXV*PUSH# M1XM2(COL 3) IN PD
0,1
GOTO
TRNSPSPD# REVERSE ROWS AND COLS IN PD AND
# RETURN WITH M1XM2 IN PD LIST
TRANSPOSSETPDVLOAD*# TRANSPOS TRANSPOSES A 3X3 MATRIX
0# AND LEAVES RESULT IN PD LIST
0,1# MATRIX ADDRESS IN XR1
PDVL*PDVL*
6,1
12D,1
PUSH# MATRIX IN PD
TRNSPSPDDLOADPDDL# ENTER WITH MATRIX IN PD LIST
2
6
STODL2
STADR
STODL6
4
PDDL
12D
STODL4
STADR
STODL12D
10D
PDDL
# Page 405
14D
STODL10D
STADR
STORE14D
RVQ# RETURN WITH TRANSPOSED MATRIX IN PD LIST
MINANGDEC.00069375
MAXANGDEC.472222
# GIMBAL LOCK CONSTANTS
# D = MGA CORRESPONDING TO GIMBAL LOCK = 60 DEGREES
# NGL = BUFFER ANGLE (TO AVOID DIVISIONS BY ZERO) = 2 DEGREES
SDDEC.433015# = SIN(D)$2
K3S1DEC.86603# = SIN(D)$2
K4DEC-.25# = - COS(D)$2
K4SQDEC.125# = COS(D)COS(D)$2
SNGLCDDEC.008725# = SIN(NGL)COS(D)$2
CNGLDEC.499695# = COS(NGL)$2
READCDUKINHINT# LOAD T(MPAC) WITH THE CURRENT CDU ANGLES
CACDUZ
TSMPAC +2
EXTEND
DCACDUX
RELINT
TCFTLOAD +6
BANK16
SETLOCKALCMON2
BANK
COUNT*$$/KALC
CDUTODCMAXT,1SSP# SUBROUTINE TO COMPUTE DIRECTION COSINE
OCT3# MATRIX RELATING S/C AXES TO STABLE
S1# MEMBER AXES FROM 3 CDU ANGLES IN T(MPAC)
OCT1# SET XR1, S1 AND PD FOR LOOP
STORE7
SETPD
0
LOOPSINSLOAD*RTB
β18679423[Quote]
10D,1
CDULOGIC
STORE10D# LOAD PD WITH 0 SIN(PHI)
SINPDDL# 2 COS(PHI)
10D# 4 SIN(THETA)
COSPUSH# 6 COS(THETA)
TIX,1DLOAD# 8 SIN(PSI)
LOOPSIN# 10 COS(PSI)
6
DMPSL1
10D
# Page 406
STORE0,2
DLOAD
4
DMPPDDL
0# (PD6 SIN(THETA)SIN(PHI))
6
DMPDMP
8D
2
SL1BDSU
12D
SL1
STORE2,2
DLOAD
2
DMPPDDL# (PD7 COS(PHI)SIN(THETA)) SCALED 4
4
6
DMPDMP
8D
0
SL1
DADSL1
14D
STORE4,2
DLOAD
8D
STORE6,2
DLOAD
10D
DMPSL1
2
STORE8D,2
DLOAD
10D
DMPDCOMP
0
SL1
STORE10D,2
DLOAD
4
DMPDCOMP
10D
SL1
STORE12D,2
DLOAD
DMPSL1# (PUSH UP 7)
8D
PDDLDMP# (PD7 COS(PHI)SIN(THETA)SIN(PSI)) SCALE4
6
# Page 407
0
DADSL1# (PUSH UP 7)
STADR# C7=COS(PHI)SIN(THETA)SIN(PSI)
STORE14D,2
DLOAD
DMPSL1# (PUSH UP 6)
8D
PDDLDMP# (PD6 SIN(THETA)SIN(PHI)SIN(PSI)) SCALE4
6
2
DSUSL1# (PUSH UP 6)
STADR
STORE16D,2# C8=-SIN(THETA)SIN(PHI)SIN(PSI)
RVQ# +COS(THETA)COS(PHI)
ENDOCMEQUALS
BANK15
SETLOCKALCMON1
BANK
# CALCULATION OF THE MATRIX DEL……
#
#* * –T *
#DEL = (IDMATRIX)COS(A)+UU (1-COS(A))+UX SIN(A)SCALED 1
#
# -
#WHERE U IS A UNIT VECTOR (DP SCALED 2) ALONG THE AXIS OF ROTATION.
#A IS THE ANGLE OF ROTATION (DP SCALED 2)
# -
#UPON ENTRY THE STARTING ADDRESS OF U IS COF, AND A IS IN MPAC
COUNT22/KALC
DELCOMPSETPDPUSH# MPAC CONTAINS THE ANGLE A
0
SINPDDL# PD0 = SIN(A)
COSPUSH# PD2 = COS(A)
SR2PDDL# PD2 = COS(A)$8
BDSUBOVB# PD4 = 1-COS(A)$2
DPHALF
SIGNMPAC
# COMPUTE THE DIAGONAL COMPONENTS OF DEL
PDDL
COF
DSQDMP
4
DADSL3
# Page 408
2
BOVB
SIGNMPAC
STODLDEL# UX UX(U-COS(A)) +COS(A)$1
COF +2
DSQDMP
4
DADSL3
2
BOVB
SIGNMPAC
STODLDEL +8D# UY UY(1-COS(A)) +COS(A)$1
COF +4
DSQDMP
4
DADSL3
2
BOVB
SIGNMPAC
STOREDEL +16D# UZ UZ(1-COS(A)) +COS(A)$1
# COMPUTE THE OFF DIAGONAL TERMS OF DEL
DLOADDMP
COF
COF +2
DMPSL1
4
PDDLDMP# D6 UX UY (1-COS A)$ 4
COF +4
0
PUSHDAD# D8 UZ SIN A$ 4
6
SL2BOVB
SIGNMPAC
STODLDEL +6
BDSUSL2
BOVB
SIGNMPAC
STODLDEL +2
COF
DMPDMP
COF +4
4
SL1PDDL# D6 UX UZ (1-COS A )$ 4
COF +2
DMPPUSH# D8 UY SIN(A)
0
DADSL2
6
# Page 409
BOVB
SIGNMPAC
STODLDEL +4# UX UZ (1-COS(A))+UY SIN(A)
BDSUSL2
BOVB
SIGNMPAC
STODLDEL +12D# UX UZ (U-COS(A))-UY SIN(A)
COF +2
DMPDMP
COF +4
4
SL1PDDL# D6 UY UZ (1-COS(A))$ 4
COF
DMPPUSH# D6 UX SIN(A)
0
DADSL2
6
BOVB
SIGNMPAC
STODLDEL +14D# UY UZ(1-COS(A)) +UX SIN(A)
BDSUSL2
BOVB
SIGNMPAC
STOREDEL +10D# UY UZ (1-COS(A)) -UX SIN(A)
RVQ
β18679430[Quote]
# DIRECTION COSINE MATRIX TO CDU ANGLE ROUTINE
# X1 CONTAINS THE COMPLEMENT OF THE STARTING ADDRESS FOR MATRIX (SCALED 2)
# LEAVES CDU ANGLES SCALED 2PI IN V(MPAC)
# COS(MGA) WILL BE LEFT IN S1 (SCALED 1)
#
# THE DIRECTION COSINE MATRIX RELATING S/C AXES TO STABLE MEMBER AXES CAN BE WRITTEN AS***
#
#C =COS(THETA)COS(PSI)
# 0
#C =-COS(THETA)SIN(PSI)COS(PHI)+SI (THETA)SIN(PHI)
# 1
#C =COS(THETA)SIN(PSI)SIN(PHI) + S N(THETA)COS(PHI)
# 2
#C =SIN(PSI)
# 3
#C =COS(PSI)COS(PHI)
# 4
#C =-COS(PSI)SIN(PHI)
# 5
#C =-SIN(THETA)COS(PSI)
# 6
#C =SIN(THETA)SIN(PSI)COS(PHI)+COS THETA)SIN(PHI)
# 7
# Page 410
#C =-SIN(THETA)SIN(PSI)SIN(PHI)+COS(THETA)COS(PHI)
# 8
#
#WHEREPHI = OGA
#THETA = IGA
#PSI = MGA
DCMTOCDUDLOAD*ARCSIN
6,1
PUSHCOS# PD +0PSI
SL1BOVB
SIGNMPAC
STORES1
DLOAD*DCOMP
12D,1
DDVARCSIN
S1
PDDL*BPL# PD +2THETA
0,1# MUST CHECK THE SIGN OF COS(THETA)
OKTHETA# TO DETERMINE THE PROPER QUADRANT
DLOADDCOMP
BPLDAD
SUHALFA
DPHALF
GOTO
CALCPHI
SUHALFADSU
DPHALF
CALCPHIPUSH
OKTHETADLOAD*DCOMP
10D,1
DDVARCSIN
S1
PDDL*BPL# PUSH DOWN PHI
8D,1
OKPHI
DLOADDCOMP# PUSH UP PHI
BPLDAD
SUHALFAP
DPHALF
GOTO
VECOFANG
SUHALFAPDSUGOTO
DPHALF
VECOFANG
OKPHIDLOAD# PUSH UP PHI
VECOFANGVDEFRVQ
# Page 411
# ROUTINE FOR TERMINATING AUTOMATIC MANEUVERS
NOGOM2INHINT# THIS LOCATION ACCESSED BY A BZMF NOGO -2
TCBANKCALL
CADRZEROEROR
NOGOINHINT
TCSTOPRATE
# TERMINATE MANEUVER
CAFTWO# NOTE - ALL RETURNS ARE NOW MADE VIA
TCWAITLIST# GOODEND
EBANK=BCDU
2CADRENDMANU
TCFENDOFJOB
β18679445[Quote]
Marge?