Apollo指导计算机-体系结构和系统软件。 第二部分

链接到第1部分

在这一部分中,我们将从程序员的角度研究AGC的组织方式。 本文第一部分末尾给出了参考文献和资料来源列表。 这部分的内容是基于本书的内容[1]。



AGC内存中数字的表示


AGC使用15位字,第15位带有符号。 还有一个奇偶放电,它由硬件记录和控制,并且对于软件是完全透明的,每次读写操作都对内存进行。



整数以“加法1”的格式表示。 如下:

从0到16383的非负数分别以从000 000 000 000 000 000到011 111 111 111 111的代码形式表示。

负数是通过反转正数形成的,即 -1表示为111111111111111,最多-16383,表示为二进制代码100,000,000,000,000。

算术运算如下执行:

2: 000 000 000 000 010 -5: 111 111 111 111 010 111 111 111 111 100 (= -3) 

将两个负数相加会更加复杂。

如果我们按照通常的规则添加,那么将不会有任何结果:

 -2: 111 111 111 111 101 -5: 111 111 111 111 010 111 111 111 110 111 (= -8) 

但是,您可能会注意到,最高有效位的相加会产生一个进位位。 我们只需要添加进位即可获得正确的结果:

 -2: 111 111 111 111 101 -5: 111 111 111 111 010 111 111 111 110 111 (= -8) Carry 1 111 111 111 111 000 (= -7) 

您还会注意到,在该系统中可能会出现正零和负零的情况,这给程序员带来了额外的困难,例如,在将操作结果与零进行比较时。

还可以监视算术运算期间的电池溢出,这将在下面进行讨论。

ACG仅支持整数算术运算,不能在硬件中执行带实数的运算,但可以在软件中执行。 AGC使用28位数字的二进制十进制表示形式(9个小数位),它占用两个存储单元,每个存储单元14位。 还使用符号数字,低位单词和高位单词可以具有不同的符号! 也就是说,可能存在一个表示为例如+5 * 10000 + -5 * 100 = 49500的数字。很奇怪,但是可能。

公制中显示了计算的距离和速度,而船员的数据则以英制(英尺等)显示。


指令格式

记忆模型


在前面的部分中,已经提到过计算机存储器分为2 Kslov RAM和36 K word ROM。 由于该指令仅占用12位地址值,因此使用了将存储器划分为存储体的原理。 特殊寄存器用于指示当前库。

要切换到新的存储体,请使用“转移到新的存储体”(TNB)命令,该命令执行以下操作:

  • 将当前的银行注册(“银行”)复制到注册“已保存的银行”
  • 将TNB命令之后的存储位置中的12位地址复制到“返回地址”寄存器中
  • 我们将新的存储区地址加载到存储区寄存器中,并将TNB指令指示的偏移量加载到指令计数器中。

寄存器


AGC具有映射到地址空间的寄存器。 它们占据了物理内存的前48个字。

电池占用地址0 8

电池用于大多数算术和逻辑运算(“或”,“与”等)。 尽管AGC使用15位字操作,但是电池具有16位容量,因为它存储了溢出放电。 当数据装入电池时,它会落入低位,第14位包含数字的符号。 执行算术运算后,如果未发生溢出,则位15将仅包含该符号的副本,并且该位对于程序员是不可见的。 我们将这些符号数字分别称为S1和S2。 如果发生溢出,则S1和S2将不相等。 尽管S2位对于程序员来说仍然是不可见的,但是在AGC中,有多达两种设置溢出状态的方式。

首先,当发生溢出时,中断被自动禁止。 如果此时发生中断处理程序,则可能会重置该位,这是非常不希望的。 仅当清除溢出标志时才允许中断。 仅当清洁电池或装入新值时,才重置该标志。 要检查溢出标志,可以使用传输到存储(TS)命令,该命令仅在没有溢出时才将电池值保存到内存中,并且如果向上或向下发生溢出,则将电池中的值替换为+1或-1相应地。 如果发生溢出,TS命令还将跳过下一条程序指令。 假定程序员将编写处理溢出的代码,并通过来自TS的一个命令将其放置,然后在TS紧接在溢出处理程序之后将一条跳转插入该指令。

寄存器L-地址00001 8

L寄存器也称为“低阶累加器”,旨在扩大执行操作的数字范围。 它也可以用于临时存储变量。

寄存器Q-地址00002 8

寄存器Q用于存储返回地址。 寄存器Q包含一个12位地址,该地址与当前存储体一起提供了子例程的完整返回地址。

EBANK (可擦除存储银行) 寄存器 -地址00003 8

RAM(在AGC中也称为“可擦除存储器”)包含2048个字,分为8组,每组256个字。 RAM存储区的地址为3位,包含在EBANK寄存器中。

注册FBAN K(固定存储库)-地址00004 8

ROM具有1024个字的存储区,并包含36个存储区。 FBANK寄存器具有5位,并允许您寻址32个存储区。

固定扩展位 (超级银行位)

用于寻址最后的4Kslov ROM。

BBANK寄存器 (两家银行的寄存器)-地址00006 8

将控制权转移到另一个程序时,必须同时更改FBANK和EBANK寄存器。 BBANK寄存器包含两个地址-RAM和ROM的存储区号。 对其进行写操作将自动更新FBANK和EBANK寄存器。

寄存器Z (程序计数器)-00005 8

寄存器Z是程序计数器,即它确定当前正在执行的命令的地址。 它具有12位的容量。

零寄存器源)-地址00007 8

包含常数0。

中断处理程序寄存器 -地址00008 8-00012 8

寄存器ZRUPT,BRUPT,ARUPT,LRUPT,QRUPT和BANKRUPT分别位于这些地址。

寄存器ZRUPT和BRUPT-自动保存寄存器Z(指令计数器)和寄存器B(内部寄存器,其中包含接下来要执行的命令的地址)的内容。

寄存器ARUPT,LRUPT,QRUPT和BANKRUPT用于节省电池,而寄存器L,Q和BB用于保存电池。 必须手动保存并手动恢复这些寄存器,直到执行RESUME语句为止,该语句用于从中断返回。

在中断处理期间,AGC禁用中断,直到执行RESUME语句。 因此,单独的中断处理程序不能被中断。

前面提到电池的容量为16位,最高有效位用于检测溢出,并且无法以编程方式使用。 但是,中断期间用于存储电池的ARUPT寄存器具有15位。 每次发生溢出情况时,都将禁止中断,直到清除溢出标志为止。

ARUPT,LRUPT,QRUPT和BANKRUPT寄存器不能在中断处理程序之外使用。 从物理上讲,它们仍然可以访问,但是从主程序的角度来看,它们的状态在任意时间点都会改变。

编辑寄存器 -地址00020 8-00023 8

前三个寄存器是移位寄存器:向右循环,向右移位,向左循环,即,向右循环移位,向右移位和向左循环移位。 AGC指令系统没有移位操作,为了将数字移位一位,必须将其写入这些寄存器之一,然后进行计数。 每个记录移位一位。

EDOP寄存器 (EDit解释性OPcode)是编辑寄存器的第四位。

解释器命令(将在下面讨论)存储在一个字中,两个为两个,每个占用7位。 带掩码的AND操作足以读取低阶命令,但高阶将需要移位7位。 EDOP寄存器一次执行此移位。

无法在中断处理程序中使用编辑寄存器,这就是原因。 常规寄存器应保存在处理程序的开头,并在退出处理程序时恢复。 但是,编辑寄存器在写入数据时会对数据执行操作,这将导致被中断程序的错误运行。

计时器和时钟


实时时钟


AGC不使用日历时间,天,月和年。 相反,倒数是从“零”点开始的,该点从开始前几个小时开始。 时钟以两个字显示在内存中,地址为00024 8 (T2),00025 8 (T1)。 当单词T1满时,单词T1每10毫秒增加一次,单词T2大约每164秒增加一次。

计时器


00026 8 (T3)等待列表-每10毫秒递增一次,相对于T4RUPT偏移5毫秒
00027 8 (T4)T4RUPT-每10毫秒递增一次。
00030 8 (T5)自动驾驶仪-每100毫秒增加一次。
00031 8 (T6)高分辨率时钟-每1/1600 s = 0.625 ms递增。

要使任务列表(等待列表)工作,需要第一个计时器T3。 等待列表是非常短的任务的列表,每个任务花费很短的时间,可以直接在中断处理程序中执行。 该列表最多包含七个任务,每个任务以一定的间隔开始。 任务执行时间严格限制为4 ms。 在这段时间内,计算机设法完成约160条指令。

T4计时器可运行20至120毫秒的关键周期性任务,包括与DSKY进行数据交换,船上控制面板上的轮询开关以及其他任务。

惯性测量单元IMU(惯性测量单元)


IMU是带有加速度计的陀螺稳定平台,用于确定船舶在太空中的位置和加速度。



在此我们将不描述陀螺仪的工作原理,仅注意陀螺仪的轴的位置是由CDU(耦合数据单元)设备测量的。 当陀螺仪旋转时,该设备会产生脉冲,每转产生32768个脉冲,对应于每个脉冲39.55弧秒的分辨率。

CDU还将六分仪和进近雷达的轴位置发送到AGC。 由于六分仪仅位于命令模块中,而雷达仅位于月球模块中,因此它们使用相同的AGC端口。

IMU还具有三个摆锤式加速度计(脉冲积分摆锤式加速度计,PIPA)。 但是有一点微妙之处。 尽管月球模块和命令模块具有相同的IMU,但它们的速度测量范围不同。 命令模块的IMU速度范围从0到11000 m / s,对于月球模块-高达1700 m / s。 命令模块的IMU分辨率为5.85厘米/秒,对于月球模块-1厘米/秒。

CDUS(X,Y,Z,OPTIS,OPTT)和PIPAS计数器(X,Y,Z)


从CDU到AGC的数据传输如下:来自传感器的脉冲可以递增和递减计数器。 计数器中的数字带有指示运动方向的符号。 计数器位于内存中的特定地址,并且可以通过编程方式读取。 总共使用了8个计数器,其中六个显示速度和角度,两个用于显示六分仪在命令模块中的角度位置或在月球模块中的进近雷达。

通过柜台进行设备管理


CDU可以在两个方向上工作,例如,它不仅可以确定近程雷达的位置,还可以从计算机的内存中读取寄存器的内容,并向雷达驱动电机施加电压,直到以所需的角度安装雷达为止。

其他计算机接口


月球模块具有一个手柄(姿态控制器组件,ACA),可以通过编程方式读取其位置。 该控制器的每个轴都将值发送到变量P_RHCCTR,Q_RHCCTR和R_RHCCTR。


ACA控制器


ACA控制器外观

仅在月球模块中安装了ACA控制器

INLINK(遥测传输通道)


INLINK设备提供与地球的双向通信,并用于传输遥测信息并从飞行控制中心接收数据。 宇航员可以通过DSKY输入飞行所需的数据,但是此过程很慢且充满错误。 通过INLINK寄存器,数据可以直接从地球输入到计算机中。

引擎管理


在登月舱模块着陆过程中,AGC不断计算牵引力的必要值,并将控制信号发送给发动机。 在着陆持续的12分钟内,发动机燃烧了大约一半的燃料,该程序应考虑质量的降低。 发动机推力从92.5%到46,700 N不等,高达全推力的10%。 但是超过65%的推力会导致燃烧室和喷嘴严重磨损,因此AGC程序应将发动机处于此模式的时间减至最少。

该计算机通过下降引擎控制组件(DECA)连接到着陆平台引擎。 通过THRUST寄存器进行管理。 机组人员可以通过推力/平移手控制器(TTHC)手动调节推力值。


推力/平移手控制器(TTHC)。


推力/平移手控制器(TTHC)。 外表

控制器手柄直接连接到DECA,计算机看不到手动输入的值。

模拟装置


模拟指示器ALTM(模拟显示:高度计和速率表)也用于指示AGC通过ALTM寄存器控制的高度和高度变化率。 模拟指示器以垂直刻度(卷尺)的形式制成。


高度和垂直速度指示器

地址和存储库


如前所述,AGC具有两种类型的内存:RAM(也称为“可擦除内存”)和ROM(固定内存)。 存储器容量为38 Kslov,由于命令字中的地址长度为12位,因此不允许直接寻址整个存储器。

为了将存储器分成存储区,使用了存储区寄存器EBANK和FBANK,它们分别指定RAM和ROM的存储区。 这扩展了32Kwords的地址空间,并且为了进一步扩展ROM地址空间,使用了固定扩展位,它允许访问36Kwords。

RAM库


RAM的容量为2K字,分为8组256字。


RAM地址解密

要寻址RAM存储区中的一个字,需要8位。 需要另外两位来确定存储体的类型:不可切换(未切换)或可切换(已切换)。 上图中的第9位和第10位对此负责(请注意,这些位从1开始编号)。 如果这些位包含00、01和10,则不使用EBANK寄存器,如果使用11,则将EBANK的内容与命令字中记录的8位地址组合在一起,如下图所示。 如果未使用EBANK寄存器,则将调用前三组存储区,这被称为误导性术语“固定可擦除”。 要访问RAM,必须将位11和12设置为0。


使用EBANK寄存器解密RAM地址

只读存储器


要访问ROM,可以使用类似的方法。 控制字的第11位和第12位确定使用哪些存储体,如果这些位包含00,则使用RAM,如上一节所示,如果第10位或第11位,则将所有12位都用作ROM中的地址,则不使用FBANK寄存器,如果为01,则使用由控制字的低10位和FBANK寄存器的内容组成的地址。


ROM地址解密


使用FBANK寄存器解密ROM地址

普通银行


用于存储体的内存分离方案的重要副产品是能够将ROM和RAM的存储体连接到相同的地址空间,并且无需切换存储体寄存器就可以使用RAM。 该图说明了这种方案的工作原理。


在相同地址空间中使用RAM和ROM的方案

记忆力超过32个字


要访问超过32个字的存储器,ROM扩展位固定扩展位用作超级存储位。 超级库位位于输入/输出通道7的位7中。通道7与其他通道的不同之处在于它支持读取和写入。 当然,在中断处理期间和切换任务时都必须保存ROM扩展位。

银行之间的控制权转移


请注意FBANK,Z和BB寄存器在低位内存中的排列顺序。 似乎为什么不将它们组合成一个单词呢? 但这是故意创建控件传递机制的。 切换到另一银行时,新值应设置为FBANK和EBANK或BBANK。 但是,这引起了问题。 例如,假设程序在ROM 07的存储区中的地址01033 8上运行,并且您需要转到ROM 13的存储区中的地址023718。如果更改了寄存器Z,它将控制权转移到当前存储区中的地址02371 8 ,而我们不需要。 如果我们先转换当前银行,就会出现类似情况。 Z寄存器和存储库必须同时切换。 为此,请使用DXCH指令,该指令读取电池和寄存器L,并与内存中两个连续的位置交换它们的内容。 因此,可以与一对FBANK,Z或一对Z,BB交换电池和寄存器L。 这些选项由两种助记符编码:双传输控制切换两个存储区(DTCB)和双传输控制切换固定存储区(DTCF)。 DTCB命令不仅允许您转到另一个地址,而且还可以更改RAM库,而DTCF命令将转移控制权,而使RAM库保持不变。 该函数的返回如下。 Z和BBANK(或FBANK)的初始值被写入累加器和寄存器L。被调用的函数必须保存这些值,然后通过与bank和Z的寄存器交换值来进行相反的操作。

AGC架构的一些缺点


大多数计算机体系结构都有堆栈指针和/或索引寄存器(至少一个)。 但不是在AGC。 堆栈指针支持将需要其他硬件。 没有索引寄存器允许组织访问地址(指针+偏移量)上的数据结构,但是有一个INDEX命令可以消除对这种寄存器的需要。 , , Interpreter, .

AGC . , , (). AGC , , .


4000 8 Startup
AGC

4004 8 T6RUPT
TIME6 0. .

4010 8 T5RUPT
TIME5 . .

4014 8 T3RUPT
TIME3 . WAITLIST.

4020 8 T4RUPT
TIME4 . DSKY

4024 8 KEYRUPT1
DSKY. DSKY 15

4030 8 KEYRUPT2
DSKY. DSKY 16 ( )

4034 8 UPRUPT
INLINK
DSKY

4040 8 DOWNRUPT
Downlink . AGC

4044 8 RADARUPT
RNRAD.

4050 8 RUPT10
LM P64


, Order Code, , , , . . , Q-Code.

000 , 011, 100 111 , 001, 010, 101 110 Q-.


Q-

. , , . , TC (transfer control), , , (Enable Interrupts).

, . 00006 8 , , 00006 8 . , , , . , .



AGC 41 . 6 :

  • -
  • -

AGC. [1].

: -


AGC , -. AGC , , , DSKY . , .

. , , . -, IMU, . , AGC.


AGC

- EXTEND . 000, PCode. PCode , PCode . 9 — . AGC, , 512 , 16. 15- , , - AND, OR Exclusive OR. -. WOR (Write with OR), WAND (Write with AND), ROR (Read and OR) RXOR (Read and XOR).

- . L (low-order accumulator), , , , . AND, OR XOR.

- . , DSKY 5 . DSKY KEYRUPT, .

, , uplink downlink, 51 /c 1900 / ( ).

软体类




AGC Executive Interpreter. .

Source: https://habr.com/ru/post/zh-CN462421/


All Articles