新手考古路线图:3 步定位登月舱降落代码 BURN, BABY, BURN——从 Luminary099 源码索引到 P63 着陆算法

新手考古路线图:3 步定位登月舱降落代码 BURN, BABY, BURN——从 Luminary099 源码索引到 P63 着陆算法

【免费下载链接】Apollo-11Original Apollo 11 Guidance Computer (AGC) source code for the command and lunar modules.项目地址: https://gitcode.com/GitHub_Trending/ap/Apollo-11

2019 年 7 月,为纪念人类登月 50 周年,阿波罗 11 号制导计算机(AGC)的原始汇编源码被上传至 GitHub 并连续霸榜趋势热区。这个仓库里没有一行 C 语言,只有数千页由 NASA/MIT Instrumentation Laboratory 工程师逐页敲出的 AGC 汇编——指令舱跑 Colossus 2A(Comanche055),登月舱跑 Luminary 1A(Luminary099)。对很多新手来说,第一次打开它时的体验是崩溃的:几十个名为P20-P25.agc、R60_62.agc的大写文件,动辄上千行的TCF/CAF/DXCH助记符,既没有函数签名也没有调用图。

但恰恰是这套代码,在 1969 年 7 月 20 日把鹰号登月舱从环月轨道安全降落到静海。其中最关键的一段,就是那个以电台 DJ 口头禅命名的点火主流程BURN, BABY, BURN。这篇文章将沿着一条「索引 → 入口 → 运行时」的三步路线,带你亲手定位 P63 着陆程序与点火模块,看懂 DSKY 上闪烁的告警码背后到底发生了什么。

第一步:把 Luminary099 当成「按页组织的线装书」来读

这个仓库的根目录下躺着两套源码,Luminary099 就是登月舱那一套。与今天的工程惯例不同,它没有任何目录层级——80 多个.agc文件平铺在一个目录里,而真正的「索引」恰恰藏在其中两个文件里。

打开 Luminary099/README.md,你会看到一张完整的Source Code Index表:每个源文件都对应一份原始纸质扫描清单上的页码区间。例如:

源文件原始页码
BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc731–751
THE_LUNAR_LANDING.agc785–792
P40-P47.agc752–784
LUNAR_LANDING_GUIDANCE_EQUATIONS.agc798–828
EXECUTIVE.agc1103–1116
ALARM_AND_ABORT.agc1381–1385

为什么按页组织?因为这套代码是从 MIT 博物馆保存的纸质硬拷贝逐页扫描、逐行转录出来的(README 中记录了 Paul Fjeld 负责数字化、Deborah Douglas 促成此事的来历),页码就是回溯原始扫描件的事实依据。

理解这套代码的组织方式,还有一个更本质的入口:Luminary099/MAIN.agc。它只有 91 行,内容是从$ASSEMBLY_AND_OPERATION_INFORMATION.agc到$SPS_BACK-UP_RCS_CONTROL.agc的完整$包含清单,即所谓的monolithic 单体构建——所有子程序被汇编器拼进一个可执行映像,而不是各自汇编后链接。README 对此解释得很直白:当年开发团队根本没有链接器。复用代码的方式是把你的那叠打孔卡插到别人的那叠打孔卡里。所以当你看到某个符号(比如BURNBABY)在多个文件间跳转时,别惊讶,这就是 1960 年代的「模块化」。

第二步:沿 WHICH 寄存器追踪 P63 → BURNBABY 的调用链

有了索引,定位就有了抓手。P63(着陆制动段,BRAKING PHASE)的入口在 THE_LUNAR_LANDING.agc 第 785–792 页,文件头注释直接标注了它的身份:P63: THE LUNAR LANDING, BRAKING PHASE。它的入口标签是P63LM:

P63LM TC PHASCHNG # 进入 P63 阶段 OCT 04024 TC BANKCALL # 执行 IMU 状态检查 R02 CADR R02BOTH CAF P63ADRES # 初始化 WHICH 供 BURNBABY 使用 TS WHICH ... TC POSTJUMP # 交给点火主流程 CADR BURNBABY

