# Copyright:	Public domain.
# Filename:	TPI_SEARCH.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:	551-561
# Mod history:	2009-05-15 RSB	Adapted from the Colossus249/ file of the
#				same name, using Comanche055 page images.
#		2009-05-20 RSB	Corrections:  On p. 551, "SETLOC P17S" -> P17S1.
#
# 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 551
# TPI SEARCH

# PROGRAM DESCRIPTION S17.1 AND S17.2

# FUNCTIONAL DESCRIPTION

# 	THE TPI SEARCH ROUTINE DETERMINES THE MINIMUM TOTAL VELOCITY TRANSFER TRAJECTORY FROM A GIVEN TPI
# MANEUVER TIME WITHIN THE CONSTRAINT OF A SAFE PERICENTER.  THIS VELOCITY IS THE SUM OF THE IMPULSIVE VELOCITIES
# FOR THE TPI AND TPF MANEUVERS.
# 	THE S17.1 ROUTINE EXTRAPOLATES THE STATE VECTORS OF BOTH VEHICLES TO THE TPI TIME AND COMPUTES THE
# RELATIVE PHASE ANGLE BETWEEN THE VEHICLES, THE ALTITUDE DIFFERENCE(I.E. THE MAGNITUDE DIFFERENCE OF THE
# POSITION VECTORS) AND SELECTS A SEARCH SECTOR BASED ON THE SIGN OF THE ALTITUDE DIFFERENCE.
# 	THE S17.2 ROUTINE FURTHER DEFINES THE SEARCH SECTOR BY COMPUTING ANGULAR LIMITS AND USES THE TIME THETA
# SUBROUTINE TO COMPUTE THE SEARCH START AND END TIMES.  THE SEARCH IS THEN MADE IN AN ITERATIVE LOOP USING THE
# LAMBERT SUBROUTINE TO COMPUTE THE VELOCITIES REQUIRED AT TPI TIME AND AT TPF TIME.  EXIT FROM THE SEARCH LOOP
# IS MADE WHEN SOLUTION CRITERIA ARE MET (NORMAL EXIT) OR AS SOON AS IT IS EVIDENT THAT NO SOLUTION EXISTS IN
# THE SECTOR SEARCHED.

# CALLING SEQUENCE

# 	BOTH ROUTINES ARE CALLED IN INTERPRETIVE CODE AND RETURN VIA QPRET.  S17.1 HAS ONLY A NORMAL EXIT.
# S17.2 RETURNS VIA QPRET FOR NORMAL EXIT AND TO ALARUMS FOR ERROR EXIT.
# SUBROUTINES CALLED
#
#	CSMCONIC
#	LEMCONIC
#	TIMETHET
#	INITVEL

		BANK	36
		SETLOC	P17S1
		BANK

		COUNT	36/TPI

		EBANK=	RACT3

# 	**** TEMPORARY ****

HPE		2DEC	157420.0 B-29		# EARTH'S MIN. PERICENTER ALTITUDE 85 N.M.

HPL		2DEC	10668.0213 B-29		# MOON:S MIN. PERICENTER ALTITUDE 35000FT

CDSEC		2DEC	40000

CLSEC		2DEC	15000

PIINVERS	2DEC	.3183098862

SEC1THET	2DEC	.1944444444

# Page 552
SEC2THET	2DEC	.9166666667

MANYFEET	2DEC	-1.0 B-2

LIMVEL		2DEC	.6096 E-2 B-7		# 2FPS

DFTMOON		2DEC	.1524 E3 B-29		# 500 FEET

DP-.002		2DEC	0.002

		SETLOC	P17S
		BANK
S17.1		STQ	DLOAD
			NORMEX
			TTPI
		STCALL	TDEC1			# ADVANCE PASSIVE VEHICLE TO TPI
			LEMCONIC
		CALL
			LEMSTORE
		DLOAD
			TTPI
		STCALL	TDEC1			# ADVANCE ACTIVE VEHICLE TO TPI
			CSMCONIC
		CALL
			CSMSTORE
		VLOAD
			RACT3
		ABVAL	PDVL			# /RA/ 0D			PL 2D
			RPASS3
		UNIT	PDDL			# UNIT RP 0D			PL 6D
		BDSU	SET
			36D			# /RP/ -/RA/
			KFLAG			# OFF = +
		BMN	CLEAR
			+2
			KFLAG			# ON = -
		STOVL	DELHITE
			0D
		VXV	UNIT
			VPASS3
		STOVL	E2			# ALMOST IT SAVE FOR 17.2
			RACT3
		PUSH	VPROJ
			E2
		VSL2	BVSU			# RPA
		UNIT	DOT
			0D
		SL1 	ACOS
		PDVL
		VXV	DOT
