آشنایی با سورس‌کد نرم‌‌افزار آپولو 11 که به ماه سفر کرد

آشنایی با سورس‌کد نرم‌‌افزار آپولو 11 که به ماه سفر کرد

وقتی در اواسط دهه‌ٔ 1960 میلادی برنامه‌‌نویسان آزمایشگاه ابزار دقیق در دانشگاه مشهور MIT توسعه‌ٔ نرم‌افزار پرواز برای برنامهٔ فضایی آپولو 11 را آغاز کردند، هنوز تکنولوژی‌های مورد نیاز آنها به وجود نیامده بود و آنها مجبور بودند خود این تکنولوژی‌ها را ابداع کنند. آنها راهی تازه برای ذخیره‌سازی برنامه‌های کامپیوتری پیدا کردند که Rope Memory (حافظه‌ی ریسمانی) نامیده شد و برای اینکه بتوانند ایدهٔ خود را عملی سازند، این گروه از برنامه‌نویسان همچنین مجبور شدند تا نسخه‌ای مخصوص از زبان برنامه‌‌نویسی Assembly را باز طراحی کنند (زبان اسمبلی برای بسیاری از برنامه‌ نویسان امروزی ناشناخته و البته ناخوانا است. در حقیقت، اسمبلی زبانی است برای اینکه کامپیوتر آن را به راحتی بخواند و بفهمد و نه انسان‌ها). برنامه‌نویسان MIT برای ساختن کامپیوتر هدایت آپولو که به صورت مخفف AGC خوانده می‌شود، هزاران خط از این کدها را توسعه داده و نوشته‌ بودند.

کدهای AGC مدت زیادی است که به صورت عمومی منتشر شده است و اولین عرضهٔ این سورس‌کد به سال 2003 برمی‌گردد. ران برکی، محقق و پژوهشگر در حوزه‌ٔ فناوری، پس از رونویسی کدها از روی تصاویر اسکن شده در MIT، آنها را به صورت عمومی منتشر کرد (در واقع، او تمام کدها را مجدداً از روی تصاویر، به صورت دستی و خط به خط، تایپ کرده بود. برکی در ایمیلی فرایند کاری‌اش را این‌گونه توضیح داده بود:

این تصاویر توسط یک خلبان به نام گری نف در کلرادو اسکن شده بودند. MIT آنها را نگهداری کرده و در فرمت تصویری به صورت آنلاین منتشر کرده بود. متأسفانه در این فرایند، تصاویر در بعضی نقاط تا مرز ناخوانا بودن خراب شده بودند. من شروع به بازسازی قسمت‌های ناخوانا کردم و برای پر کردن بعضی جاهای خالی از مهارت‌های مهندسی‌ام استفاده کردم. کمی بعد موفق به دریافت اسکن‌هایی جایگزین از گری نف برای بخش‌های ناخوانا شدم و خوشبختانه فهمیدیم که قسمت اول به صورت کاملاً صحیح به اتمام رسیده بود.

نتیجهٔ این تلاش‌ها، در دسترس قرار گرفتن این کدها برای هر پژوهشگر یا فرد علاقمند بوده است و این در حالی است که برکی حتی یک شبیه‌سازی از AGC را پیاده‌سازی کرده است تا علاقمندان با دید بازتری بتوانند به مطالعهٔ سورس‌کد آپولو ۱۱ بپردازند.

با وجود بزرگی و موفقیت کار برکی، بازهم کد‌های این نرم‌افزار برای بسیاری از برنامه‌نویسان امروزی گمنام بود تا اینکه سرانجام، چندی بعد کریس گری کدهای نرم‌افزار را در گیت‌هاب منتشر کرد (کریس گری که کارمند سابق ناسا است، کدهای AGC را به صورت کامل در اکانت خود در وب‌سایت گیت‌هاب گذاشته است). به طور مثال، سورس‌کد فایلی تحت عنوان P12.agc به شرح زیر است:

# Copyright:	Public domain.
# Filename:	P12.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:	838-842
# Mod history:	2009-05-23 HG	Transcribed from page images.
#
# 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 838
		BANK	24
		SETLOC	P12
		BANK

		EBANK=	DVCNTR
		COUNT*	/P12P12LMTCPHASCHNGOCT04024TCBANKCALLCADRR02BOTHTCUPFLAGADRESMUNFLAGTCUPFLAGADRESACC4-2FLTCUPFLAGADRESR10FLAGTCCLRADMODTCDOWNFLAGADRESRNDVZFLGCAFTHRESH2TSDVTHRUSHCAFFOURTSDVCNTRCAZEROTSTRKMKCNTCAFV06N33ATCBANKCALLCADRGOFLASHTCFGOTOP00HTCF+2TCF-5TCPHASCHNGOCT04024TCINTPRETCALLGUIDINITSETCALLFLPIP12INITP12LMBDLOAD(TGO)ASTODLTGOTIGSTCALLTDEC1LEMPRECVLOADMXVVATTREFSMMATVSL1STOVLV1SRATTMXVVSL6REFSMMATSTCALLRMUNGRAVVLOADUNITRSTCALLUNIT/R/YCOMPSRDCOMP5DSTODLXRANGEVINJNOMSTODLZDOTDRDOTDNOMSTORERDOTDEXITTCPHASCHNGOCT04024NEWLOADCAFV06N76TCBANKCALLCADRGOFLASHTCFGOTOP00HTCF+2TCFNEWLOADCAFP12ADRESTSWHICHTCPHASCHNGOCT04024TCINTPRETDLOADSLXRANGE5DDADYSTOVLYCOUNIT/R/VXSCVAD49FPSV1SSTOREVDOTSL1UNIT/R/STOVLRDOTUNIT/R/VXVUNITQAXISSTOREZAXIS1SETGOFLVRASCENTP12RETDLOADATPDSQPDDLATYDSQDADBZESQRTYAWDUNSL1BDDVATYARCSINYAWDUNSTOVLYAWUNFC/2UNITDOTUNIT/R/SL1ARCCOSDCOMPSTOREPITCHEXITTCPHASCHNGOCT04024TCDOWNFLAGADRESFLPIINHINTTCIBNKCALLCADRPFLITEDBRELINTTCPOSTJUMPCADRBURNBABYP12INITDLOAD(1/DV)ASTORE1/DV3STORE1/DV2STODL1/DV1(AT)ASTODLAT(TBUP)ASTODLTBUPATDECAYDCOMPSL11DSTORETTOSLOADDCOMPAPSVEXSR2STOREVEBOFFRVQFLAPCOMMINITCOMMINITDLOADDADHINJECT/LAND/STODLRCOHI6ZEROSSTORETXOSTOREYCOSTORERDOTDSTOVLYDOTDVRECTCSMVXVMXVRRECTCSMREFSMMATUNITSTOREQAXISRVQP12ADRESREMADRP12TABLESETLOCP12ABANKCOUNT*/P12

P12LM		TC	PHASCHNG
		OCT	04024

		TC	BANKCALL
		CADR	R02BOTH		# CHECK THE STATUS OF THE IMU.
		
		TC	UPFLAG		
		ADRES	MUNFLAG
		
		TC	UPFLAG		# INSURE 4-JET TRANSLATION CAPABILITY.
		ADRES	ACC4-2FL
		
		TC	UPFLAG		# PREVENT R10 FROM ISSUING CROSS-POINTER
		ADRES	R10FLAG		# OUTPUTS.
		
		TC	CLRADMOD	# INITIALIZE RADMODES FOR R29.
		
		TC	DOWNFLAG	# CLEAR RENDEZVOUS FLAG FOR P22
		ADRES	RNDVZFLG
		
		CAF	THRESH2		# INITIALIZE DVMON
		TS	DVTHRUSH
		CAF	FOUR
		TS	DVCNTR

		CA	ZERO
		TS	TRKMKCNT	# SHOW THAT R29 DOWNLINK DATA IS NOT READY.
		CAF	V06N33A
		TC	BANKCALL	# FLASH TIG
		CADR	GOFLASH
		TCF	GOTOP00H
		TCF	+2		# PROCEED
		TCF	-5		# ENTER

		TC	PHASCHNG
		OCT	04024

		TC	INTPRET
		CALL			# INITIALZE WM AND /LAND/
			GUIDINIT
		SET	CALL
			FLPI
			P12INIT
# Page 839
P12LMB		DLOAD
			(TGO)A		# SET TGO TO AN INITIAL NOMINAL VALUE.
		STODL	TGO
			TIG
		STCALL	TDEC1
			LEMPREC		# ROTATE THE STATE VECTORS TO THE
		VLOAD	MXV		# IGNITION TIME.
			VATT
			REFSMMAT
		VSL1
		STOVL	V1S		# COMPUTE V1S = VEL(TIG)*2(-7) M/CS.
			RATT
		MXV	VSL6
			REFSMMAT
		STCALL	R		# COMPUTE R = POS(TIG)*2(-24) M.
			MUNGRAV		# COMPUTE GDT1/2(TIG)*2(-T)M/CS.
		VLOAD	UNIT
			R
		STCALL	UNIT/R/		# COMPUTE UNIT/R/ FOR YCOMP.
			YCOMP
		SR	DCOMP
			5D
		STODL	XRANGE		# INITIALIZE XRANGE FOR NOUN 76
			VINJNOM
		STODL	ZDOTD
			RDOTDNOM
		STORE	RDOTD
		EXIT

		TC	PHASCHNG
		OCT	04024

NEWLOAD		CAF	V06N76		# FLASH CROSS-RANGE, AND APOLUNE VALUES.
		TC	BANKCALL
		CADR	GOFLASH
		TCF	GOTOP00H
		TCF	+2		# PROCEED
		TCF	NEWLOAD		# ENTER NEW DATA.

		CAF	P12ADRES
		TS	WHICH

		TC	PHASCHNG
		OCT	04024

		TC	INTPRET
		DLOAD	SL
			XRANGE
			5D
		DAD
# Page 840
			Y
		STOVL	YCO
			UNIT/R/
		VXSC	VAD
			49FPS
			V1S
		STORE	V		# V(TIPOVER) = V(IGN) + 57FPS (UNIT/R/)
		DOT	SL1
			UNIT/R/
		STOVL	RDOT		# RDOT = 2(-7)
			UNIT/R/
		VXV	UNIT
			QAXIS
		STORE	ZAXIS1
		SETGO
			FLVR
			ASCENT
P12RET		DLOAD
			ATP		# ATP(2)*2(18)
		DSQ	PDDL
			ATY		# ATY(2)*2(18)
		DSQ	DAD
		BZE	SQRT
			YAWDUN
		SL1	BDDV
			ATY
		ARCSIN
YAWDUN		STOVL	YAW
			UNFC/2
		UNIT	DOT
			UNIT/R/
		SL1	ARCCOS
		DCOMP
		STORE	PITCH
		EXIT
		TC	PHASCHNG
		OCT	04024

		TC	DOWNFLAG
		ADRES	FLPI
		
		INHINT
		TC	IBNKCALL
		CADR	PFLITEDB
		RELINT

		TC	POSTJUMP
		CADR	BURNBABY

P12INIT		DLOAD			# INITIALIZE ENGINE DATA.  USED FOR P12 AND
# Page 841
			(1/DV)A		# P71.
		STORE	1/DV3
		STORE	1/DV2
		STODL	1/DV1
			(AT)A
		STODL	AT
			(TBUP)A
		STODL	TBUP
			ATDECAY
		DCOMP	SL
			11D
		STORE	TTO
		SLOAD	DCOMP
			APSVEX
		SR2
		STORE	VE
		BOFF	RVQ
			FLAP
			COMMINIT
COMMINIT	DLOAD	DAD		# INITIALIZE TARGET DATA.  USED BY P12, P70
			HINJECT		# AND P71 IF IT DOES NOT FOLLOW P70.
			/LAND/
		STODL	RCO
			HI6ZEROS
		STORE	TXO
		STORE	YCO
		STORE	RDOTD
		STOVL	YDOTD
			VRECTCSM
		VXV	MXV
			RRECTCSM
			REFSMMAT
		UNIT
		STORE	QAXIS
		RVQ
P12ADRES	REMADR	P12TABLE

		SETLOC	P12A
		BANK
		COUNT*	/P12

GUIDINIT	STQ	SETPD
			TEMPR60
			0D
		VLOAD	PUSH
			UNITZ
		RTB	PUSH
			LOADTIME
		CALL
			RP-TO-R
# Page 842
		MXV	VXSC
			REFSMMAT
			MOONRATE
		STOVL	WM
			RLS
		ABVAL	SL3
		STCALL	/LAND/
			TEMPR60

49FPS		2DEC	.149352 B-6	# EXPECTED RDOT AT TIPOVER
VINJNOM		2DEC	16.7924 B-7	# 5509.5 FPS(APO=30NM WITH RDOT=19.5FPS)
RDOTDNOM	2DEC	.059436 B-7	# 19.5 FPS

پس از انتشار، صرفاً پس از چند ساعت برنامه‌نویسان کنجکاو شروع به کالبدشکافی نرم‌افزار و به ویژه کامنت‌های نوشته شده توسط برنامه‌نویسان اصلی این کدها کردند. جالب اینجا است که بسیاری از کامنت‌های نوشته شده در میان کدهای AGC از توضیحات خسته‌کننده دربارهٔ این نرم‌افزار عبور کرده و به شوخی‌ها و پیام‌هایی طنز و البته با ماهیت همان سال‌های دههٔ 1960 تبدیل شده‌اند! بعضی از این شوخی‌ها و کامنت‌های طنز را می‌توانید در وب‌سایت QUARTZ ببنید.

با قرار گرفتن این کدها روی گیت‌هاب، برنامه‌نویسان می‌توانند تغییراتی در کدها را پیشنهاد کنند و البته مشخص است که تا الان هم بسیاری این کار را انجام داده‌اند! شما هم با ورود به صفحه‌ٔ گیت‌هاب Apollo 11 می‌توانید مسائلی که دیگر برنامه‎‌‌نویسان مطرح کرده‌اند را ببینید، نگاهی به کدهای اسمبلی این پروژه بیندازید یا به اصلاح آنها کمک کنید!

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon