软件介绍

    TEC-2实验系统是清华大学设计研制的16位教学计算机系统，控制器采用微程序方案，支持动态微程序设计。TEC-2实验系统设计新颖，技术水平高，是一套硬件系统和软件系统比较完整的用于教学的算机系统，该系统能克服以往计算机组成原理实验课功能部件相对孤立、硬件整机方面的实验难于开展的缺点，能对计算机系统中硬软件的联系与配合的学习提供足够的帮助。

     TEC-2实验系统有以下缺陷：①升级费用高；②故障率高且维护困难；③无法进行微指令级的调试；④学生无法在课后自行进行实验；⑤功能不易扩充。

     对于TEC-2实验系统的有些不足，如无法进行微指令级的调试，可以通过硬件上的一些改进来支持，但硬件实现起来成本高，使得升级费用高等不足更加突出。因此，有必要寻求一种较好的解决方案。

     根据计算机软硬件逻辑功能等效性原理，使用软件模拟硬件，不失为一种可行方案。使用软件模拟，可以用很低的成本实现同样成本不可能实现的硬件功能，且软件本身不可能出故障，特别是可以根据学生的需要增加各种功能。从软件模拟的种种优势可以看到，软件模拟技术在教学中具有很高的实用价值。

    本模拟机用软件方法模拟硬件系统，成功地实现了TEC-2机上的大部分功能，使得在该模拟机上做实验和在实验室里做实验完全一致，可以作为TEC-2实验课的辅助软件供学生在课后使用。

    本软件界面简洁，和真实机器基本一致，其中监控程序使用PCEC的风格，容易上手。

    由于软件模拟的方便，本软件把TEC-2的主存容量扩充到最大的64K，并在监控程序中加了几条新指令。

     软件分为两部分：联机部分和脱机部分。这两部分可以分离开来，根据需要选择其中一部分或同时使用。 软件制作中主要参考了中山大学胡敏和钱兴贤编的《计算机组成接口与通信实验指导》。


主界面介绍

软件的界面如下：

◆ 16个LED指示灯：在最上面一排，可以显示运算结果、内部总线、地址总线、微指令地址等内容

◆ 两个微型开关SW2和SW1：决定脱机运算器实验时全部的控制与操作。

◆ 显示与功能选择开关：显示选择开关用于选择LED指示灯要显示的内容，功能选择开关用于选择TEC-2机的运行方式，规定如下表

显示选择 |  | 功能选择
S2 S1 S0 开关 |  | FS1 FS2 FS3 FS4 开关
000 001 010 011 100 101 110 111 | B7-B0 P2-P0 SVZC B23-B8 B39-B24 B55-B40 MCA9-0 微令地址 AB15-0 地址总线 RD15-0 运算器输出 IB15-0 内部总线 | ×××1 0000 0010 0100 0110 1000 1010 1100 1110 | 运算器实验 装入微程序 执行微程序 存储器写(单步) 存储器读(单步) 存储器读(连续) 从0地址连续执行 从指定地址单步执行 从指定地址连续执行

◆ CONT/STEP开关：用于决定TEC-2机的主脉冲方式，CONT为连续脉冲方式，STEP为单脉冲方式

◆ STEP按键：在单步时的触发脉冲

◆ RESET按键：把手拨数据送入地址总线

◆ LDMC/RESET按键：重新加载微程序

◆ 监控程序：启动监控程序开始联机实验，只有在FS4-FS1处于1010，CONT/STEP开关为CONT方式时才有效

◆ 16个手拨数据开关：用于手动输入数据，在运算器和存储器实验时使用

◆ 退出按键：退出本软件

另外，在菜单中提供了对显示与功能的直接选择


监控程序界面介绍

监控程序使用控制台界面，在操作方式上和实验室中的PCEC一致


监控程序的功能与用法

    当功能开关FS1-FS4设置为1010状态进，TEC-2机将从0地址开始执行程序，即使监控程序进入运行状态，此后可从键盘打入监控程序命令并使其执行。

    监控程序支持A、U、G、P、T、R、D、E、S、TT、C、H、？、Q 14条命令。

    命令格式为单字母的命令名，或命令名后跟一个地址参数，或寄存器名（编号）参数。当有些命令运行时需要参数，但命令名后不能跟参数时，监控程序会从内存指定单元取一个默认的地址参数值，通常是该命令前一次运行后所接收地址。TEC-2机从终端接收地址、指令、数值时，均用最多4位的16进制数输入与显示，并且不能（或不必）用跟字符h加以标志。

命令 | 功能
A[adr] | 单条汇编
U[adr] | 反汇编
G[adr] | 从指定(或默认)地址连续运行一个程序,直至RET返回
T[adr] | 从指定地址单条执行程序
P[adr] | 从指定地址单条执行程序,但不进入子程序
R[reg] | 显示/修改寄存器内容
D[adr] | 显示存储器内容
E[adr] | 修改存储器内容
S | 新增命令,保存控存中的微指令
TT | 新增命令,微指令级单步执行
C | 新增命令,清屏
H val1 val2 | 新增命令,计算val1与val2的和与差
? | 新增命令,显示帮助
Q | 新增命令,退出监控程序

在命令方式下按F10可以进行文件传送等操作

参考资料：胡敏、钱兴贤《计算机组成接口与通信实验指导》


TEC-2指令系统概述

    TEC-2机指令系统，采用6位操作码，故最多支持64条基本指令，其中53条指令已由设计者实现，微程序固化在ROM芯片中，其余11条留给实验人员执行实现。

    TEC-2机的基本指令格式比较固定。从指令长度区分，有单字指令和双字指令，用户也可以实现三字指令；从操作数的个数区分，有无操作数指令、单操作数指令和双操作数指令；从支持的基本寻址方式区分，有寄存器寻址、寄存器间接寻址、立即数寻址、变址寻址、相对寻址、绝对寻址和堆栈寻址等方式；从指令功能上看，最常用的指令类型和运算是比较齐全的。

    为了方便理解和记忆，把TEC-2机的指令格式归纳为如下形式：

    单字指令仅用一个指令字。
    双字指令用两个指令字，此时第二个指令字的内容可能是立即数、一个绝对地址或一个变址位移量。

    第一个指令字分为三个主要部分。

    最高6位是操作码。从这个意义上讲，TEC-2机的基本指令是固定长度的操作码结构。最多支持64条基本指令。

    中间的两位，即9、8两位是条件码，只能把他用作条件转移指令的判断条件。这两位的值为00、01、10和11时，分别选择以处理机状态字中的C、Z、V和S的值作为判断条件。从这个意义上讲，我们也可以认为这两位是指令的扩展操作码。由于除了条件转移指令之外，其余的指令均不使用这两位，故我们可以用这两位扩展新的指令，而不会影响原来的指令功能。

    最低的8位有多种用法：
    （1）这8位用于给出入/出指令的入/出端口地址。例如，已规定第一个串行口地址为80h和81h，第二个串行口地址为82h和83h。并行口、DMA口等都可以被分配几个合理的地址，以实现入/出接口的各种实验。
    （2）这8位用于给出相对寻址的位移量，其范围是从-128到+127之间，因此相对地址应在当前指令地址向前向后总共256个字的范围之内。实现相对地址计算时，这个位移量的最高位用符号位，补码形式，与16位的当前指令地址（放在IP寄存器中，即增量前的PC值）相加时，这一符号位要扩展到15~8这高8位上去。
    （3）这8位被分为两个4位的字段，用于给出的所用的通用寄存器编号。对双操作数指令，这里可是给出目的与源两个操作数所在的寄存器编号。对单操作数指令，只用源或目的中的一个操作数，此时，可能用到某一个4位字段，另一个4位字段不用。需要强调的一点是，寄存器用于给出操作数、操作数地址，或用作变址寄存器。

参考资料：胡敏、钱兴贤《计算机组成接口与通信实验指导》


TEC-2机指令系统详述

从操作数个数和指令功能两个角度，把TEC-2机基本指令区分为如下6类分别说明：

1．无操作数指令，共11条

NOP | 空操作
PSHF | 状态字入栈
POPF | 状态字出栈
EI | 开中断，INTE←1
DI | 关中断，INTE←0
STC | 进位置1，C←1
CLC | 进位置0，C←0
RET | 子程序返回，PC←[SP]，SP←SP-1
IRET | 中断返回，STR←[SP]，SP←SP-1，PC←[SP]， SP←SP-1
LDMC | 装入微指令代码，所用参数为 R1：微码在主存中首地址 R2：微指令条数 R3：微码写入的控存地址，把主存中给出的一段微代码写入控存中。
HALT | 动态停机指令，PC←IP

2．单操作数指令，有两种格式，共12条

MUL SR | 无符号乘，R1*SR→R0R1，根据R1的值置状态位
DIV SR | 无符号除，R0R1/SR→R0（余数）R1（商），根据R1的值置状态位

PUSH DR | 压入DR
POP DR | 弹出DR
INC DR | DR←DR+1
DEC DR | DR←DR-1
NOT DR | DR求反，DR←DR
SHL DR | DR左移，最低位补0，最高位移入C
ASR DR | DR算术右移，最高位保持不变，最低位移入C
SHR DR | DR逻辑右移，最高位补入0，最低位移入C
RCL DR | DR与C循环左移，C移入最低位，最高位移入C
RCR DR | DR与C循环右移，C移入最高位，最低位移入C

3．双操作数指令，有两种格式，共17条

ADD DR，SR | DR←DR+SR
ADC DR，SR | DR←DR+SR+C
SUB DR，SR | DR←DR-SR
SBB DR，SR | DR←DR-SR-C
CMP DR，SR | DR-SR
AND DR，SR | DR←DR and SR
OR　DR, SR | DR←DR or SR
XOR DR, SR | DR←DR xor SR
TEST DR, SR | DR & SR
MOV DR, SR | DR←SR
MOV DR, [SR] | DR←[SR]
MOV [DR], SR | [DR]←SR

MOV DR, DATA | DR←DATA
MOV DR, [ADR] | DR←[ADR]
MOV [ADR], SR | [ADR]←SR
MOV DR, DATA[SR] | DR←[DATA+SR]
MOV DATA[SR], DR | [DATA+SR]←DR

4. I/O指令,输入输出指令各一条

IN PORT | R0←[PORT]，从外设读入一字节到R0低8位
OUT PORT | [PORT]←R0，把R0的低8位数据写到外设

5. 转移指令，三种格式，共6条

相对转移指令

JR ADR | 无条件相对转移到ADR，ADR为原PC值+位移量
JR CND, ADR | 当条件满足时相对转移到ADR，ADR为原PC值+位移量

JP SR | 无条件转SR所指的地址
JP CND, SR | 当条件满足时转SR所指的地址

按绝对地址实现的转移指令

JP ADR | 无条件转移到ADR地址
JP CND, ADR | 当条件满足时转移到ADR

6. 子程序调用指令，两种格式，共两条

CALL SR 调用SR指明的子程序，SP←SP-1，[SP]←PC，PC←SR

CALL ADR 调用通过ADR指明的子程序，SP←SP-1，[SP]←PC，PC←ADR

上述指令说明中用到的符号包括：

SR 源操作数寄存器 | PC 程序计数器
DR 目的操作数寄存器 | IP PC增量前的值，当前指令地址
OP 指令操作码 | SP 堆栈指针
CND 条件转移指令所用的判断条件。

    对于无条件转移指令，CND位无用。这里要特别说明的一点，是条件码CND为两位，编码00，01，10，11分别表明要判C，Z，V，S四个标志位，而条件转移指令操作码的最低1位用来表明是按这某一标志位为0还是为1才能实现转移，即同一条汇编指令包含两个操作码子，如JP C，SR和JP NC，SR汇编指令名均为JP，但依据条件分别是C和NC，其指令操作码分别是100010和100011。

参考资料：胡敏、钱兴贤《计算机组成接口与通信实验指导》


Am2901的内部组成

图1.1 Am2901芯片的内部组成

Am2901芯片是一个完整的运算器，只是位数较少，具有很好的典型性，作为教学实例是非常理想的。教学机的运算器的主体部分用4片Am2901芯片级联而成, 了解这一芯片的内部组成与运行机制是学习计算机运算器组成与设计的基础。

Am2901芯片是一个4位的位片结构的运算器器件, 其内部组成如图所示。

从图上可以看到, 该芯片的第一个组成成分是一个4位的算逻运算部件ALU, 它的输出为F, 两个输入分别用R和S标记, 还有送入ALU最低位的进位信号Cn。它能实现R+S、S-R、R-S三种算术运算功能, 和R∨S、R∧S、R∧S、R ∨S、R ∨S五种逻辑运算功能。在给出运算结果的同时, 还送出向高位的进位输出信号Cn+4, 溢出标志信号OVR, 最高位的状态信号F3(可能用作符号位), 以及运算结果为零的标志信号F=0000。

该芯片的第二个组成成分是由16个4位的通用寄存器组成的寄存器组。它是一个用双端口(A口和B口)控制读出, 单端口(B口)控制写入的部件。为了对其进行读写, 需通过A地址、B地址指定被读写的寄存器。两路读出数据分辨用A口、B口标记，经锁存器线路可以送到ALU的R、S输入端的多路选择器，A口读出数据还可以用作该芯片的可选输出信号之一。寄存器组的写入数据由一组多路选择器给出，并由B地址选择写入的寄存器。

该芯片的第三个组成成分是4位的Q寄存器,主要用于实现硬件的乘法、除法指令，能对本身的内容完成左、右移位功能，能接收ALU的输出。输出送到ALU 的S 输入端。

该芯片的其余组成成分是5组多路灯选通门, 通过它们, 实现芯片内上述三个组成成分之间的联系，实现该芯片和其外界信息的输入与输出操作, 这包括:

·外部4位的数据经D输入端送入运算器芯片之内，是直接送到ALU的R输入端；

·一组4位的二选一器件控制把运算器内的两路4位输出数据（A口数据、ALU的运算结果数据）送出芯片，标记为Y；

·一组4位的二选一和4位的三选一器件, 分别用于组合外部送来信息D, 通用寄存器组的双路读出信息A和B, 乘商寄存器Q的信息, 以形成ALU的两路输入R和S的值；

·一组4位的三选一器件, 完成从ALU的输出结果, ALU输出结果左移一位的值, ALU输出结果右移一位的值中选择其一, 作为通用寄存器的写入信息, 实现的是通用接存器接收及移位功能。在左右移位时, 其最高位和最低位可以送出或接收相应位的信息, 图上用RAM3和RAM0标记, 它们都是由能进行双向传送的三态门电路实现的；

·一组4位的三选一器件, 用于完成Q寄存器内容的左右移位, 或接收ALU的输出结果的操作功能。在进行左右移位操作时, 与通用寄存器移位类似的是, 这里存在Q3和Q0的双向传送问题。


Am2901的控制与操作

为了控制Am2901运算器按我们的意图完成预期的操作功能,就必须向其提供相应的控制信号和数据。

控制信号包括:

. 选择ALU的八种运算（三种算术、五种逻辑运算）功能中我们所要求的一种。这可通过提供三位功能选择码I5 I4 I3实现。如表2.1所示。

. 选择送入ALU的两个操作数据 R和S的组合关系（实际来源）。表上已标明, R从D和A中选择, S从A、B和Q中选择, 再考虑到两边还均可选"0"值, 则我们可以从这许多可能组合中选取最有用的8种组合, 即A、Q组合, A、B组合, O、Q组合, 0、B组合, 0、A组合, D、A组合, D、Q组合, D、O组合 ，并用I2 I1 I0三位操作数选择码控制二组多路选通门选取其一, 具体规定如表2.1所示。

. 选择运算结果或有关数据以什么方式送往何处的处理方案, 这主要指通用寄存器组和Q寄存器执不执行接收操作或移位操作, 以及向芯片输出信息Y提供的是什么内容。这是通过 I8 I7 I6三位结果选择码来控制三组相应的选择门电路实现的, 具体规定如表2.1所示。

表2.1

外部的数据包括:

(1)通过D接收外部送来的数据, 这已经在ALU的操作数来源选择中解决。

(2)应正确给出芯片的最低位的进位输入信号Cn。

(3)关于左右移位操作过程中的RAM3、RAM0、Q3和Q0的处理, 左移操作时RAM3与Q3为输出, RAM0和Q0为输入；相反, 右移操作时, RAM0和Q0为输出, RAM3和Q3为输入, 这是由I8和I7共同控制的。这几个外部信息的接收与送入，需要在 Am2901芯片之外用另外的电路解决。

(4)四个标志位的值的接收与记忆电路, 需在Am2901芯片之外实现。

(5)当执行通用寄存器组的读操作时，由外部送入的A地址选中的通用寄存器的内容送往A端口,由B地址选中的通用寄存器的内容送往B端口, B地址还用作通用寄存器的写入控制。由于有16个通用寄存器, 故A、B地址均由4位组成。当A、B地址给出同一数值时, 则将选中同一通用寄存器, 此时A、B端口同时输出同一寄存器的内容。

(6)如有通用寄存器组的写操作时, 结果将写入由B地址选择的寄存器中。

(7)芯片的输出数据Y可以从AUL的运算结果F或A口的数据二者之中选择其一。

关于该芯片的具体线路尚需说明如下几点:

(1)芯片结果输出信号的有无还受一个/OE信号的控制, 仅当其为低电平时, 才有Y值输出, 否则输出为高阻态。

(2)标志位F=0000为集电集开路输出, 容易实现“线与”逻辑，此管脚需经过一个电阻接到 + 5V。

(3)RAM3、RAM0、Q3、Q0均为双向（入出）三态逻辑, 一定要与外部电路正确连接。

(4)通用寄存器组通过A端口、B端口读出内容的输出处均有锁存器线路支持, 以保证在执行诸如 A + B结果送 B 运算时操作的正确性。

(5)该芯片还有两个用于芯片间完成高速进位的输出信号/G和/P。

(6)Am2901芯片要用一个CLK（CP）时钟信号作为芯片内通用寄存器、锁存器和Q寄存器的打入信号。其有关规定如图2.3.2所示。请注意两个跳变沿和低电平所实现的不同控制功能。


四片 Am2901 芯片间的连接

图3.1 Am2901芯片的管脚信号

在用四片Am2901芯片构成一个16位的运算器部件时, 四片间的连接关系是:

(1)16位的数据输入由4片各自的D3-D0组成, 其位序号从高位芯片向低位芯片顺序排列成D15-D0。

(2)16位的数据输出由4片各自的Y3-Y0组成, 其位序号从高位芯片向低位芯片顺序排列成为Y15-Y0。

(3)有高低位进位关系的3组信号, 在高低位相邻芯片间的连接关系是:
    高位芯片的RAM0与低位芯片的RAM3相连
    高位芯片的Q0与低位芯片的Q3相连
    在串行进位方式下, 高位芯片的 Cn 与低位芯片的 Cn+4 相连； 若选用Am2902芯片（与74LS182芯片功能相同，二者可互换使用）实现并行进位, 则低位的三个芯片的并行进位信号/G和/P应送往Am2902的相应管脚, 并将各自对应的片间进位输出信号送入相邻高位芯片Am2901的Cn管脚。为了能支持串、并行两种进位方式, 对片间的进位信号选择，采用跳线方式进行, 如图3.2所示。同时支持串、并行两种进位方式,是为了在教学实验中能方便地观察与量测每种进位方式的进位延迟时间，建立计算机运算器的进位延迟时间的数量级概念。

图3.2 串行与并行进位的跳线选择

    此时, 最低位芯片的RAM0与Q0是该16位的运算器的最低位的移位入/出信号, 最高位芯片的RAM3与Q3是16位的运算器最高位的移位入/出信号, 均需有另外的逻辑电路与之连接。 最低位芯片的Cn是整个运算器的最低位进位输入信号。最高位芯片的Cn+4是16位完整运算器的进位输出信号。
    同理, 只有最高位芯片的F3和OVR有意义, 低位的三个芯片的F3和OVR不被运用。
    四个芯片的F=0000管脚连接在一起, 并经一个电阻接到 + 5V电源, 以得到16位的ALU的运算结果为"0"的标志位信号。

(4)其它的几组输入信号, 对4片Am2901器件来说应有相同的值, 包括/OE(控制选通Y的输出), A地址、B地址, I8-I0(控制Am2901的运算功能, 数据来源, 结果的处置)和工作脉冲CP, 故应将四个芯片的这些信号的各对应管脚连接在一起, 示意如图3.3所示, 请注意图中的某几个引脚的名字有所变化。

我们可以进一步把图3.3简化表示成图3.4的样式，以便突出数据、控制信号的分类情况。


Am2901芯片之外的线路设计

(1). 关于四个标志位信号的接收与记忆线路

共有8种控制4个状态位接收或保持状态信息的操作方式，这包括：
· 在ALU执行算术与逻辑运算指令时, 应该将与计算结果有关的4个标志位的信号接收到一个在外部实现的4位（记为C,Z,V,S)的状态标志寄存器中。
· 另外的许多指令, 其执行结果对4个标志位不产生任何影响, 此时标志寄存器的内容应保持不变。
· 在结束中断处理，实现恢复现场操作时, 状态寄存器还需接收从内存堆栈区读来的先前保存的状态信息。

还有几条指令, 只影响进位标志位C, 而与其它三个标志位无关。这包括：
· 清“0”C（CLC指令）
· 置“1”C（STC指令）
· 让C接收RAM15的值(循环或逻辑左移指令)
· 接收RAM0的值(循环或逻辑右移指令)
· 接收Q0的值(硬件乘法指令的通用寄存器和Q寄存器同时右移，亦称联合右移操作)。

表4.1 状态寄存器的接收与保持

在使用运算器时, 就必须在恰当的时刻给出选择某一种操作方式的选择信号, 这用3位选择码SST就可以实现, 其具体规定如表4.1所示。

(2)最低位进位输入信号Cin的形成

从实用的角度, Cin可以取"0"值, 可以取"1"值, 可以取进位标志位C的值(带进位加减, 双精度加减法指令要用)。从教学实验的角度, Cin也可以取一个方波输入, 当用它与各位为全"1"的信息相加时, 运算器每一位的输出都是1个方波, 对观察与量测进位波形很方便。
在教学机中, 对补码的减法处理过程采取了一点变通措施, 即实现减法运算时,正常逻辑应为被减数小不产生向C的进位信号, 但是我们却变其为向C产生进位信号, 以使C=1表示加减运算有进位或有借位, 为此又必须在实现带借位减运算指令SBB时, 使用C的非, 而不是C。这里就有7种给出最低位进位输入信号Cin的需求,可以用两位选择码SCi与有关指令的操作码共同加以区分，具体规定如表4.2所示。

表4.2 形成最低位进位输入信号Cin的逻辑

(3). 左右移位时，最高、最低位的移位输入信号设计

最高位的移位入出信号是RAM15和Q15, 最底位的移位入出信号是RAM0和Q0 ，它们都是由双向三态逻辑门电路实现的。在左移操作时, RAM0和Q0可以作为输入端接收输入信号, 右移操作时, RAM15和Q15可以作为输入端接收输入信号。这些输入信号可以有O、C值(进位标志触发器)、Q15、/F15、RAM0、F15异或OVR, Cy(ALU的进位输出)。从教学计算机的指令执行需要，可以按左、右移位区分出4种情况, 故用2位移位输入控制码SSH和左右移位命令加以区分, 具体规定如表4.3所示。

表4.3 最高、最低位的移位输入信号的形成逻辑

注: 表中的X表示不必处理、不必过问该位的取值；
当通用寄存器本身移位时, Q寄存器不受影响；
乘除运算要求实现通用寄存器与Q寄存器联合移位；没有Q寄存器单独移位功能。


运算器的控制与操作

当我们按图2.3.7把实验计算机的运算器实现出来之后, 完整的运算器已处于能单独操作的状态。只要我们有办法向它提供必要的数据和控制信号, 它就能完成指定的操作功能。

关于数据, 主要是D15-D0这16位数据输入, 这可以用教学计算机上的16位数据开关直接提供。

关于控制信号, 当我们不考虑教学计算机的其它功能部件, 尤其是不提供控制器支持时, 就只能用实验机上的两个12位的微型开关SW2和SW1来向运算器提供全部的控制信号, 包括I8-I0, SST, A地址、B地址、SCi, SSH共24位。其具体安排如图5.1所示。

图5.1 微型开关的控制功能

这样就可以借助开关、按钮、指示灯来操作和控制运算器的运算操作，观察运算器的运算结果，这就是我们称之为脱机的运算器实验方式。用这种方式学习、理解运算器的组成与运行机制是足够简便直观的。

当我们把运算器部件接入教学机整机之内运行时, 就不能靠微型开关来为其提供控制信号, 而改由控制器来给出前面刚提到的这24位控制信号。在微程序控制方式下, 这些控制信号是由一个被称之为微指令寄存器PLR的相应的24位直接提供的, 它与24位的微型开关提供的信号是互斥关系, 可用二选一逻辑来指明选用它们中的哪24位控制信号。二选一逻辑的选择控制信号就是教学机上设置的FS4功能选择开关。当其状态为"1"(开关向上拨), 选通微型开关的信号作为控制信号, 为"0"时, 选通控制器的PLR的24位信号作为控制信号, 如图5.2所示。

图5.2 脱机与联机方式下向运算器提供控制信号的办法

LS240器件与PLR器件的输出均有三态控制逻辑, 当选通信号为低电位时, 器件输出有效, 否则输出为高阻态。


无标题文档

控制器部件是计算机的五大功能部件之一，其作用是向整机每个部件(包括控制器部件本身)提供协同运行所需要的控制信号。计算机的最本质的功能是连续执行指令，而每一条指令往往又要分成几个执行步骤才得以完成。由此又可以说，计算机控制器的基本功能，是依据当前正在执行的指令和它所处的执行步骤，形成(或称得到)并提供出在这一时刻整机各部件要用到的控制信号。

执行一条指令，要经过读取指令、分析指令、执行指令所规定的处理功能三个阶段完成，控制器还要保证能按程序中设定的指令运行次序，自动地连续执行指令序列。

为此，控制器组成中，必须有一个能提供指令在内存中的地址的部件，通称程序计数器(PC)，服务于读取指令，并接收下条要执行的指令的地址。

还要有一个能保存读来的指令内容的部件，通称指令寄存器(IR)，以提供本指令执行的整个过程中要用到的指令本身的主要信息。

控制器的第三个组成成分，是脉冲源、启停控制逻辑，指令执行的步骤标记线路，它标记出每条指令的各执行步骤的相对次序关系。

控制器的第四个、也是控制器设计中最费力的一个组成成分，是全部时序控制信号的产生部件，它依据指令内容、指令的执行步骤(时刻)，也许还有些别的什么条件信号，来形成并提供出当前各部件本时刻要用到的控制信号。计算机整机各硬件系统，正是在这些信号控制下协同运行，产生予期的执行结果，也就是执行一条又一条的指令。

依据前述控制器的最后两个组成成分的具体组成与运行原理的不同，通常把控制器区分为微程序的控制器和组合逻辑(硬布线)的控制器两大类。教学计算机系统中，分别设计并实现了这两种控制器，为教学提供了比较理想的实例，也为实验人员开辟了选择使用与进行实验的广阔天地。图1.1给出了控制器组成与其在整机中地位的示意表示。

图1.1 控制器组成与其在整机中的地位


微程序控制器的基本知识

1． 微程序控制器的基本工作原理

微程序控制器组成中的核心成分，是控制存储器，通常用ROM器件实现，它用于存储按一定规则组织好的全部的控制信号。该存储器往往由若干个(几百到几千)存储单元(字)组成，每个字的内容，由执行一条指令的一个运行步骤用到的全部控制信号，以及主要用于指明下一个执行步骤的信息共同组成，通常称为一个微指令字，或一条微指令。若把一台计算机中全部指令的每一个执行步骤所用到的信息(控制信号与下一微指令的地址信息)，都有机地安排好次序关系并写进该存储器中，则它将有能力按指令执行情况，准确地提供每一步要用的控制信号，并按正确的执行步骤执行每一条指令。这个存储器大体对应图3.2中的控制信号产生部件。每一个存储字存放一条微指令，全部微指令组成一台计算机的微程序。

微程序控制器的工作原理，是依据读来的机器指令的操作码，找到与之对应的一段微程序的入口地址，并按由指令具体功能所确定的次序，逐条从控制存储器中读出微指令，以"驱动"计算机各功能部件正确运行。

就该控制器对自身的控制而言，其核心问题，是以多种合用的方式，为自己形成并提供出下一次要用到的微指令在控制存储器中的地址,这一功能大体对应图3.2中的步骤标记部件。这是微程序设计中要重点解决的问题之一，既涉及到一定的硬件技术，又与微程序设计技巧和运行性能密切相关，有必要作为单独的一小节进行讲解。

2． 得到下一条微指令地址的有关技术

要保证微指令逐条连续执行，就必须在本条微指令的执行过程中，能取来或临时形成(产生)下一条微指令的地址； 从运行效率考虑，稍后还应能用此地址把下一条微指令的内容从控存中读出来，以便在本条微指令执行完毕后，能尽早地进入下一条微指令的执行过程。

决定下条微指令地址(简称下地址)的因素较多，处理办法各不相同，可能包括:
    ① 微程序顺序执行时，下地址为本条微指令地址加1；
    ② 在微程序必定转向某一微地址时，可以在微指令字中的相关字段中给出该地址值；
    ③ 按微指令(上一条或本条)的某一执行结果的状态，选择顺序执行或转向某一地址，此时必须在微指令字中指明需判断的执行结果及转移地址。 要判断的执行结果，可以是运算器的标志位状态，控制器的执行状态，如多次的微指令循环是否结束，外设是否请求中断等等。
    ④ 微子程序的调用及返回控制，会用到微堆栈；
    ⑤ 依条件判断转向多条微指令地址中的某一地址的控制，它可以是前述第③条的更复杂一点的用法，也包括依据取来的机器指令的操作码，找到对应该条指令的执行过程的一段微程序的入口地址。这后一种情况，通常被称为微程序控制中的功能分支转移。此时在微指令字中直接给出多个下地址是不现实的或不合理的，应找出更合理的解决方案。

从上述讨论中可以看出，要得到下一条微指令的地址，至少得从两个方面入手:

. 一是要在微指令字中，分配相应的几个字段，用于给出微指令转移地址(完整的一个地址，或部分的多个地址)，以及是顺序执行，或无条件转移，或条件转移及其判断条件，是否是功能转移， 是否是微子程序调用或返回等等。

. 二是应有相应的专门硬件支持，用于实现微指令地址加1，按判断条件给出判定结果为真还是为假，给出微堆栈组织并实现入栈/出栈管理，解决指令操作码与各自的微程序段入口地址的对应关系以完成微程序中的功能分支转移等等。

由于不同的计算机所用的微程序设计技术不尽相同，故上述两个方面内容的处理与实现方法也会有明显差异，请有兴趣者参阅有关资料。我们只介绍在教学计算机系统中用到的有关硬件与具体微程序设计的知识。

3. 微程序定序器Am2910芯片的组成与功能

在教学计算机的微程序控制器中，用于形成下一条微指令地址的核心硬件，是一片Am2910器件，正确掌握该器件的内部组成与它所提供的功能，是学懂该教学机微程序设计技术，设计与实现自己的新指令的微程序段的重要环节。

(1). Am2910芯片的内部组成

Am2910芯片的内部组成如图1.2所示。

图 1.2 Am2910芯片的内部组成

Am2910是一片能提供12位微指令地址的器件，即它的输入输出的地址位数和器件内的部件位数均为12位，能直接寻址4096条微指令字的空间范围。

AM2910包括一个四输入的多路地址选择器，用来从寄存器/计数器(R)，直接输入(D)，微程序计数器(μPC)或微堆栈(F)四个输入中，选择其一作为下一条微指令的地址。

寄存器/计数器由12个D型触发器组成。当它用作寄存器时，主要用于保存一个微地址，用以实现微程序转移；当它用作计数器时，具有减一功能(何时减一，取决于AM2910的命令码)，主要用于控制微程序的循环次数，若装入的初值为N，则可能执行N+1次循环。

微程序计数器由12位的增量器和12位的寄存器μPC组成。当增量器的进位输入C1为高电平时，多路器的输出Y加1后装入μPC (即 μPC←Y+1)，用于实现微程序的顺序执行； 而当C1为低电平时，多路器的输出Y直接装入μPC (即 μPC ←Y)，用于实现同一条微指令的多次执行。

微堆栈是由5字×12位的寄存器堆栈和微堆栈指针?SP组成，主要用于保存微子程序调用时的返回地址和微程序循环的首地址。微堆栈指针?SP总是指向最后一次压入的数据，因此，执行微程序循环时，允许不执行弹出操作而直接访问微堆栈的栈顶。当微堆栈中的数据达到5个时，就发出微堆栈已满信号 (/FULL=0)，这时，任何压入操作都将覆盖掉栈顶的原有数据。

AM2910输出3个使能信号: /PL、 /MAP和 /VECT，用以决定直接输入D的来源。
当 /PL有效时 (即/PL=0)，D来源于微指令的下地址字段，用于实现微程序转移；
当 /MAP有效时 (即/MAP=0)，D来源于MAPROM，用于实现从机器指令的操作码找到相应的微程序段首地址的转移；
当 /VECT有效时，(即/VECT=0)，原意来源于中断向量，现用于接收手拨微地址。

命令译码器接收外部送来的命令码I3~I0，条件输入 /CC和条件允许 /CCEN信号，并对其译码，产生芯片内工作需要的控制信号，和外部要用的三个控制选择信号/PL、/MAP和 /VECT。

（2）AM2910引脚的定义

输入信号 :
D11-D0: 外部直接输入的数据，既可作为寄存器/计数器的初值，也可以经过地址多路选择器直接从Y输出，作为下一条微指令的地址。
I3-I0: AM2910的命令码，来自微指令字的有关字段，用以选择AM2910的16条命令之一。
/CCEN和 /CC：共同确定测试条件是否通过，若/CCEN为低且 /CC为高，则指明测试失效；而 /CCEN为高或 /CC为低，均表明测试通过。若把 /CCEN 接地，即使其恒为低电平， 则可以只使用 /CC判断测试结果， /CC为低是测试通过，/CC为高则表明测试失效，我们在教学计算机中就是这样用的。
/PLD: 寄存器/计数器装入信号，当其为低电平时，不管AM2910所执行的命令和测试条件如何，都强制把直接输入D11-D0装入Am2910内部的寄存器/计数器。
CI: 增量器进位输入，当其为高电平时，控制微指令地址增量，即执行 μPC←Y+1，当为低电平时,执行 μPC←Y。
/OE: Y输出允许信号，低电平有效，当为高电平时，Y输出为高阻态。
CP: 时钟脉冲信号，由低变高的上升边沿触发所有内部状态的变化。

输出信号 :
Y11-Y0: 下一条微指令的地址，它直接被用作为读控制存储器的地址。
/FULL: 微堆栈满信号，低电平有效。
/PL，/MAP，/VECT: 3个使能信号，用于决定直接输入D的来源。

（3）Am2910的功能与具体用法

表1.1给出了Am2910所完成的功能，这些功能由命令码I3-I0，条件输入/CC，/CCEN 以及计数器当前值组合的结果来决定。

表1.1

注1：若测试失败则保持，否则就装数。 PC：微指令寄存器 D：直接输入
注2：图中符号 / 表示保持原内容不变。 R/C：寄存器/计数器 F：微堆栈栈顶

Am2910提供了16条命令，用来控制Am2910内部的操作和选择下一条将要执行的微指令的地址。其中只用少数命令（如0，2，14号命令）的执行结果仅由命令码本身决定，大部分命令还都要受到测试条件 (/CC和/CCEN) 为真还是为假的控制，有些命令（如 8，9和15号命令）的执行结果，则要受到内部计数器当前值是否为零的控制，其中15号命令同时受到内部计数器的值是否为零和测试条件是否通过的双重控制，以实现三路微程序转移的功能。

现将教学计算机设计中要用到的0，2，3，4，6，8，14，15这8条命令的功能和我们的具体用法说明如下:

◆ 0号命令: 用于初始化，即无条件清除内部微堆栈，并使Y的输出一定为零，用于系统加电时， 确保此时系统从0号微地址开始执行微程序。

◆ 2号命令: 用于指令功能分支，即输出信号/MAP为低,使D输入信号从MAP ROM（微地址映射部件）得到，并将其作为输出微地址Y的值，实现用指令操作码找到对应该指令的微程序段的入口地址，从而开始该条指令的特定的执行过程。

◆ 3号指令: 用于条件微转移控制，当条件成立，即/CC为低时，用/PL把微指令字中的下地址字段的内容(转移地址)经过D输入并送到Y，实现微程序转移。当/CC为高时，微程序顺序执行，即把已增1后的微指令地址作为下地址。若外部电路确保送入的/CC的状态为低，3号条件微转移命令也可以用于实现无条件的必定微程序转移来使用。

◆ 4号命令: 进栈并条件装入计数器，把下条微指令的地址压入堆栈中，同时若条件测试通过，则把当前微指令地址字段的内容(通常作为循环次数)装入计数器中，然后顺序执行。该命令通常是为建立微程序循环作准备。

◆ 6号命令：条件转至中断向量，用于为外部输入D选择一个新的微地址来源，即输出信号/VECT 为低，原意取某一向量地址，我们用其从教学机主板上的开关取一个手拨的微程序地址。

◆ 8号命令: 用于微程序循环控制。为了使用这条命令，前面必须用一条命令(通常是4号命令)把循环首地址压入堆栈，把循环次数装入计数器。该命令执行时，先检测计数器的值是否为零，若不为零，则计数器减一，并取微栈顶的内容作为下条微指令的地址(即继续循环)，否则，把微堆栈指针减一(即弹出循环地址)，顺序执行下一条微指令。

◆ 14号命令：顺序执行，即执行紧跟在本条微指令后面的那条微指令。

◆ 15号命令: 三路转移，与8号命令类似，在该命令执行之前，前面必须有一命令(如4号命令)已把转移地址压入堆栈，把循环计数值装入计数器。该命令要同时受到条件输入和计数器当前值的控制。当计数器不为零时，计数器减一，同时，若条件测试通过，则退栈(即弹出转移地址)，并选择增1后的微指令地址作为下条微指令的地址，否则，选择微栈顶的内容作为下条微指令的地址； 当计数器为零时，微堆栈指针减一(即退栈)，此时，若条件测试通过，则用增1后的微指令地址为下条微指令的地址，否则，下地址来自当前微指令的下地址字段。


微程序控制器的设计与实现

1. 基本组成部分

基本组成指的是该控制器的必不可少的组成部分，如图3.4所示。它与微程序设计的最基本的原理直接相关，是课程的重点内容。
从图3.1可以看出该控制器的基本组成部件及它们相互间的逻辑关系。

最核心的部分是控制存储器，用于存放教学机的微程序，由56位组成，用7片74LS6116随机读写的8位×2048字的内存芯片实现。通常控存都是用ROM芯片实现，把厂家设计好的微程序固化在里边，仅提供读操作功能，可靠性更高些。教学机要支持动态微程序设计，即允许实验人员把自己设计的微程序写进控存，我们只能用可读写存储器支持这一要求。这还带来一个新的问题，即在实验机加电启动时，首先必须把已设计好的53条机器指令用到的微程序调入控存，这个问题将到该控制器的辅助组成部分去进一步讲解。正常执行微程序时，该控存将依据Am2910提供给它的10位地址，在读写命令W/R(为高是读操作)控制下读出相应单元的一条微指令。

图 3.1 微程序控制器的基本组成

读出的微指令将通过CP脉冲，打入该控制器的第二个组成部件——微指令寄存器PLR中。前边已提到过，一条微指令的内容通常由下地址和控制信号(微命令)两部分组成。下地址可能又被分成几个小字段，它们被用于控制、形成、或直接提供下一条微指令的地址，是供给控制器部件本身使用的。微命令也由若干个小字段组成，提供对计算机其它功能部件，如运算器、主存、输入/输出设备的控制信号。在第二章，我们已看到用于控制运算器的许多控制信号。在本小节稍后部分，将详细介绍教学计算机的微指令的格式和每个字段的内容及其控制功能。

该控制器的第三个组成成分，是微程序定序器Am2910器件及其配套电路。

在本教学计算机的实现中，已把Am2910的/OE端接地，使其输出Y11-Y0总保持有效(实用Y9-Y0共10位)。

把/CCEN接地，使Am2910的条件判断结果只取决于/CC。

把CI接电源，使微指令地址 +1总是执行。

用/VECT信号把通过水平板上的开关给出的10位微指令的手拨地址接通到Am2910的D输入端。

分别用/MAP和/PL两个信号选通MAPROM和微指令下地址字段的输出送到Am2910的D输入端，从而形成D输入端的3选1逻辑功能。

与Am2910配套的电路，主要包括MAPROM和用于形成/CC信号逻辑值的条件判定线路。MAPROM被用作为指令微地址映射部件，它变换指令的操作码为该指令对应的微程序段入口地址，由两片74LS2716 ROM芯片组成，其地址为指令的操作码，对应单元中存放相应微程序段的入口地址，执行读操作，并用/MAP选通读出的信息，解决的是指令功能分支问题。

关于/CC条件码的形成问题，需解决指明判定条件和完成条件判定两个方面的需求。要判断的条件相当多，是通过微指令中下地址字段中的SCC(3位)和SC(1位)两个子字段指明的，其具体规定如表3.1所示,采用专门的硬件电路，即一片Gal20v8器件实现表中所规定的功能

表3.1

表中的FS1、FS2和FS3是水平板上的3个功能开关，用于选择教学机执行不同的操作功能，其具体规定如表3.2所示

表3.2

/WAIT是教学处于单步执行时，用于单步控制线路的等待状态(等待按下STEP微型按键)。

C、Z、V、S或它们的取反值/C、/Z、/V、/S是运算器中的四个状态标志位。当SCC的3位微码为111,即十进制编码值为7时，通过条件转移指令的指令操作码 IR的第10-8位选择它们，以形成条件码/CC的值。

当SC为1时，通过SCC三位编码的2、3、4和5状态选择/C、/Z、/V、/S形成条件码/CC的值，用于非条件转移指令所用的微指令中。

/INT为中断请求信号，低电平有效，在每条指令结束时，判有无中断请求，以确定转中断处理还是执行下一条指令。

采用专门的硬件电路，即一片Gal20v8器件实现表3.2所规定的功能。

微指令字下地址字段中还有一个子字段CI3-CI0，用于给出Am2910的命令码，它与/CC的取值、Am2910内部的R/C的内容是否为零等一起，共同决定Am2910芯片内部的操作和形成下一条微指令地址的具体办法。

2. 辅助组成部分

辅助部分指的是该控制器中的、用于向控制存储器写入微指令的逻辑电路，这是向学生提供必要的实验手段，即允许学生设计自己的微程序段和将其写入控存，并使其正确运行所应该具备的部分。包括支持通过开关和按键用手工方式向控存写入微指令，支持用LDMC(装入微码)指令向控存写入微指令，支持教学机加电启动时向控存写入已设计好的53条指令用到的全部微程序的有关电路。

实现中要解决的三个问题是:

◆ 控存读写在时间上的予盾，即执行每一条微指令的过程，也正是读取下一条微指令的过程，把二者的执行过程从时间上重迭起来，以提高执行微指令的速度，增加计算机处理性能，这就是流水线技术的概念。为此，必须设置微指令寄存器，使读出的下一条微指令的内容送到该寄存器的输入端，等待CP脉冲的到来，以完成打入操作； 而该寄存器的输出正是本条微指令的内容，正在控制计算机各部件完成本步骤的操作功能。如果此时还要向控存写入微指令，与上述读操作是矛盾的。解决办法不外如下两种:

在执行一条微指令的期间(微周期)，分前后两段时间，分别完成控存的写、读操作，这使每条微指令的最短执行时间，至少要等于两个控存访问周期。

或设置一个不读控存的微指令周期，专门用于控存写操作。在此周期内，封锁有关的几处的CP脉冲，并由少量专门的电路提供控存写入操作要用到的控制信号。看来，在教学计算机中选用这后一种方案更合理些，但我们还是用了前一种方案，详述从略。

◆ 获得控存写入操作的地址
在手工拨入微指令前，要用水平板上的16位开关的低10位拨入控存地址。此时，是把开关拨好的地址值经选通门送到教学机的内部总线，再送入程序计数器PC中和地址寄存器AR中，至此就把控存地址送到了地址总线，并作为控存的地址来源之一。以后每写入一条微指令，使PC加1送PC和AR，作为写入下一条微指令的控存地址，支持连续写入操作。

◆ 提供控存写入操作的数据(微指令内容)
在手工拨入微指令的过程中，微指令是56位字长，而拨数开关只有16位。为此，需分4次拨入。为了尽量少影响控存的读操作，在教学机中设置了一个56位的控存写入寄存器LDR，分成4个16位的段(最高位的段只有8位)，各段依次接收16位数据开关拨入的16位微码，待4次拨入完成后，集中一次56位同时写入控存。具体实现方案是:

16位开关所拨内容经选通门送到内部总线IB，16位的IB直接接到了四段LDR的输入端。

控存写入寄存器LDR由7片8D寄存器器件实现，每两片组成一段(最高段仅用1片)，分别用不同的打入时钟信号控制打入操作。LDR的56位输出直接送到控存的数据入出端，用W/R读写信号控制写入(W/R为低是写)操作。

图3.2 是实现控存写入的有关逻辑电路示意图。

图 3.2 实现控存写入的逻辑线路

在通过LDMC指令向控存写入微指令时，用到了LDMC指令的三个默认参数，即微码在内存区的首地址，要写入的微指令的条数，要写的微指令在控存中的首地址，它们分别放在通用寄存器R1,R2和R3中。这条指令执行时，存在与手工拨入微指令同样的三个问题，即用R1内容作地址，依次4次读内存内容到内部总线，并依次写进LDR的四段，拼出一条待写入的微指令字； 然后用R3的内容作控存地址(用R3内容送地址寄存器实现)，并且一次完成控存写入操作。用到的电路与图3.5类似，只是变开关内容送IB为内存读出内容送IB，变PC内容送AR为R3内容送AR，变手工按单步按键操作为计算机执行指令，请参见逻辑图有关部分与LDMC指令相应的微程序段。

至于教学计算机加电启动过程中的微码初始化装入过程，涉及到几个专用的逻辑部件。一个是微码固化器件μCR，用两片74LS2716 ROM芯片组成16位字长的，2K字容量的专用电路，每4 个字存放一条微指令。

另一个是地址计数器部件，用完成4位计数功能的三片74LS6116器件串行计数实现，它被同时用作为读μCR和写控制存储器的两个地址。这两个地址有如下关系:

. μCR的内容从0地址顺序读出，控存的内容也从0地址顺序地写入，二者初值均为0。

. 读4次μCR写一次控存，二者操作频率为4:1，满足用10位地址读μCR，并用高8位地址写控存的条件。
第三个组成部件，是提供μCR的读命令信号，LDR的4个打入脉冲和控存的写入命令的信号，这些信号只能在这里提供，因为此时微码尚未装入控存，教学机的指令还不能执行。要保证此时提供的控制信号与将来微指令所提供的信号的互斥性。

图3.3是微码初始化装入的逻辑电路。10位地址用于读μCR，8位地址用于写控存，初值均为0。10位地址的低2位产生的4分频信号作为高8位地址的计数脉冲，其译码值的4个状态用于产生LDR的4个打入脉冲。 最后一次计数期间还用于写控存。这就是图上的读命令和写命令的形成逻辑。

图3.3的计数器输出用于指明微码初始化装入完成，并用以解决这里给出的控制信号与微指令给出的信号的互斥问题。

图 3.3

若把教学机微程序控制器的基本组成与辅助部分两项合起来，则可得到如图3.4所示的该控制器组成的逻辑框图。

图3.4 教学机的微程序控制器的完整组成

图上半部分为其基本组成电路，用于读控存，执行微指令以解释指令的执行过程，是教学机正常运行所需要的。此时，由Am2910提供控存地址，从控存读出的微指令送微指令寄存器PLR，保证下边部分的电路的输出均被禁止，包括它送给控存的地址和56位的数据，通过给出正确的/OE信号实现。

下边部分为该控制器的辅助组成电路，支持向控存写入微指令。写控存期间，要禁止上半部分电路与控存发生作用，包括禁止Am2910的10位地址输出，不向PLR提供打入脉冲CP，以避免把写向控存的内容接收到PLR中，还包括对Am2910器件的一点特殊控制。

3. 教学计算机的微程序设计

(1) 微指令格式

一条微指令，通常由下地址字段与控制码字段两大部分内容组成，这每一部分又会分成若干个更小的子字段。

教学机的微指令由56位组成，其中最高的20位(含两位备用位)用于控制微程序下地址的形成。有10位用于给出微指令转移用的转移地址或微程序执行用到的数据(例如微程序循环次数)。4位用作Am2910的命令码CI3-CI0，另有4位(3位SCC和1位SC)用于给出微指令转移的判别条件。

余下的36位，1位备用，其它35位用于给出对控制器之外的其它几个功能部件的控制命令，包括对运算器、主存、入/出接口、总线等的控制。

其中有26位用于运算器，在第四章讲运行器部件时已看到过24位，这里还有两位SA和SB，用于指明送给Am2101的A口地址、B口地址的信息是来自微指令的A口字段、B口字段，还是来自指令寄存器的SR、DR字段。通常，单或双操作数指令中用到SR、DR内容时，Am2901的A口、B口地址需要由指令寄存器提供。当另一些指令用到默认的寄存器内容时(如IN和OUT指令默认使用通用寄存器RO，LDMC指令要用到R1,R2和R3等)，这些寄存器的编号，就必须在相关的微指令字的A口地址或者 B口地址字段给出。此外，由于PC、IP和SP等是用R5、R6和R4实现的，在涉及到PC和SP的计算、读写等操作时，这些寄存器的编号也必须通过相关微指令字的A口地址、B口地址字段来提供。为此，特规定分别用SA和SB完成这一选择，如表3.4所示。

为了对内存和输入/输出接口的读写进行控制，用了/MIO、REQ和/WE三位微码，具体规定如表3.3所示，即这三位用于指明正常总线周期的类型和支持动态微程序设计用到的一个写控制存储器的特殊操作周期。

表3.3

表3.4

与内部总线和寄存器接收操作有关的微码共6 位。DC1用3位，选择把哪类信息送往内部总线IB，DC2用3位，选择哪一个寄存器接收出现在内部总线上的内容，其具体规定如表3.5和表3.6所示。其中DC2的011编码表明INT(中断优先级)寄存器接收外部送来的信息。

表 3.5

表3.6

这是用3-8译码器实现选择控制的。要指出的是，当DC1为000编码时，仅当不是内存或I/O读操作，即/MIO REQ /WE不为0X1时，才是开关内容送内部总线IB，在读内存或读外设时，要禁止DC1译码，使原DC1所确定的选择均不起作用，以便把外部总线DB上的内容，经过一个双向三态门送往内部总线IB。

这56位微码的具体安排如图3.5所示。

书写这56位微码时，经常采用16进制的表示形式。各字段的划分要有利于按16进制编码识别各段微码的控制功能。

图3.5 微指令格式

(2) 教学机的微程序分析

教学机的微程序清单前面已给出

每条微指令在清单中的内容是:

从左数第一列为每条微指令在控存中的地址，用2位16进制数给出。

第二列为本条微指令完成功能的简单说明，包括选用什么条件形成/CC的值。

第三列是本条微指令中AM2910选用的命令码。

第四列是在本条微指令字的B55-B46给出的下地址字段的内容，经常是一个微转移地址。

再接下来给出用16进制表示的56位微码的具体内容。每两位数字表示一片8位的控存芯片中的信息。其排列关系已在微指令格式一小节给出。显而易见，前面刚说过的第三列和第四列的内容已包括在这56位微码的高14位部分。仅是由于这两个字段的内容对阅读微程序更加重要，才将其再单独表示在第三、第四两列。
在最右部分，有些微指令中还有简单注释，表明操作功能选择或该微程序段入口地址所对应的汇编语句。

微程序执行过程

现在我们先具体看一看已实现的微程序的执行过程。

假定教学机的功能开关拨在1010的位置，表明在从主存的0地址连续执行程序。

加电后按LDMC/RESET键的信号将首先启动装入微码，装入完成的信号，或RESET按键给出的信号/RESET将清零微指令寄存器PLR的B47-B40，使CI的四位为0000，得到AM2910的0#命令码，它使AM2910芯片内的微堆栈清空，并使微地址输出Y11-Y0 (教学机仅用Y9-Y0共10位)为0，故首先要读出并执行保存在控存0号单元中的微指令，从而启动了微程序的执行过程。

头一条微指令是判FS1所处的状态，它为1(开始已假定)，按表3.2规定，是CC为1，故/CC为低，按AM2910的3#命令规定，应转移，转移地址为10h。接下来应执行10h地址中的微指令。(0地址中的微指令要实现的IB→PC，→AR功能暂不讨论)。

10h中的微指令判FS2为0，使/CC为高，不满足转移条件，应顺序执行下一条微指令11h。

11h中的微指令判FS3为1，则转移到17h。

以上3条微指令完成了判定FS1、FS2、FS3开关为101位置，应进入从主存0地址连续执行程序的操作过程。
17h中的微指令完成把0值送入PC的操作。实现的方案是在运算器中执行R5-R5→R5的操作。R5即是PC。该微指令选用14#命令，表明应顺序执行下一条微指令。

18h中的微指令完成PC送地址寄存器，并将PC的内容保存到IP(即R6)中，以备后面可能有相对转移的地址计算之用。还用14#命令。

19h完成取指 (即读主存储器并将读出来的指令内容打入指令寄存器IR中) 和PC增量的操作。至此，当前指令已取到指令寄存器IR中，并准备好顺序执行指令的指令地址。还用14#命令。

20h选用2#命令，它使输出控制信号/MAP为低电平，则完成从MAPROM取得当前指令对应的微程序段的入口地址。

MAPROM是由2片8位的ROM芯片组成的微指令地址映射部件，其地址输入为IR给出的指令操作码，其输出为该条机器指令对应的微程序段的入口地址，指令操作码与相应微程序段的入口地址的对应关系给出在指令汇总表中(表2.2)。

接下来的微指令开始执行指令的具体功能。

例如，ADD指令将导致进入1Ch微指令，完成 DR+SR→DR的功能；

而ADC指令将导致进入1Eh微指令，完成 DR+SR+C→DR 的功能；

SUB和SBB指令，将通过20h、22h微指令分别完成DR-SR→DR、DR-SR-C→DR的功能，如此等等。

上述4条指令,完成具体的相应运算功能的控制方法，是正确地选择AM2901芯片的3组3位的控制码，和正确选择最低位的进位信号，并使/MIO、REQ、/WE为101，即不执行内存或外设的读写操作，这在运算器部件的教学实验过程中多次处理过。

上述4条指令的相应4条微指令的下地址字段均给出A4，微指令下地址的控制码选为3#，即按测试条件决定是顺序执行还是转移，判断条件是/CC=0，即测试条件通过，则一定转移，故下一条微指令的地址为A4h。
A4h微指令的功能是依据有无中断请求，决定进入中断处理过程，还是顺序执行下 一条指令，这是每条机器指令完成后都应该执行的一项操作。

没有中断请求，则执行A5h微指令。它要依据功能开关FS3的状态，检查是连续方式执行程序(1010或1110)还是单条指令方式执行程序(1100)，并完成PC内容送地址寄存器,保留PC值到IP中。为连续执行时，则转回19h进入下一条指令的取指过程。

教学机53条基本指令的微程序总体结构

下面看一看教学机53条基本指令的微程序的总体结构：

① 从00h-15h这16条微指令,用于判别教学机上3个功能开关FS1、FS2、FS3的位置状态,以决定教学机的运行方式，具体规定在前面已给出,并表示在教学机的简明操作卡上。这包括运行微程序、装入微码、存储器读写(包括在监控命令支持下读写或用开关、按钮方式读写),控制程序运行的方式(单步还是连续)，运行程序的首地址等。前面还以FS1 FS2 FS3处于101,且FS4处于0状态为例，讲解了这里有关的几条微指令的功能与运行次序。

② 17h和18h两条微指令用于加电后启动监控程序时，把0地址值送入PC，PC值送地址寄存器AR，做好读取头一条指令的准备工作。

③ 19h这条微指令完成取指,即读内存，把读来的指令字送入指令内存器IR中并实现PC值增量。这公用于所有指令,是所有指令必须首先完成的共同操作,它与指令的操作码无关。

④1Ah微指令,实现按新取来的指令的操作码找到该条指令本身的微程序段的入口地址，是接在取指后每一条指令都必须完成的一项操作。

⑤ 1Ch-A3h这些微指令用于实现教学机53条基本指令各自的执行功能。每一条机器指令用1到多条微指令实现，各自有自己的一个入口地址。在前边我们已具体看了几条指令，诸如ADD、ADC、SUB、SBB的执行过程。

⑥ A4h-ABh这几条微指令用于每条指令结束后,判有无中断请求,和是连续还是单指令执行程序，公用于所有指令。A4h还用于保存状态寄存器到Q。有中断请求时，转向由ADh-B6h去实现中断响应功能。无中断请求，则完成PC→AR，为顺序执行或转移做好取下一条指令的准备。A5h完成PC→AR和PC→IP的功能，与18h这条微指令的功能有些类似,差别在于，18h在初始加电后准备监控程序的首地址,A5h是执行完一条指令后,准备下一条指令的地址。A5h还要判连续还是单指令执行程序，即判FS3功能开关处于1还是0状态。连续时直接转19h完成取指,单指令执行时，用下边的几条的微指令处理等待，即等用户按下STEP 按键。

⑦ADh-B6h完成中断响应，包括处理机状态入栈，中断入口地址(由中断优先级拼接固定的高位地址形成，参见逻辑图纸)送进PC等。中断实验中有更详细的说明。

?B8h-BAh 3条微指令是手工装入微码和写存储器用到的等待微子程序； BCh-BEh是手动读存储器用到的等待微子程序。

有了上述说明，我们在下面给出教学机七条典型指令的微程序的流程图，如图3.6 所示。这里用到的有关符号是:

一个方框表示一条微指令,箭头指出微指令的衔接次序，方框内给出微指令所执行的操作，在箭头附近给出该微指令的地址，在方框内或旁边给出微指令字中的AM2910的命令码。

图3.6 七条指令的微程序执行流程图


自行设计新指令的微程序

所谓新指令，是指教学机支持的64条基本指令中未实现、留给学生自行设计与实现的11条机器指令，即指令汇总表中最后的11条指令。这11条指令的情况是:

—— 6位操作码已定，为D4、D8、DC、E0、E4、E8、EC、F0、F4、F8和FC，这是按8位长度的16进制方式给出的。其最低两位，可用于选择C、Z、V、S四个标志位作条件转移指令的判别条件。

—— 这11条指令的微程序段的入口地址已定为100h，110h，120h,...1FEh。这是由MAPROM器件的内容限定的,这些内容已写好在该器件的相应单元中。

—— 这11条指令没有相应的汇编语句名，执行的功能也未定义。但在使用时，必须使其指令格式与已实现的53条指令的格式类同，如要用C、Z、V、S作为判别条件，只能用指令寄存器的第9,8两位编码加以标明，作为写入用的寄存器编号只能通过IR7-IR4标明等等。使用不当，目前已给出的硬件可能无法直接支持。
设计新指令的微程序段将涉及以下几个问题:

—— 选定指令格式及功能，包括确定要用的操作码，指令中其它字段的内容分配与使用，本指令要实现的具体功能。

—— 按新指令的功能与格式，设计该指令的执行过程，即分成几步完成，每一步要实现的详细操作细节，各步之间的衔接次序等。

—— 将每一步中的操作，用一条微指令实现，即具体设计每条微指令各字段的具体编码值，既包括控制码的各字段，也包括下地址字段，形成下地址用到的条件码等等。

—— 将设计好的微码，装入控制存储器的相应单元。

—— 设计一个使用新、旧指令的用户程序，检查程序运行的正确性，以确定新指令是否正确执行，对新指令的执行过程仔细调试，直到得到满意的结果。

这一过程中的向控存中装入新指令的微码有两种方法，一是通过水平板上的开关与按键直接拨入，具体操作方法参见教学计算机补充材料；二是在程序中用LDMC指令指令实现自动装入，其具体操作步骤介绍如下。

作为例子，最简单的方法，是抄一条现有指令作为新指令予以实现。例如，操作码选D4，指令格式选为D4 DR，SR,,实现DR+SR→DR的功能。它就是ADD DR，SR那条指令，差别仅是操作码由04变为D4。查指令汇总表，D4操作码的微指令的入口地址应为100h,故将1Ch地址中的微指令(实现ADD DR，SR的操作)中的内容复制到100h单元，就完成了这条新指令的微程序设计的过程。看下面一个程序例子。

<A800
800: MOV R8, 240 ；为指令的目的寄存器赋初值
MOV R9， 360 ；为指令的源寄存器赋初值
MOV R1， 900 ；微码在内存的首地址
MOV R2, 1 ；微指令条数
MOV R3， 100 ；微码在控存中的首地址
LDMC ；用R1,R2,R3作为参数,装入微码
D489 ；新指令的二进制执行码
RET
<E900
900： 0029...0301....b090....0088

以上用到的数值均为16进制。在监控命令工作时，输入均用16进制数，且都不能跟h字符。

该程序的功能是将240和360两个16进制形式的整数分别送入R8和R9。用新指令 (机器码为D489：操作码为D4，DR选R8,SR选R9) 完成两个寄存器的内容相加，结果写入R8。

该程序当中的4条指令，实现的是装入新指令的微码。微码在内存的首地址为900，四个字的内容为0029，0301，b090，0088，是控存1CH单元的内容，可以用监控程序的E命令键入。

该程序可以用监控程序的命令打入。倒数第2行的D489是新指令的机器码，不能在A命令方式下打入。具体操作过程，可以在A命令方式下，先在此处打入任何一条单字指令，例如，MOV R0，R0。整个程序输入后，再将该单元的内容用E命令改为D489，该程序运行过程中，在为R8,R9赋值后，接着装入新指令的微码，再执行新指令，最后返回监控程序以结束该程序的执行过程。

该程序运行结束后，用R命令检查程序的执行结果，R8的值应变为05A0。

从这个例子可以得出以下几个结论:

—— 新旧指令可以用在同一程序中；
—— 新指令在每次教学机重新加电后，至少得重新装入一次对应的微码； 仅在装入相应微码后，新指令才能执行，即已将新指令追加到教学的指令系统中；
—— 新指令无汇编码(因汇编程序实现在前，新指令实现在后)，故在程序中，只能通过机器码使用新指令；否则必须去扩展有关的汇编程序。
—— 装入新的微指令与使用新指令变得非常容易，同学的精力就可以全部集中到微程序设计方面来。但必须想到，新、旧指令的微程序之间存在着如下协调与配合关系:
前边的例子中，只设计了新指令的具体执行功能，执行前的取指过程和执行后的判中断、与下条指令的衔接等均使用了原微程序的有关内容。从同学学习微程序设计的角度看，取指过程与每条指令完成后的相应处理是公用于所有指令的，而且比较简单，看懂原来的实现方法与细节，以及与每条指令执行过程的衔接方式，也就达到了深入掌握的程度，故一般不必在自己设计的微程序中考虑这一部分内容。若有的学生想在自己的微程序中实现自己设计的取指等处理过程，必须保证在新旧指令衔接时不出现矛盾。最简单的方法，是在自己的多条新指令中，有几条指令有自己设计的取指与后续处理，它们不能与原有指令的微程序段正确衔接。但有一条新指令用原有指令的取指处理完成取指过程，有另一条新指令用原有指令的后续处理完成判中断，保证能正确与原有指令的取指过程衔接。当用这样的两条指令“夹”起的其它新指令序列出现在任何程序中时，每条指令均将能正确衔接执行。

设计不同格式与功能的新指令的执行步骤，以及每一步中的微指令字的各字段的编码，是学习计算机微程序设计的重点，也是学懂计算机指令执行过程的核心内容。


微指令格式

每条微指令由56位组成，从高向低各位标记为B55-B0，分为13个字段，如下所示

各字段具体规定如下各表

4位CI3~CI0的控制功能

3位SCC与1位SC的控制功能

3位SST的控制功能

3位MIO、REQ和WE的控制功能

9位MI8~MI0的控制功能

两位SCI的控制功能

两位SSH的控制功能

3位DC1的控制功能

3位DC2的控制功能

参考资料：

胡敏、钱兴贤《计算机组成接口与通信实验指导》

软件 Microinstruction Analyzer


TEC-2计算机指令的操作码及微程序入口地址

操作码 | IR15-IR8 | 指令 | MAPROM 地址 | 微程序入口地址
00 04 08 0C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40 44 48 4C 50 54 58 5C 60 64 68 6C 70 74 78 7C 80 84 88 90 94 98 A0 A4 A8 AC B0 B4 B8 BC C0 C8 CC D0 D4 D8 DC E0 E4 E8 EC F0 F4 F8 FC | 000000×× 000001×× 000010×× 000011×× 000100×× 000101×× 000110×× 000111×× 001000×× 001001×× 001010×× 001011×× 001100×× 001101×× 001110×× 001111×× 010000×× 010001×× 010010×× 010011×× 010100×× 010101×× 010110×× 010111×× 011000×× 011001×× 011010×× 011011×× 011100×× 011101×× 011110×× 011111×× 100000×× 100001×× 100010×× 100100×× 100101×× 100110×× 101000×× 101001×× 101010×× 101011×× 101100×× 101101×× 101110×× 101111×× 110000×× 110010×× 110011×× 110100×× 110101×× 110110×× 110111×× 111000×× 111001×× 111010×× 111011×× 111100×× 111101×× 111110×× 111111×× | NOP ADD DR,SR ADC DR,SR SUB DR,SR SBB DR,SR CMP DR,SR PUSH DR POP DR MOV DR,SR MOV DR,[SR] MOV [DR],SR MOV DR,DATA MOV DR,[ADR] MOV [ADR],SR MOV DR,DATA[SR] MOV DATA[SR],DR MUL SR PSHF DIV SR POPF AND DR,SR XOR DR,SR OR DR,SR TEST DR,SR SHL DR ASR DR SHR DR RCL DR RCR DR INC DR DEC DR NOT DR EI DI JP CND SR JP SR CALL SR JR CND ADR JR ADR IN PORT OUT PORT RET IRET CLC STC HALT JP CND ADR JP ADR CALL ADR LDMC (未用) (未用) (未用) (未用) (未用) (未用) (未用) (未用) (未用) (未用) (未用) | 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH 20H 21H 22H 24H 25H 26H 28H 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 32H 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH 3DH 3EH 3FH | 8CH 1CH 1EH 20H 22H 52H 54H 56H 24H 26H 28H 2CH 2EH 30H 32H 34H 38H 58H 40H 5AH 4AH 4CH 4EH 50H 5CH 5EH 60H 62H 64H 66H 68H 6AH 6CH 6EH 70H 72H 74H 78H 7AH 7CH 80H 84H 86H 88H 8AH 8EH 90H 92H 94H 98H 100H 110H 120H 130H 140H 150H 160H 170H 180H 190H 1A0H

参考资料：胡敏、钱兴贤《计算机组成接口与通信实验指导》


TEC-2计算机的微程序清单

微程序地址
十六进制代码
相应的指令
00H
01H
02H
03H
04H
05H
06H
07H
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
10H
11H
12H
13H
14H
15H
16H
17H
18H
19H
1AH
1BH
1CH
1DH
1EH
1FH
20H
21H
22H
23H
24H
25H
26H
27H
28H
29H
2AH
2BH
2CH
2DH
2EH
2FH
30H
31H
32H
33H
34H
35H
36H
37H
38H
39H
3AH
3BH
3CH
3DH
3EH
3FH
40H
41H
42H
43H
44H
45H
46H
47H
48H
49H
4AH
4BH
4CH
4DH
4EH
4FH
50H
51H
52H
53H
54H
55H
56H
57H
58H
59H
5AH
5BH
5CH
5DH
5EH
5FH
60H
61H
62H
63H
64H
65H
66H
67H
68H
69H
6AH
6BH
6CH
6DH
6EH
6FH
70H
71H
72H
73H
74H
75H
76H
77H
78H
79H
7AH
7BH
7CH
7DH
7EH
7FH
80H
81H
82H
83H
84H
85H
86H
87H
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
90H
91H
92H
93H
94H
95H
96H
97H
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
A0H
A1H
A2H
A3H
A4H
A5H
A6H
A7H
A8H
A9H
AAH
ABH
ACH
ADH
AEH
AFH
B0H
B1H
B2H
B3H
B4H
B5H
B6H
B7H
B8H
B9H
BAH
BBH
BCH
BDH
BEH
BFH
04 0340 B0F0 5002
02 8360 9080 0000
00 0680 9080 0000
2E 10A0 9080 0000
2E 10A0 9080 0007
2E 10A0 9080 0006
2E 10A0 9080 0005
00 0E00 9080 0004
00 0E00 9880 0000
00 C300 B0B0 5402
03 8380 9080 0000
2E 01A0 9080 0000
00 0E00 1000 0000
02 C300 B0B0 5402
2F 01A0 1080 0000
03 8300 B0B0 5402
06 0360 9080 0000
05 C380 80C5 0000
00 0E00 1080 0000
01 8400 9080 0000
00 0800 30B0 5402
04 8300 30A0 5002
00 0000 0000 0000
00 0E00 B195 5000
00 0E00 B0C5 6072
00 0E00 30B0 5401
00 0200 9080 0000
00 0000 0000 0000
29 0301 B090 0088
00 0000 0000 0000
29 0301 B090 0888
00 0000 0000 0000
29 0301 B190 0088
00 0000 0000 0000
29 0301 B190 0888
00 0000 0000 0000
29 0300 B0C0 0088
00 0000 0000 0000
00 0E00 90C0 008A
29 0300 30F0 0088
00 0E00 90B0 008A
29 0300 1040 0098
00 0000 0000 0000
00 0000 0000 0000
09 C300 A0B5 5402
00 0000 0000 0000
00 0E00 A0B5 5402
09 C300 10F0 0002
00 0E00 A0B5 5402
0A 4300 10F0 0002
00 0E00 A0B5 5402
09 C300 10D0 008A
00 0E00 A0B5 5402
00 0E00 10D0 008A
29 0300 1030 0098
00 0000 0000 0000
00 0E00 B190 0000
00 0E03 80C1 0000
03 C407 C0B0 0200
0F 8350 9080 0000
00 0807 C0B0 0200
29 0301 B0A0 1000
0F 4F27 C090 0280
12 0301 B090 0080
00 0E00 80C1 0000
03 8401 E190 0280
12 43B0 9080 0000
00 0801 E190 0280
11 83B0 9080 0000
11 C301 B190 0080
00 0E01 B090 0080
0F C3B0 E0C0 1200
29 0301 B0A0 1000
11 0F21 E090 0280
29 0301 B490 0088
00 0000 0000 0000
29 0301 B690 0088
00 0000 0000 0000
29 0301 b390 0088
00 0000 0000 0000
29 0301 9490 0088
00 0000 0000 0000
29 0301 9190 0088
00 0000 0000 0000
0D 8300 B1B0 4402
00 0000 0000 0000
09 C300 A0B4 4402
00 0000 0000 0000
00 0E00 B1B0 4402
29 0300 1000 0030
00 0E00 A0B4 4402
29 0302 1080 0000
29 0306 F0B0 0008
00 0000 0000 0000
29 0305 D0B0 0308
00 0000 0000 0000
29 0305 D0B0 0008
00 0000 0000 0000
29 0306 F0B0 0108
00 0000 0000 0000
29 0305 D0B0 0108
00 0000 0000 0000
29 0301 B0B0 0408
00 0000 0000 0000
29 0301 B1B0 0408
00 0000 0000 0000
29 0301 B7B0 0008
00 0000 0000 0000
29 4300 9080 0060
00 0000 0000 0000
29 4300 9080 0070
00 0000 0000 0000
29 03E0 9080 0000
29 0300 B0C0 5080
29 0300 B0C0 5080
00 0000 0000 0000
00 0E00 B1B0 4402
00 0E00 1045 0010
29 0300 B0C0 5080
00 0000 0000 0000
29 03E0 9080 0000
29 0300 B0D6 5020
29 0300 B0D6 5020
00 0000 0000 0000
00 0E00 90F0 0022
29 0300 38F0 0000
00 0000 0000 0000
00 0000 0000 0000
00 0E00 90F0 0022
29 0300 1840 0010
00 0000 0000 0000
00 0000 0000 0000
00 0E00 A0B4 4402
29 0300 30F0 5000
00 0E00 A0B4 4402
21 0302 1080 0003
29 0303 9080 0000
00 0000 0000 0000
29 0304 9080 0000
00 0000 0000 0000
29 0300 9080 0000
00 0000 0000 0000
29 0300 B0C6 5000
00 0000 0000 0000
29 03E0 A0B5 5402
29 0300 30F0 5000
24 4300 A0B5 5402
00 0000 0000 0000
00 0E00 A0B5 5402
00 0E00 00F0 0000
00 0E00 B1B0 4402
29 0300 2025 5010
00 0E00 A0B1 1402
00 0E00 1080 0007
00 0E00 A0B1 1402
00 0E00 1080 0006
00 0E00 A0B1 1402
00 0E00 1080 0005
00 0E00 A0B1 1402
00 0E00 1080 0004
00 0E00 A0B3 3402
00 0E01 B1B0 2400
29 0370 9880 0000
26 4300 A0B1 1402
2B 43C0 80F0 0030
06 4380 B0C5 6002
2A 03A0 90B0 0008
06 4300 90B0 0008
2A 03A0 90B0 0008
06 43A0 90B0 0008
06 4380 90B0 0008
2A 4300 90B0 0008
00 0000 0000 0000
00 0E00 9080 0043
00 0E01 9196 5040
00 0E00 B0F0 6040
2C 8370 B1B0 4472
2C C300 1045 0010
00 0E00 1045 0410
00 0E00 B1B0 4402
00 0E00 1020 0010
00 0E00 90C6 0002
29 4300 30F0 5000
00 0000 0000 0000
2E 03A0 9080 0000
00 0AA0 9080 0000
2E 4300 9080 0000
00 0000 0000 0000
2F 03A0 1080 0000
00 0AA0 1080 0000
2F 4300 1080 0000
00 0000 0000 0000

  FS1-3=001 执行程序
  FS1-3=000 装入程序

  FS1-3=010 写存储器

  FS1-3=011 读存储器(单步)

  FS1-3=110 单步执行
       =111 连续执行
  FS1-3=100 读存储器(连续)

  FS1-3=101 从0连续执行

  ADD DR, SR

  ADC DR, SR

  SUB DR, SR

  SBB DR, SR

  MOV DR, SR

  MOV DR, [SR]

  MOV [DR], SR

  MOV DR, DATA

  MOV DR, [ADR]

  MOV [ADR], SR

  MOV DR, DATA[SR]

  MOV DATA[SR], DR

  MUL SR

  DIV SR

  AND DR, SR

  XOR DR, SR

  OR DR, SR

  TEST DR, SR

  CMP DR, SR

  PUSH DR

  POP DR

  PSHF

  POPF

  SHL DR

  ASR DR

  SHR DR

  RCL DR

  RCR DR

  INC DR

  DEC DR

  NOT DR

  EI

  DI

  JP CND SR

  JP SR

  CALL SR

  JR CND ADR

  JR ADR

  IN PORT

  OUT PORT

  RET

  IRET

  CLC

  STC

  NOP

  HALT

  JP CND ADR

  JP ADR

  CALL ADR

  LDMC

参考资料：胡敏、钱兴贤《计算机组成接口与通信实验指导》