·考虑到计算机刚加电通过RESET键总清计算机时,必须有办法保证从微程序的一个准确的入口微地址开始运行。检查所用线路Am2910已提供的处理能力,当CI3~CI0为0000状态时,Am2910输出的微地址一是为0,故选定微程序的启动入口微地址为0是合理的;又由于监控程序被固化在内存ROM区域并从内存的0地址开始,故微程序最开始的两条微指令(微指令地址为0和1)控制的功能,是把0值传送到16位的程序计数器PC中,为启动监控程序的运行过程准备好起始地址。
·接下来的3条微指令(微指令地址为2,3和4)用于控制读取指令的操作,公用于所有指令,也就是说,任何一条指令都从微地址为2的微指令开始自己的执行过程,再深一步说,每一条指令结束自己的执行过程的之后,都要转移到微地址2,以便正确地开始下一条指令的执行过程。
·取来指令,也就是得知了即将执行的指令内容之后,应该按指令操作码分支到对应的微程序段(由1到多条微指令组成)。这是借助选通MAPROM硬件的输出为下一条微指令地址完成的。前面已讲过,MAPROM是一片ROM芯片,它的输入地址是机器指令的操作码,该地址选中的单元中存放的是对应于这条指令的微程序段的入口微地址。选择MAPROM的输出为下一条微指令地址,是通过向Am2910提供2#命令(使CI3~CIO编码为0010)实现的。
这里就有个必须解决的问题,即"何时"向Am2910提供2#命令码,是在读取指令并送入IR的微指令中进行,还是到下一条微指令中再完成。这主要取决于,是在读取指令的微周期(执行一条微指令的时间)的什么时刻才能准确得知取出来的指令的操作码,即在什么时刻才把读出的机器指令打入指令寄存器IR,若在微周期结束时的时钟脉冲的上升沿完成,则用指令操作码作为MAPROM的地址并完成读控存只能到下一条微指令中执行;若在时钟脉冲中部的下降沿处送指令内容到IR,则该微周期的后半段时间就可以使用MAPROM给出的微地址完成读控存的操作。此方案的矛盾在于,每一个微周期都必须足够长,大体相当于两次读控存的时间,时间太长,实用中肯定是不能接受的。但在TEC-3教学计算机中,由于所选的主振脉冲频率很低,这种方案都是可行的。事实上,在组合逻辑的控制器方案中,我们已选择了使用时钟脉冲的下降沿的反向信号作为IR的打入脉冲(同样存在使节拍时间太长的不合理性)。此处我们还是选择了前一种方案,并保留了切换为后一种方案的手段,即可以在微地址为5(或微地址为4)的微指令中实现指令功能分支的操作,具体实现技术到下一小段去说明。
·剩下来的工作,是为每条指令所对应的微程序段分配控存空间。分几种情况讨论。
一是对A组指令,每条指令对应各自的一条微指令,彼此之间互无牵扯,此时在控存中找一片区域,用来顺序存放这每一条微指令即可。例如,在TEC-3机中,就把06~12(均为16进制表示)这13个控存单元直接分配给A组的13条指令。对MAPROM的设计来说,把这13条指令的操作码作为MAPROM地址所选中单元的内容应分别确定为06~12。
对另一些指令,彼此间会使用若干条内容完全相同的微指令。合理的处理办法,是在可能的条件下,同一条(段)微指令只出现在微程序中一次(即只为其分配一个(段)控存单元),但可以在多条指令的执行过程中被使用,这个问题在前一小段已经提起过。例如,读写内存的两条指令,使用同样内容的2条微指令传送内存地址,可以合用,而不是为每条指令各自分配单独的2条微指令。具体实现中的基本思路,是为这两条机器指令指定相同的微程序的入口地址,并在传送内存高位地址的微指令中,通过检查指令的操作码区分到底是读内存还是写内存指令,确定接下来是顺序执行下一条相邻微指令(例如完成读内存操作)还是转移到另外一条微指令(例如完成写内存操作)。这样,只用4条微指令,而不是6条微指令就实现了读写内存的两条机器指令的控制过程。类似的办法也被用于执行进栈操作的两条机器指令,执行出栈操作的两条机器指令的控制过程。
更典型的,是对取立即数指令(MVD)和5条相对转移指令的处理办法。它们的前两条微指令都用于传送内存地址和修改PC内容。在它的第二条微指令中,通过检查指令操作码来判断是MVD指令还是转对转移指令,若是MVD指令则转移到第16条微指令处,完成读内存并把读出的立即数传入DR寄存器(目的寄存器);否则为相对转移指令,就顺序执行下一条微指令,开始处理相对转移指令。首先判断应不应该转移,当为JR指令,JZ指令且Z为1,JNZ指令且Z
为0,为JC指令且C为1,当JNC指令且C为0时,应该执行转移;否则就不执行转移,可直接跳转到判断中断请求的微指令处,无中断请求时回到微地址为2的微指令处,开始下一条机器指令的执行过程。用于完成5条相对转移指令的转移处理,只需使用两条微指令即可完成,即从内存读出offset值并与R4相加以计算转移地址的低位部分,再用CO值与R5相加计算转移地址的高位部分。总的合计下来,6条指令的执行过程只使用了6条微指令(还有一条是与另外指令合用的),而不是3条(用于MVD指令)+
4条′5(用于5条相对转移指令)=23条微指令,可见正确的设计对减少控存容量是多么重要。
对另外几条指令(包括CALL指令,RET指令,TPC,FPC,TSP和FSP 四条专用指令)的微程序段,就不再进行其他处理,把每条微指令依次排列起来即可,并且还把CALL指令使用的最后两条微指令用于控制JMP指令的执行过程。
|
|