# Page 553
			RACT3
			E2
		PDDL	SIGN
		STADR
		STODL	THETZERO		# CENTRAL ANGLE
			X1
		STCALL	XRS			# SAVE INDICES FOR FURTHER USE
			NORMEX			#   += ACTIVE AHEAD  -= ACTIVE BEHIND
S17.2		STQ	VLOAD			# COMPUTE SEARCH SECTOR LIMITS
			QTEMP
			RACT3
		UNIT	DOT
			E2
		ABS	SQRT
		SL1	DAD
			DP-.002			# ADD .002 RADIANS TO IT
		BON	DCOMP			# GIVES CORRECT SINE, COSINE MUST BE
			KFLAG			# COMP. ADD .5 FOR ANGLE
			+1
# PHI(0)=180-(-(THETAZERO +K5IT)), PHI(I)=180-(-THETAZERO+K2IT))
# SIN(180-ALPHA)=SIN(ALPHA) ETC
		DMP	SETPD
			PIINVERS		# REVOLUTIONARY HERES TWO IT
			0D
		PUSH	DSU
			THETZERO
		STORE	IT			# PHI(I) , -(THETZERO + K2IT)
		PDDL	PUSH
		SR1	DAD
		DAD	PUSH			# PHI(0) , -(THETZERO + K5IT)
		SIN	SET
			RVSW
		STODL	SNTH
		COS	BMN
			+2
		DCOMP
		STODL	CSTH
			XRS
		STOVL	X1
			RPASS3
		VSR*
			0,2
		STOVL	RVEC
			VPASS3
		VSR*
			0,2
		STCALL	VVEC
			TIMETHET
		DLOAD				# SAVE START TIME AND GET END TIME
			T
# Page 554
		STORE	TF
		STODL	TFO
			IT
		PUSH	SIN
		STODL	SNTH
		COS	BMN
			+2
		DCOMP
		STORE	CSTH
		LXA,1	CALL
			XRS
			TIMETHET
# INITIALIZE LOOP
		DLOAD	CLEAR
			T
			ITSWICH
		STODL	TFI			# SAVE TIME FOR LOOP TEST
			DPPOSMAX
		STODL	DELVEE
			MANYFEET
		STODL	HP
			SEC1THET		# 70 DEGREES
		BON	DLOAD
			KFLAG
			+2
			SEC2THET		# 330 DEGREES
		STCALL	THETL
			CONCAUL
BIS		DLOAD	SR1
			CSTH
		STODL	COSTH
			SNTH
		SR1
		STCALL	SINTH			# GET 4 QUADRANT THETA
			ARCTRIG
		BPL	DAD
			+2
			DPPOSMAX		# PUT THETA BETWEEN 0,1
		BDSU	PDDL
			THETL
			TF
		DSU	SIGN			# FAST TIMES
			TFI
		BMN
			RNGETEST		# TIME MUST HAVE A STOP
# ADVANCE PASSIVE FOR TARGET VECTOR
CONCAUL		DLOAD
			TTPI
		DAD	BON
			TF
# Page 555
			AVFLAG
			ADVCSM
		STCALL	TDEC1
			LEMCONIC
		GOTO
			JUNCT3
ADVCSM		STCALL	TDEC1
			CSMCONIC
# SAVE BACK VALUES OF HP AND DELVEE
JUNCT3		VLOAD
			VATT
		STOVL	VPASS4
			RATT
		STORE	RPASS4
		STODL	RTARG
			TF
		STODL	DELLT4
			HP
		STODL	HPO
			DELVEE
		STODL	DELVEO
# PREPARE FOR LAMBERT
			TTPI
		STODL	INTIME
			XRS
		STODL	RTX1
			HI6ZEROS
		SETPD	PDDL
			0D
			EPSFOUR
		PDVL
			RACT3
		STOVL	RINIT
			VACT3
		STCALL	VINIT
			INITVEL
# COMPUTE H ET CETERA
		VLOAD	VSU
			VTPRIME
			VPASS4
		ABVAL	PUSH
		STOVL	RELDELV			# /V2-VP(TPI+TF)/
			DELVEET3		# V1-VA
		ABVAL				# /V1-VA/
		STORE	MAGVTPI
		DAD	STADR
		STODL	DELVEE
			XRS
		STOVL	X1
			VIPRIME
# Page 556
		VSR*
			0,2
		STOVL	VVEC
			RACT3
		VSR*
			0,2
		STCALL	RVEC
			PERIAPO
		LXA,2	DLOAD
			XRS	+1
		SL*
			0,2
		STORE	HP
# ITSWICH DENOTES INTERPOLATION--SOLUTION ACCEPTANCE IS FORCED
		BON	DLOAD
			ITSWICH
			ENDEN
			HPERMIN
		DSU	BMN
			HP
			HALFSAFE
		PDDL	DSU			# WAS PERICENTER ALT SAFE
			HPERMIN
			HPO
		BMN	DSU			# (HPLIM-HPO)-(HPLIM-HP)=HP-HPO
			INTERP			# SOLUTION AT HAND
		BMN	DLOAD
			ALARUMS			# IT'S GETTING WORSE - SOUND THE ALARM
			CDSEC
JUNCT1		BOFF	DCOMP			# OFF IS PLUS ON IS MINUS
			KFLAG
			+1
		STORE	DELTEE
JUNCT2		DLOAD	DAD
			DELTEE
			TF
		STCALL	TF
			BIS			# RECYCLE
INTERP		SET	DSU			# HP-HPO
			ITSWICH
		NORM	PDDL
			X1
			DFTMOON
		DAD	DSU
			HPERMIN
			HP
		NORM	SR1
			X2
		XSU,2	DDV
			X1
# Page 557
		DMP	SR*
			DELTEE
			0 	-1,2
		STCALL	DELTEE
			JUNCT2
HALFSAFE	PDDL	DSU			# SAVE HP-HPLIM FOR POSSIBLE
			DELVEE
			DELVEO			# SAVE THIS TOO
		PUSH	ABS
		DSU	BMN
			LIMVEL			# 2 FT PS
			ENDEN
		DLOAD	DSU
			HPERMIN
			HPO
		PDDL
		BMN	DLOAD
			LRGRDVO
		BPL	DLOAD
			INTERP
			DELTEE
		SR1	DCOMP
		STCALL	DELTEE
			JUNCT2
LRGRDVO		DLOAD
		BMN	DLOAD
			JUNCT2
			CLSEC
		GOTO
			JUNCT1
# TIME RAN OUT ASSUME SOLUTION IF SAVE PERICENTER
RNGETEST	DLOAD	DSU
			HP
			HPERMIN
		BMN	DLOAD
			ALARUMS
			TF
		DSU
			DELTEE
		STORE	TF			# TIME OF SOLUTION
ENDEN		VLOAD
			VTPRIME
		DOT	PDDL			# SG2 WITH MAGNITUDE
			RPASS4
			RELDELV
		SIGN	STADR			# NOW SIGN(RELDELV)=SIGN(SG2)
		STCALL	RELDELV
			TRANSANG		# COMPUTE OMEGA T , CENTRAL ANGLE
		VLOAD	DOT
			RACT3
# Page 558
			VIPRIME			# SG1
		SIGN	BPL			# IF POSITIVE THEN SG1 = SG2 OTHERWISE
			RELDELV
			USEKAY			# SIGN(SG2-SG1)=SIGN(SG2)=SIGN(RELDELV)
		SLOAD	DCOMP
			DECTWO
		SIGN	BPL
			RELDELV
			NEXUS
		DCOMP	GOTO
			USEKAY	+4
USEKAY		SLOAD	BON
			DECTWO
			KFLAG
			NEXUS
		DSU
			P21ONENN
NEXUS		STODL	NN1
			HP
		STCALL	POSTTPI
			QTEMP
		BANK	07
		SETLOC	XANG
		BANK
		COUNT	07/XANG

# CENTRAL ANGLE SUBROUTINE
# 	THIS SUBROUTINE COMPUTES THE CENTRAL ANGLE OF TRAVEL OF THE
# PASSIVE VEHICLE DURING THE TRANSFER.

TRANSANG	STQ	SETPD
			SUBEXIT
			0
		LXA,1	LXA,2
			XRS
			XRS	+1
		VLOAD	VSR*
			VPASS4
			0,2
		STODL*	VVEC
			MUTABLE	+2,1
		PDVL	VSR*			# SQRT MU (+18 OR +15)			00D
			RPASS4
			0,2
		ABVAL	PDDL*			# MAGNITUDE OF R (+29 OR +27)		02D
			MUTABLE,1
		PDVL	VSQ			# 1/MU (+34 OR +28)			04D
			VVEC
		NORM	DMPR			# PUSH LIST AT 02D
			X1
# Page 559
		DMP	SRR*
			02D
			0 	-3,1
		BDSU				# R V**/MU (+6)
			D1/32
		NORM	PDDL
			X1			# (2 - R V**/MU) 	(+6-N)
		SR1R	DDV			# MAGNITUDE OF R 	(+30 OR +28)
		SL*	PUSH			# R/(2 - R V**/MU)	(+29 OR +27)02D
			0 	-5,1
		SR1	SQRT
		DMP
		NORM	PDDL			# ASUBP***				00D
			X1
		SR1	DDV
		DMP	SL*
			TF
			0,1
		PDDL	NORM
			2PISC
			X1
		PDDL	DDV
		SL*
			0 	-3,1		# CENTANG = (SQRT(MU/ASUP***)TF)
		STCALL	CENTANG			# IN REVOLUTIONS B-0
			SUBEXIT
		BANK	35
		SETLOC	P17S1
		BANK
		COUNT	35/P17

# TPI SEARCH DISPLAY ROUTNE

P17		TC	AVFLAGA			# AVFLAG = CSM , SET TRACK + UPDATE FLAGS
		TC	P17.1
P77		TC	AVFLAGP			# AVFLAG = LEM , SET TRACK + UPDATE FLAGS
P17.1		TC	P20FLGON		#	SET UPDATE FLAG
		CAF	V06N37			#	DISPLAY TTPI TIME
		TC	VNP00H
		TC	INTPRET
		CLEAR	CALL
			UPDATFLG
			S17.1			# UPDATE STATE VECTORS TO TTPI
		SET	AXT,1
			UPDATFLG
		DEC	2			# DELTA H = 2	K POSITIVE , KFLAG OFF
		BOFF	AXT,1
			KFLAG
			+2
		DEC	1			# DELTA H = 1	K NEGATIVE , KFLAG ON
# Page 560
		SXA,1	EXIT
			OPTION2
		CAF	V06N72			# DISPLAY PHI , DELTA H , SEARCH OPTION K
		TC	VNCOMP17
		TC	INTPRET
		CLEAR	SET
			UPDATFLG
			KFLAG
		SLOAD	DSU
			OPTION2			# RESET KFLAG ON FOR OPTION =1
			P21ONENN		#	     OFF FOR OPTION =2
		BHIZ	CLEAR
			+2
			KFLAG
		SLOAD	BHIZ
			XRS	+1
			+4
		DLOAD	GOTO
			HPL
			P17.2
		DLOAD
			HPE
P17.2		STCALL	HPERMIN
			S17.2
		SET	EXIT
			UPDATFLG
P17.3		CAF	V06N58			# DISPLAY DELTA VTPI , DELTA VTPF , AND H
		TC	VNCOMP17
		CAF	V06N55			# DISPLAY PERICENTER CODE AND CENTRAL ANG.
		TC	BANKCALL
		CADR	GOFLASHR
		TC	GOTOP00H		# TERMINATE PROGRAM
		TC	GOTOP00H		# END PROGRAM
		TC	P17.1			# RECYCLE WITH NEW TTPI OR SEARCH OPTION
		CAF	TWO			# BLANK R2
		TC	BLANKET
		TCF	ENDOFJOB
		EBANK=	RTRN

VNCOMP17	EXTEND
		QXCH	QSAVED
		TS	VERBNOUN
		CA	VERBNOUN
		TCR	BANKCALL
		CADR	GOFLASH
		TC	-3			# TERMINATE ILLEGAL REDISPLAY
		TC	QSAVED			# PROCEED
		CS	MPAC			# RECYCLE WITH NEW TPI TIME
		AD	BIT6			# OR PROCEED WITH NEW SEARCH OPTION
		EXTEND
# Page 561
		BZF	P17.1
		TC	VNCOMP17 +3
ALARUMS		SET	EXIT
			UPDATFLG
		TC	ALARM
		OCT	00124			# NO SAFE PERICENTER IN THIS SECTOR
		CAF	V05N09
		TC	VNCOMP17
		TC	GOTOP00H		# PROCEED ILLEGAL TERMINATE PROGRAM
V06N72		VN	0672
