# Copyright:	Public domain.
# Filename:	ASCENT_GUIDANCE.agc
# Purpose: 	Part of the source code for Luminary 1A build 099.
#		It is part of the source code for the Lunar Module's (LM)
#		Apollo Guidance Computer (AGC), for Apollo 11.
# Assembler:	yaYUL
# Contact:	Hartmuth Gutsche <hgutsche@xplornet.com>.
# Website:	www.ibiblio.org/apollo.
# Pages:	843-856
# Mod history:	2009-05-23 HG	Transcribed from page images.
#		2009-06-05 RSB	Fixed a couple of typos.
#		2009-06-07 RSB	Corrected a typo.
#
# 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 001 of AGC program LMY99 by NASA 2021112-61
#	16:27 JULY 14, 1969 

# Page 843
		BANK	34
		SETLOC	ASCFILT
		BANK

		EBANK=	DVCNTR

		COUNT*	$$/ASENT

ATMAG		TC	PHASCHNG
		OCT	00035
		TC	INTPRET
		BON
			FLRCS
			ASCENT
		DLOAD	DSU
			ABDVCONV
			MINABDV
		BMN	CLEAR
			ASCTERM4
			SURFFLAG
		CLEAR	SLOAD
			RENDWFLG
			BIT3H
		DDV	EXIT
			ABDVCONV
		DXCH	MPAC
		DXCH	1/DV3
		DXCH	1/DV2
		DXCH	1/DV1
		DXCH	1/DV0
		TC	INTPRET
		DLOAD	DAD
			1/DV0
			1/DV1
		DAD	DAD
			1/DV2
			1/DV3
		DMP	DMP
			VE
			2SEC(9)
		SL3	PDDL
			TBUP
		SR1	DAD
		DSU
			6SEC(18)
		STODL	TBUP
			VE
		SR1	DDV
			TBUP
		STCALL	AT
# Page 844
			ASCENT
BIT3H		OCT	4

# Page 845
		BANK	30
		SETLOC	ASENT
		BANK
		COUNT*	$$/ASENT

ASCENT		VLOAD	ABVAL
			R
		STOVL	/R/MAG
			ZAXIS1
		DOT	SL1
			V		# Z.V = ZDOT*2(-8).
		STOVL	ZDOT		# ZDOT*2(-7)
			ZAXIS1
		VXV	VSL1
			UNIT/R/		# Z X UR = LAXIS*2(-2)
		STORE	LAXIS		# LAXIS*2(-1)
		DOT	SL1
			V		# L.V = YDOT*2(-8).
		STCALL	YDOT		# YDOT * 2(-7)
			YCOMP
		VLOAD
			GDT1/2		# LOAD GDT1/2*2(-7) M/CS.
		V/SC	DOT
			2SEC(18)
			UNIT/R/		# G.UR*2(9) = GR*2(9).
		PDVL	VXV		# STORE IN PDL(0)
			UNIT/R/		# LOAD UNIT/R/ *2(-1)
			V		# UR*2(-1) X V*2(-7) = H/R*2(-8).
		VSQ	DDV		# H(2)/R(2)*2(-16).
			/R/MAG		# H(2)/R(3)*2(9).
		SL1	DAD
		STADR
		STODL	GEFF		# GEFF*2(10)m/CS/CS.
			ZDOTD
		DSU
			ZDOT
		STORE	DZDOT		# DZDOT = (ZDOTD - ZDOT) * 2(7) M/CS.
		VXSC	PDDL
			ZAXIS1
			YDOTD
		DSU
			YDOT
		STORE	DYDOT		# DYDOT = (YDOTD - YDOT) *2(7) M/CS.
		VXSC	PDDL
			LAXIS
			RDOTD
# Page 846
		DSU
			RDOT
		STORE	DRDOT		# DRDOT = (RDOTD - RDOT) * 2(7) M/CS.
		VXSC	VAD
			UNIT/R/
		VAD	VSL1
		STADR
		STORE	VGVECT		# VG = (DRDOT)R + (DVDOT)L + (DZDOT)Z.
		DLOAD	DMP		# LOAD TGO
			TGO		# TGO GEFF
			GEFF
		VXSC	VSL1
			UNIT/R/		# TGO GEFF UR
		BVSU
			VGVECT		# COMPENSATED FOR GEFF
		STORE	VGVECT		# STORE FOR DOWNLINK
		MXV	VSL1		# GET VGBODY FOR N85 DISPLAY
			XNBPIP
		STOVL	VGBODY
			VGVECT
		ABVAL	BOFF		# MAGNITUDE OF VGVECT
			FLRCS		# IF FLRCS=0,D0 NORMAL GUIDANCE
			MAINENG
		DDV			# USE TGO=VG/AT WITH RCS
			AT/RCS
		STCALL	TGO		# THIS WILL BE USED ON NEXT CYCLE
			ASCTERM2
MAINENG		DDV	PUSH		# VG/VE IN PDL(0)		(2)
			VE
		DMP	BDSU		# 1 - KT VG/VE
			KT1
			NEARONE
		DMP	DMP		# TBUP VG(1-KT VG/VE)/VE	(0)
			TBUP		# 	= TGO
		DSU			# COMPENSATE FOR TAILOFF
			TTO
		STORE	TGO
		SR	DCOMP
			11D
		STODL	TTOGO		# TGO *2(-28) CS
			TGO
		BON	DSU
			IDLEFLAG
			T2TEST
			4SEC(17)	# ( TGO - 4 )*2(-17) CS.
		BMN
			ENGOFF
T2TEST		DLOAD
			TGO
		DSU	BMN		# IF TGO - T2 NEG., GO TO CMPONENT
# Page 847
			T2A
			CMPONENT
		DLOAD	DSU
			TBUP
			TGO
		DDV	CALL		# 1- TGO/TBUP
			TBUP
			LOGSUB
		SL	PUSH		# -L IN PDL(0)			(2)
			5
		BDDV	BDSU		# -TGO/L*2(-17)
			TGO
			TBUP		# TBUP + TGO/L = D12*2(-17)
		PUSH	BON		# STORE IN PDL(2)		(4)
			FLPC		# IF FLPC = 1, GO TO CONST
			NORATES
		DLOAD	DSU
			TGO
			T3
		BPL	SET		# FLPC=1
			RATES
			FLPC
NORATES		DLOAD
			HI6ZEROS
		STORE	PRATE		# B = 0
		STORE	YRATE		# D = 0
		GOTO
			CONST		# GO TO CONST
RATES		DLOAD	DSU
			TGO
			02D		# TGO - D12 = D21*2(-17)
		PUSH	SL1		# IN PDL(4)			(6)
		BDSU	SL3		# (1/2TGO - D21)*2(-13) = E * 2(-13)
			TGO		#				(8)
		PDDL	DMP		# IN PDL(6)
			TGO
			RDOT		# RDOT TGO * 2(-24)
		DAD	DSU		# R + RDOT TGO
			/R/MAG		# R + RDOT TGO - RCO
			RCO		# MPAC = -DR *2(-24).
		PDDL	DMP		# -DR IN PDL(8)			(10)
			DRDOT
			04D		# D21 DRDOT*2(-24)
		DAD	SL2		# (D21 DRDOT-DR)*2(-22)		(8)
		DDV	DDV
			06D		# (D21 DRDOT-DR)/E*2(-9)
			TGO
		STORE	PRATE		# B * 2(8)
		BMN	DLOAD		# B>0 NOT PERMITTED
			CHKBMAG
# Page 848
			HI6ZEROS
		STCALL	PRATE
			PROK
CHKBMAG		SR4	DDV		# B*2(4)
			TBUP		# (B / TAU) * 2(21)
		DSU	BPL
			PRLIMIT		# ( B / TAU ) = 2(21) MAX.
			PROK
		DLOAD	DMP
			PRLIMIT
			TBUP		# B MAX. * 2(4)
		SL4			# BMAX*2(8)
		STORE	PRATE
PROK		DLOAD
			TGO
		DMP	DAD		# YDOT TGO
			YDOT
			Y		# Y + YDOT TGO
		DSU	PDDL		# Y + YDOT TGO - YCO
			YCO		# MPAC = - DY*(-24.) IN PDL(8)	(10)
			DYDOT
		DMP	DAD		# D21 DYDOT - DY		(8)
			04D
		SL2	DDV		# (D21 DYDOT - DY)/E*2(-9)
		DDV	SETPD		# (D21 DYDOT - DY)/E TGO*2(8)
			TGO		#	= D*2(8)
			04
		STORE	YRATE
CONST		DLOAD	DMP		# LOAD B*2(8)
			PRATE		# B D12*2(-9)
			02D
		PDDL	DDV		# D12 B IN PDL(4)	(6)
			DRDOT		# LOAD DRDOT*2(-7)
			00D		# -DRDOT/L*2(-7)
		SR2	DSU		# (-DRDOT/L-D12 B)=A*2(-9)	(4)
		STADR
		STODL	PCONS
			YRATE		# D*2(8)
		DMP	PDDL		# D12 D,EXCH WITH -L IN PDL(0)	(2,2)
		BDDV	SR2		# -DYDOT/L*2(-9)
			DYDOT
		DSU			# (-DYDOT/L-D12 D)=C*2(-9)
			00D
		STORE	YCONS
CMPONENT	SETPD	DLOAD
			00D
 			100CS
 		DMP
			PRATE		# B(T-T0)*2(-9)
		DAD	DDV		# (A+B(T-T0))*2(-9)
# Page 849
			PCONS		# (A+B(T-T0))/TBUP*2(8)
			TBUP
		SL1	DSU
			GEFF		# ATR*2(9)
		STODL	ATR
			100CS
		DMP	DAD
			YRATE
			YCONS		# (C+D(T-T0))*2(-9)
		DDV	SL1
			TBUP
		STORE	ATY		# ATY*2(9)
		VXSC	PDDL		# ATY UY*2(8)		(6)
			LAXIS
			ATR
		VXSC	VAD
			UNIT/R/
		VSL1	PUSH		# AH*2(9) IN PDL(0)	(6)
		ABVAL	PDDL		# AH(2) IN PDL(34)
			AT		# AHMAG IN PDL(6)	(8)
		DSQ	DSU		# (AT(2)-AH(2))*2(18)
			34D		# =ATP2*2(18)
		PDDL	PUSH		#			(12)
			AT
		DSQ	DSU		# (AT(2)KR(2)-AH(2))*2(18)	(10)
			34D		# =ATP3*2(18)
		BMN	DLOAD		# IF ATP3 NEG,GO TO NO-ATP
			NO-ATP		# LOAD ATP2, IF ATP3 POS
			8D
		SQRT	GOTO		# ATP*2(9)
			AIMER
NO-ATP		DLOAD	BDDV		# KR AT/AH = KH		(8)
			6D
		VXSC			# KH AG*2(9)
			00D
		STODL	00D		# STORE NEW AH IN PDL(0)
			HI6ZEROS
AIMER		SIGN
			DZDOT
		STORE	ATP
		VXSC
			ZAXIS1		# ATP ZAXIS *2(8).
		VSL1	VAD		# AT*2(0)
			00D
		STORE	UNFC/2		# WILL BE OVERWRITTEN IF IN VERT. RISE.
		SETPD	BON
			00D
			FLPI
			P12RET
		BON
# Page 850
			FLVR
			CHECKALT
MAINLINE	VLOAD	VCOMP
			UNIT/R/
		STODL	UNWC/2
			TXO
		DSU	BPL
			PIPTIME
			ASCTERM
		BON
			ROTFLAG
			ANG1CHEK
CLRXFLAG	CLEAR	CLEAR
			NOR29FLG	# START r29 IN ASCENT PHASE.
			XOVINFLG	# ALLOW X-AXIS OVERRIDE
ASCTERM		EXIT
		CA	FLAGWRD9
		MASK	FLRCSBIT
		CCS	A
		TCF	ASCTERM3
		TC	INTPRET
		CALL
			FINDCDUW -2
ASCTERM1	EXIT
 +1		CA	FLAGWRD9	# INSURE THAT THE NOUN 63 DISPLAY IS
 		MASK	FLRCSBIT	# BYPASSED IF WE ARE IN THE RCS TRIMMING
		CCS	A		# MODE OF OPERATION
		TCF	ASCTERM3
		CA	FLAGWRD8	# BYPASS DISPLAYS IF ENGINE FAILURE IS
		MASK	FLUNDBIT	# INDICATED.
		CCS	A
		TCF	ASCTERM3
		CAF	V06N63*
		TC	BANKCALL
		CADR	GODSPR
		TCF	ASCTERM3
ASCTERM2	EXIT
ASCTERM3	TCF	ENDOFJOB
ASCTERM4	EXIT
		INHINT
		TC	IBNKCALL	# NO GUIDANCE THIS CYCLE -- HENCE ZERO
		CADR	ZATTEROR	# THE DAP COMMANDED ERRORS.
		TCF	ASCTERM1 +1

CHECKALT	DLOAD	DSU
			/R/MAG
			/LAND/
		DSU	BMN		# IF H LT 25K CHECK Z AXIS ORIENTATION
			25KFT
			CHECKYAW
# Page 851
EXITVR		CLEAR	BON
			FLVR
			ROTFLAG
			MAINLINE
		DLOAD	DAD
			PIPTIME
			10SECS
		STCALL	TXO
			MAINLINE
EXITVR1		CLRGO
			ROTFLAG
			EXITVR

		SETLOC	ASENT1
		BANK
		COUNT*	$$/ASENT

ANG1CHEK	VLOAD	DOT
			UNFC/2
			XNBPIP
		DSU	BPL
			COSTHET1
			OFFROT
		VLOAD	DOT
			XNBPIP
			UNIT/R/
		DSU	BMN
			COSTHET2
			KEEPVR1
OFFROT		CLRGO
			ROTFLAG
			CLRXFLAG

		BANK	7
		SETLOC	ASENT2
		BANK
		COUNT*	$$/ASENT

SETXFLAG	=	CHECKYAW

CHECKYAW	SET
			XOVINFLG	# PROHIBIT X-AXIS OVERRIDE
		DLOAD	VXSC
			ATY
			LAXIS
		PDDL	VXSC
			ATP
			ZAXIS1
		VAD	UNIT
		PUSH	DOT
# Page 852
			YNBPIP
		ABS	DSU
			SIN5DEG
		BPL	DLOAD
			KEEPVR
			RDOT
		DSU	BPL
			40FPS
			EXITVR1
		GOTO
			KEEPVR
			
		BANK	5
		SETLOC	ASENT3
		BANK
		COUNT*	$$/ASENT

SIN5DEG		2DEC	0.08716 B-2
40FPS		2DEC	0.12192 B-7

		BANK	14
		SETLOC	ASENT4
		BANK
		COUNT*	$$/ASENT

KEEPVR		VLOAD	STADR		# RECALL LOSVEC FROM PUSHLIST
		STORE	UNWC/2
KEEPVR1		VLOAD
			UNIT/R/
		STCALL	UNFC/2
			ASCTERM

ENGOFF		RTB
			LOADTIME
		DSU	DAD
			PIPTIME
			TTOGO
		DCOMP	EXIT
		TC	TPAGREE		# FORCE SIGN AGREEMENT ON MPAC, MPAC +1.
		CAF	EBANK7
		TS	EBANK
		EBANK=	TGO
		INHINT
		CCS	MPAC +1
		TCF	+3		# C(A) = DT - 1 BIT
		TCF	+2		# C(A) = 0
		CAF	ZERO		# C(A) = 0
		AD	BIT1		# C(A) = 1 BIT OR DT.
# Page 853
		TS	ENGOFFDT
		TC	TWIDDLE
		ADRES	ENGOFF1
		TC	PHASCHNG
		OCT	47014
		-GENADR	ENGOFFDT
		EBANK=	TGO
		2CADR	ENGOFF1

		TC	INTPRET
		SET	GOTO
			IDLEFLAG	# DISABLE DELTA-V MONITOR
			T2TEST

ENGOFF1		TC	IBNKCALL	# SHUT OFF THE ENGINE.
		CADR	ENGINOF2

		CAF	PRIO17		# SET UP A JOB FOR THE ASCENT GUIDANCE
		TC	FINDVAC		# POSTBURN LOGIC.
		EBANK=	WHICH
		2CADR	CUTOFF

		TC	PHASCHNG
		OCT 	07024
		OCT	17000
		EBANK=	TGO
		2CADR	CUTOFF

		TCF	TASKOVER

CUTOFF		TC	UPFLAG		# SET FLRCS FLAG.
		ADRES	FLRCS

 -5		CAF	V16N63
 		TC	BANKCALL
		CADR	GOFLASH
		TCF	+3
		TCF	CUTOFF1
		TCF	-5

 +3		TC	POSTJUMP
 		CADR	TERMASC

CUTOFF1		INHINT
		TC	IBNKCALL	# ZERO ATTITUDE ERRORS BEFORE REDUCINT DB.
		CADR	ZATTEROR
		TC	IBNKCALL
		CADR	SETMINDB
		TC	POSTJUMP
		CADR	CUTOFF2
# Page 854

V16N63		VN	1663
		BANK	30
		SETLOC	ASENT5
		BANK
		COUNT*	$$/ASENT

CUTOFF2		TC	PHASCHNG
		OCT	04024

		CAF	V16N85C
		TC	BANKCALL
		CADR	GOFLASH
		TCF	TERMASC
		TCF	+2		# PROCEED
		TCF	CUTOFF2

TERMASC		TC	PHASCHNG
		OCT	04024

		INHINT			# RESTORE DEADBAND DESIRED BY ASTRONAUT.
		TC	IBNKCALL
		CADR	RESTORDB
		TC	DOWNFLAG	# DISALLOW ABORTS AT THIS TIME.
		ADRES	LETABORT
		TCF	GOTOP00H

V16N85C		VN	1685

		BANK 27
		SETLOC	ASENT1
		BANK
		COUNT* $$/ASENT
		
YCOMP		VLOAD	DOT
			UNIT/R/
			QAXIS
		SL2	DMP
			RCO
		STORE	Y
		RVQ
		
		BANK	30
		SETLOC	ASENT
		BANK
# Page 855
100CS		EQUALS	2SEC(18)
T2A		EQUALS	2SEC(17)
4SEC(17)	2DEC	400 B-17
2SEC(17)	2DEC	200 B-17
T3		2DEC	1000 B-17
6SEC(18)	2DEC	600 B-18
BIT4H		OCT	10
2SEC(9)		2DEC	200 B-9
V06N63*		VN	0663
V06N76		VN	0676
V06N33A		VN	0633

		BANK	33
		SETLOC	ASENT6
		BANK
		COUNT*	$$/ASENT

KT1		2DEC	0.5000
PRLIMIT		2DEC	-.0639		# (B/TBUP)MIN=-.1FT.SEC(-3)
MINABDV		2DEC	.0356 B-5	# 10 PERCENT BIGGER THAN GRAVITY
1/DV0		=	MASS1

# Page 856
# THE LOGARITHM SUBROUTINE

		BANK	24
		SETLOC	FLOGSUB
		BANK

# INPUT ..... X IN MPAC
# OUTPUT ..... -LOG(X) IN MPAC

LOGSUB		NORM	BDSU
			MPAC +6
			NEARONE
		EXIT
		TC	POLY
		DEC	6
		2DEC	.0000000060
		2DEC	-.0312514377
		2DEC	-.0155686771
		2DEC	-.0112502068
		2DEC	-.0018545108
		2DEC	-.0286607906
		2DEC	.0385598563
		2DEC	-.0419361902

		CAF	ZERO
		TS	MPAC +2
		EXTEND
		DCA	CLOG2/32
		DXCH	MPAC
		DXCH	BUF +1
		CA	MPAC +6
		TC	SHORTMP
		DXCH	MPAC +1
		DXCH	MPAC
		DXCH	BUF +1
		DAS	MPAC
		TC	INTPRET
		DCOMP	RVQ

CLOG2/32	2DEC	.0216608494