注意CAF P63ADRES/TS WHICH这两条:WHICH是 ERASABLE_ASSIGNMENTS.agc 中定义的擦写寄存器(WHICH ERASE # B(1),地址 E4),而P63ADRES是GENADR P63TABLE——它把本程序专属配置表的地址放进WHICH,然后跳进点火主流程。这就是 AGC 实现「多程序复用一段公共代码」的方式:点火逻辑只写一遍,程序差异全部收敛到一张常量表里。

现在跳到 BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc(第 731–751 页)。文件头注释把设计意图交代得一清二楚:

THE MASTER IGNITION ROUTINE IS DESIGNED FOR USE BY THE FOLLOWING LEM PROGRAMS: P12, P40, P42, P61, P63. IT PERFORMS ALL FUNCTIONS IMMEDIATELY ASSOCIATED WITH APS OR DPS IGNITION... BETWEEN THE PRE-IGNITION TIME CHECK -- ARE WE WITHIN 45 SECONDS OF TIG? -- AND TIG + 26 SECONDS, WHEN DPS PROGRAMS THROTTLE UP.

也就是说,这个模块覆盖从「点火前 45 秒时间检查」到「TIG+26 秒 DPS 全油门」的整段窗口。而 P63 的专属表P63TABLE就在文件第 127 行:

P63TABLE VN 0662 # (0) TCF ULLGNOT # (1) TCF COMFAIL3 # (2) TCF V99RECYC # (3) TCF TASKOVER # (4) TCF P63SPOT # (5) DEC 2240 # (6) EBANK= WHICH 2CADR SERVEXIT # (7) ... TCF P63IGN # (13)

主流程BURNBABY通过INDEX WHICH+TCF 5之类的指令按索引取表项,从而把 P12/P40/P42/P63 各自的点火行为区分开。所谓「索引化调度」在今天的表驱动编程里稀松平常,但在 1969 年、在只有 15 位字的机器上,这就是软件工程的最高段位。

顺着表项继续追,你能看到完整的点火时间线:

  • TIG-35 ~ TIG-30:设置TIG-35/TIG-30任务点,为重启(restart)留下OCT 20254、OCT 40154之类的阶段标志(PHASCHNG 参数),并在 TIG-35 清屏 5 秒提示「平均 G 计算开始」;
  • TIG-5:TWIDDLE挂起TIG-0任务,同时通过INDEX WHICH / TCF 11进入程序各自的显示切换逻辑;
  • TIG-0(点火时刻):设置IGNFLAG,再TC CHECKMM / DEC 63判断「是不是 P63」——是则启动P63ZOOM(把着陆制导LUNLANAD挂到AVEGEXIT,执行FLATOUT);
  • IGNYET?:检查ASTNFLAG,宇航员是否已在 DSKY 上确认「启动引擎」请求;
  • IGNITION:设置ENGONFLG,往DSALMOUT写入BIT13打开引擎,并用TGO修正TIG;
  • P63IGN(表项 13):初始化燃烧显示、把TIG设为当前时刻供 P70/P71 使用、清空WCHPHASE/FLPASS0——也就是为后续着陆制导算法重置迭代状态。

值得一提的是,这套点火程序里还埋着两处拉丁文格言:HONI SOIT QUI MAL Y PENSE(心怀邪念者蒙羞)和表区开头的NOLI SE TANGERE(勿触我)——后者更像写给后来者看的「这里别乱改」。

而「BURN, BABY, BURN」这个名字本身也是一段历史:文件头注释记载,在 AGC 开发者 40 周年聚会上,本模块的作者之一 Don Eyles 亲口讲述了命名由来——它源自 1965 年洛杉矶骚乱时期的灵魂乐电台 DJ Magnificent Montague 播放新碟时的招牌口号。一个点火子程序,就这样把太空时代和电台黄金时代串在了一起。

第三步:用 DSKY 告警码把代码「运行」起来

代码读完了,怎么验证自己读对了?答案是回到它的运行时上下文——DSKY(Display and Keyboard)。阿姆斯特朗和奥尔德林盯着的那块布满数字的小键盘,就是 AGC 唯一的「人机界面」。而告警码,正是理解这段代码在真实飞行中遭遇了什么的钥匙。

1969 年 7 月 20 日下降途中,鹰号曾反复响起1201、1202告警。在源码里,这两个码的出处清晰可查——EXECUTIVE.agc 第 147、208 行,任务调度器FINDVAC2找不到空闲 VAC 工作区时:

TC BAILOUT1 OCT 1201 # NO VAC AREAS. ... TC BAILOUT1 # NO CORE SETS AVAILABLE. OCT 1202

这两行代码的含义,对照 ASSEMBLY_AND_OPERATION_INFORMATION.agc 里完整的告警码总表(Page 23–24)可以确认:

# 01201 * EXECUTIVE OVERFLOW - NO VAC AREAS EXEC # 01202 * EXECUTIVE OVERFLOW - NO CORE SETS EXEC

换句话说,1201/1202 是执行器(EXECUTIVE)的资源耗尽告警——任务队列里同时并发的任务太多,申请不到 VAC 区或核心集。它不是导航计算「算错了」,而是调度器「忙不过来」。这就是为什么休斯顿的指导官 Steve Bales 能在几秒内判定「继续着陆」:告警揭示的是资源竞争而非算法故障,而BURNBABY里 P63 特有的DEC 63检查、TIGTASK1用CAF PRIO16抢占任务等设计,正是为了把优先级收拢在点火窗口附近。

告警的实际显示机制则在 ALARM_AND_ABORT.agc(第 1381–1385 页):ALARM子程序的调用约定是TC ALARM+OCT AAANN(AAA 为告警分类、NN 为编号),它点亮 DSKY 上的PROGRAM ALARM灯,但并不打断正在执行的程序——所以告警与点火主流程可以并行共存。

顺着告警码表,你还会发现 P63 专属的几个告警,全部指向本次下降的实时计算:

  • 01412 DESCENT IGNALG NOT CONVERGING (P63):着陆点火算法IGNALG未收敛;
  • 01406 BAD RETURN FROM ROOTPSRS:表里特别注明,在点火算法阶段它是 POODOO(程序进入死亡状态),而在实际制导阶段才是告警;
  • 01703 IGNITION TIME SLIPPED (MIDTOAVE):点火时刻被修正——对应的正是BURNBABY中那段TIG WAS SLIPPED, SO RESET TIG TO 29.9 SECONDS的注释和DCA PIPTIME1 / DXCH TIG代码。

至此,三步路线已经走完:索引(README 源码表)→ 入口(THE_LUNAR_LANDING 的 P63LM)→ 运行时(BURNBABY 点火表 + DSKY 告警语义)。回头看,这套 1969 年的「历史遗留代码」之所以至今仍有阅读价值,恰恰在于它把现代嵌入式开发的几大命题——表驱动、可重启的阶段机(PHASCHNG)、资源受限下的任务优先级、以及人与机器的协作接口——全部压缩在了 64KB、1.024MHz 的极端约束里。读懂 BURN, BABY, BURN,不只是读一段汇编,而是读懂了人类第一次在另一个世界着陆时,软件所扮演的角色。

【免费下载链接】Apollo-11Original Apollo 11 Guidance Computer (AGC) source code for the command and lunar modules.项目地址: https://gitcode.com/GitHub_Trending/ap/Apollo-11

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

投机推理:突破大模型自回归瓶颈的并行验证加速技术

投机推理:突破大模型自回归瓶颈的并行验证加速技术

1. 大模型推理的“车堵一条道”困局老做推理优化的朋友都有过这种体验:GPU 明明算力爆炸强,但每次生成一个 token 都得几毫秒甚至几十毫秒,batch 稍微大一点,延时就像坐火箭一样往上蹿。一开始我们都骂“模型太大了”,…

2026/10/20 7:13:55 阅读更多 →
Spring Boot+微信小程序汽车用品商城开发:从车型适配到支付回调

Spring Boot+微信小程序汽车用品商城开发:从车型适配到支付回调

先说句实在话:汽车用品这个品类,看着和普通电商差不多,但等你真把“Spring Boot 微信小程序”这套销售系统落地时,会发现一堆让人挠头的细节——车型适配怎么做、库存怎么拆、微信支付回调怎么验签、审核类目怎么过。这篇文章不聊…

2026/10/20 7:13:55 阅读更多 →
Delta机器人正逆运动学C#实现:高精度实时解算模块

Delta机器人正逆运动学C#实现:高精度实时解算模块

简介:本资源是一套面向机器人控制开发者与自动化专业学习者的Delta并联机器人运动学算法C#实现工程,聚焦高速拾放场景下的正向/逆向运动学求解这一核心难点。项目以Visual Studio解决方案形式组织,含41个文件,涵盖6个核心C#源码&a…

2026/10/20 7:13:55 阅读更多 →

最新新闻

打印数组最大数:从循环遍历到并行与流式处理的完整指南

打印数组最大数:从循环遍历到并行与流式处理的完整指南

别小看“打印数组最大数”这五个字。我见过太多工作三五年的开发者,写这段逻辑时栽在没人提醒的细节上:数组为空怎么办?全是负数怎么办?元素是浮点数带NaN怎么办?数据量到千万级怎么办?这段代码几乎是所有编…

2026/10/20 8:02:22 阅读更多 →
AI写PLC代码靠不靠谱?三个月实战经验与踩坑总结

AI写PLC代码靠不靠谱?三个月实战经验与踩坑总结

做PLC这行十几年了,最近三个月工作室群里聊得最多的就是AI写程序。一开始我是拒绝的,毕竟现场出问题是要跳闸停机的,谁敢拿一个“聊天机器人”生成的代码往设备上怼?但架不住项目催得紧,某天夜里实在改不动了&#xff…

2026/10/20 8:02:22 阅读更多 →
用DeepSeek降论文AI率:从检测原理到改写实操

用DeepSeek降论文AI率:从检测原理到改写实操

论文AI率飚红怎么办?先别急着满世界找“降痕神器”,我在这篇文章里把DeepSeek知网报告这套搭配的真实用法讲明白。很多同学遇到红色数值的第一反应是焦虑,第二个反应是找提示词“洗稿”,但这路子走偏了。真正能帮你把论文救回来的…

2026/10/20 8:02:22 阅读更多 →
CANUAV C源码解析:UAVCAN协议栈实现与嵌入式避坑指南

CANUAV C源码解析:UAVCAN协议栈实现与嵌入式避坑指南

简介:CANUAV是一套基于C语言实现的UAVCAN协议栈源码,面向在STM32F407平台上开发无人机及自动化设备通信节点的嵌入式工程师。它依托轻量级Canard库完成UAVCAN核心功能,将传感器数据、控制指令、状态报告等消息映射到CAN帧,并实现心…

2026/10/20 8:02:22 阅读更多 →
MIMO通信系统Matlab仿真:Alamouti编码与BER曲线实现

MIMO通信系统Matlab仿真:Alamouti编码与BER曲线实现

简介:这是一套面向通信工程学生与无线通信初学者的MIMO通信系统Matlab仿真实现,基于多天线收发、空间复用/分集与波束赋形构建立可运行链路,帮助理解信道容量提升、抗衰落机制及不同参数对系统性能的影响。压缩包共3个文件,以2个m…

2026/10/20 8:02:22 阅读更多 →
分时电价省钱实操:把家电搬到谷段,一年省几百元

分时电价省钱实操:把家电搬到谷段,一年省几百元

“早上八点的电费涨到一块二了,家里的洗衣机还在嗡嗡转。”这句话如今已经成了我家的自嘲梗。说真的,分时电价这玩意儿,第一次认真刷电费账单的人都会愣一下:一天之内电价居然能上蹿下跳好几回,早上出门前和深夜睡觉前…

2026/10/20 8:01:21 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →