3.CPU与系统的连接。(1)每片74LS244为八位驱动器,系统中用了二片驱动十六位地址,见图9。控制端1G-(1脚和2G-(19脚))的输入信号与直接存储器存取DMA操作有关,当DMA-无请求时,请求信号保持高电平,它经反相器I\(_{1}\)变为低电平,开通所有地址通道;当DMA-有效时,即为低电平时,它经反相器I1变为高电平,此电平封堵所有地址通道,地址线变为高阻(三态)状态。(2)74LS245的A组端口接CPU的数据线,B组端口接系统数据总线。允许端G-(19)脚接地,使该器件总处于允许状态。DIR(1)脚接在或门I\(_{2}\)的输出端上,入端为CPU发出的时钟φ1和R/W-端,φ\(_{1}\)的作用是控制在其负半周内才能进行读、写操作、因为CPU规定φ1负半周(φ\(_{0}\)正半周)时,CPU才能访问存储器,φ1正半周(φ\(_{0}\)负半周)时,由视濒电路访问存储器。R/W-信号受到DMA-控制,当DMA-有效时,R/W-不起作用,当DMA-无效时,I3控制端接收低电平信号,打开R/W-通道,若R/W-为高电平(读数据)则使B端数据流向A端,进入CPU;若R/W-为低电平(写数据)则使A端数据流向B端进入数据总线,功能见下表:

指令操作过程
了解了上述原理之后,我们再以LDA($12,X)-指令为例,详细讨论一条指令的操作过程。
LDA($12,X)-(机器码为A112-)指令是一条间址X变址寻址方式的指令。操作的宏观过程是:由变址基址$12加上X变址寄存器内容(设为$56)很成地址指针,此时D7有进位;有效地址为地址指针$0068和相邻$0069二单元内容的组合,设($0068)=$A7、($0069)=$43,则有效地址为$43A7;将$43A7内容(设为$C9)取出送入A累加器。指令占两个字节,执行周期为6个节拍。
1.T\(_{0}\)周期操作,目的是取出指令码。执行任意一条指令,首先进行的是取操作码,通常称这段时间为取指周期。操作码存放的地址由程序计数器PC提供,若本指令执行时地址处在$5010,则PC将$5010送入地址总线,延迟后形成稳定的有效状态,如图10;与此同时R/W-变为高电平,经延迟达到稳定,延迟时间不得超过225ns;在地址码和R/W-都有效时,从存储单元读出该操作码A1送至数据总线;PC自动加1,即PC+1→PC,为下一步做好准备。

2.T\(_{1}\)周期操作,对指令译码。T0周期之后,操作码(即指令码)存入指令寄存器IR中,然后进入指令译码器,译码器识别出操作码A\(_{1}\)性质后,CPU取第二字节中存放的变址基址值,指令译码器对程序计数器PC发出控制信号,PC加1;当R/W-高电平和地址码同时有效后,变址基址值$12被读出到数据总线缓冲器中;PC再自动加1,即PC+1+1=PC+2→PC。
3.T\(_{2}\)周期操作,进行变址运算,即AP=$12+(X)。根据译码结果,CPU“知道”A1码要进行变址操作才能找到真正有效地址。变址运算$12+(X)后,$12+(X)=$12+$56=$0068,把$0068作为地址指针AP,见图11。

4.T\(_{3}\)周期操作,目的是读间址结果的真正有效地址低八位。CPU发出控制信号,将地址指针AP送入地址总线,此时PC寄存器被封堵住;在AP地址和R/W-高电平都有效时,将AP所指单元$0068的内容$A7读到CPU的缓冲器作为间址后的真正有效地址低八位;地址指针AP加1,即$12+(X)+1=$0069,为下面操作做好准备。
5.T\(_{4}\)周期操作,目的是读间址结果的真正有效地址的高八位。CPU发出控制信号,将地址指针AP+1($0069)送入地址总线,此时PC寄存器被封住;在AP+1地址和R/W-信号同时有效时,将AP+1=$0069所指单元内容$43填入CPU的数据缓冲器,作为间址最后结果的真正有效地址的高八位,如图11所示。
6.T\(_{5}\)周期操作。CPU发出控制信号,将数据缓冲器中存放的真正有效地址$43A7送入地址总线,此时PC寄存器被封住;在地址码和R/W-信号同时有效时,将$43A7所指单元内容$C9取出,送入CPU的A寄存器中。至此该指令执行过程结束,见图11,释放程序计数器PC的禁止端,为下条的指令做好准备。
CPU寻址方式
CPU的指令由两部分组成:操作码+地址码(或立即数),操作码用来规定所执行的操作,地址码则指明操作数(指参与操作的有关数据)存放的地方。程序的每条指令都依次存放在内存中,一般操作码有放在每条指令的首字节,紧跟其后存放地址码。根据指令所占的字节数,指令可分为:

为了能方便、迅速和准确地找到操作数存放的地址,指令系统设计了各种寻址方式,65SC02 CPU共有15种寻址方式。
1.隐含寻址。指令中只有操作码,没有地址码,即指令是一字节指令。操作数地址是某个隐含约定的寄存器。例如,INX-指令隐含规定将变址寄存器X的内容加1,结果仍总回X变址寄存器中,即X+1→X。
2.累加器寻址。采用这种寻址方式的指令是一字节指令,它以隐含方式指出参与操作的操作数为A累加器内容。例如算术左移指令ASL A-,即C←D\(_{7}\)|…|D0←0。
3.立即数寻址。指令是二字节指令,第一字节是操作码,第二字节为操作数。因为操作数直接出现在操作码之后,故又称立即数。例如指令LDX#$06-,是将十六进制(用“$”表示)立即数(用“#”表示)06存入变址寄存器X中,即$06→X。
4.零页寻址。二字节指令。65SC02 CPU规定地地高八位表示存储器页面,低八位作为页内单元地址。零页地址就是处于$0000~$00FF范围内的存储单元。在64kB内存中有256个页面,每个页面有256个单元,这样共有256×256=64×1024(即64K)内存单元。所谓零页寻址就是CPU与零页内的单元交换数据,其指令第一字节是操作码,第二字节是地址码。例如指令STA $75-是将累加器A中的内容存入零页的$0075单元中,即A→$0075。
5.绝对寻址。三字节指令,指令构成是:操作码+绝对地址低八位+绝对地址高八位。例如助记符为LDA $0201-(机器码为AD 01 02)的指令,是将$0201的内容送到累加器A中,即(0201)→A(括号表示$0201单元的内容)。
6.零页X变址导址。二字节指令,指令的第二字节存放零页单元的基地址,它不是实际要访问的内存单元地址,真正地址是零页基地址加上X变址寄存器的内容(数据),相加时X为八位,零页基地址也是八位,注意:相加时不产生向高位的进位,因此所形成的地址仍是零页内的地址。例如指令STA $18,X-(机器码95 18-),以$18为零页基地址,加上X变址寄存器内容(假设为$F2),形成新地址为$F2+$18,在不考虑进位情况下零页地址是$0A(而不是$10A)。本指令是将累加器A的内容存入$000A单元中,即A→18+(X)。图12为零页变址寻址指令操作示意图。

7.零页Y变址寻址。本指令操作与上述指令操作完全相同,只是零页有效地址是由零页基地址加上Y变址寄存器内容形成的。
8.绝对X变址寻址。三字书指令,第二、三字节分别存放着形式地址的低八位和高八位,注意这不是所需的真正地址,真正地址是形式地址加上X变址寄存器内容。如指令LDY $0247,X-(机器码为BC 47 02-),是将形式地址$0247加上X变址寄存器内容(假设为$03),形成真正地址$031A,注意形式地址低八位与X变址寄存器内容相加时要考虑D7(低八位中的最高位)向高位的进位。本指令的操作为把所得的真正有效地址的内容(假定为$0C)送入Y变址寄存器,即($0247+(X))→Y,见图13。这里Y变址寄存器来自指令LDY $0247,X-中的LDY,如果是LDY,则所效地址内容充入X变址寄存器。

9.绝对Y变址寻址。与绝对X变址寻址操作完全相同,只是形式地址与Y变址寄存器内容相加形成有效地址。
10.变址X间址寻址。所谓间址是指变址所形成的地址只是一个地址指针,指针所指的单元内容不是所需内容,而是真正有效地址,这个有效地址的内容才是所需数据——间接找到的地址中的内容。这类指令一般是二字节指令,第二字节存放着所需的基址。有效地址形成过程是先变址(见图14①过程)形成地址指针(见图14②过程),后间址(见图14③过程),间址内容才是真正有效地址(见图14④过程)。例如指令LDA($FE,X)-(机器码A1 FE-),其中$FE为变址基地址,它与变址寄存器X内容(假定为$05)相加形成地址指针AP(注意这是在零页内进行的,即D7不向高位进位,故AP也在零页内),APL=$FE+$05,不计进位为$03,故AP为$0003。真正有效地址为AP和AP+1所指单元的内容,假设AP=$0003的内容为$A0, AP+1=$0004内容为$50,则真正有效地址AD=$50A0,指令的执行过程是把真正有效地址的内容存入累加器A,即($FE+(X))=AD\(_{L}\),($FE+(X)+1)=ADH,(AD)→A。见图14所示。

11.间址变址Y寻址。它是二字书指令,第二字节中存放着间址值D。该寻址方式的指令操作步骤是先间址(在零页内进行)地址指针(如图15①所示),指计所指单元和相邻单元内容联合成为形式地址(图15②所示),形式地址加Y变址寄存器内容(图15③所示)成为有效地址,注意相加时D7有进位。如指令LDA($86)-,Y(机器码B1 B6-),$B6为间址基址,它形成零页地址指针$00B6(设其内容为$D4),其内容与相邻单元$00B7内容(假设内容为$02)联合成为形式地址$02D4,这个形式地址加Y变址寄存器内容(设为$05)相加形成有效地址$02D4+$05=$02D9。本指令是将有效地址$02D9单元内容(设为$FF)取出送至A累加器中,即($00B6)=$D4,($00B7)=02,($02D4+(Y))→A。

12.相对寻址。它是二字节指令,第二字节存放着转移偏移量。这种寻址方式用于程序转移指令,转移到的地址是以当前所执行指令的地址为中心加上转移偏移量形成转移的有效地址。如BEQ $06-中的$06就是转移偏移量,与上述寻址方式不同的是,本指令操作的执行是有条件的,即当零标志位Z=1(即结果为0)时才执行转移。转移地址是当前指令(BEQ$06-)的地址(用程序计数器PC表示,假设为$AFFB)加上偏移量$06,即$AFFB+$06=$B001,这才是最后地址。要特别注意,在执行BEQ$06-这个二字节指令时,PC已由原来的$AFFB(加上指令字节数2)变成了$AFFD,若以$AFFD为中心来计算转移地址就错了,所以计算机自动修正单元地址,偏移量减去2,这样就保证了以当前执行指令地址为中心成立。所以,助记符为BEQ$06-的指令的机器码为FO 04-,其中04=06-02。指令的执行是PC+$06→PC。见图16。

13.间址转移寻址。它是三字书指令,机器码中的第二、三字节分别存放着地址指针的低八位和高八位,地址指针指示地址与其相邻地址的内容联合构成有效地址。如JMP($0301)-,若执行该指令时PC为$0002(图17①),则执行指令时先从指令的第二、三字节中取出地址指针$0301(见图17②),地址指针与相邻单元$0302的二个单元内容共同构成有效地址$04B5(见图17③),有效地址送PC,PC刷新为$04B5,表示程序跳到这个实际转移地址(图17④),即($0301)→PC\(_{L}\),($0302)→PCH。

以上13种方式为65SC02 CPU和6502 CPU共同具有的,在此基础上65SC02 CPU又扩允了两种寻址方式。
14.零页间址寻址。这是二字节指令,第二字节存放的是零页内地址指针的低八位,地址指针和相邻单元的内容为有效地址。如指令STA($07)-,$07为零页地址指针$0007的低八位,设其内容为$0A(见图18①),相邻单元$0008内容为$0F,则实际有效地址为$0F0A(见图18②),执行STA($07)-指令是将A累加器内容(设为$00)送入$0F0A单元中存放,即($0007)=$0A,($0008)=$0F,A→$0F0A

15.绝对X变址间址寻址。采取这种寻址方式的指令又有JMP指令,它是一个三字节指令,指令的第二、三字节分别存放着绝对地址的低八位和高八位。寻址的操作过程是:先由绝对地址低八位与X变址寄存器内容相加找到地址指针AP(图19①),注意D7有进位;地址指针AP的内容为间址后的实际有效地址的低八位,AP+1的内容为间址后的实际有效地址的高八位(图19②);实际有效地址和其相邻单元内容分别送入PC\(_{L}\)和PCH中存放(图19③),即为转移地址。例如指令JMP($5000,X),设X变址寄存器内容为$FF,则地址指针AP为$5000+(X)=$50FF, AP+1为$5100(假设($50FF)=$00,($5100)=$60),则AP和AP+1合成的实际有效地址为$6000(设($6000)=$00,($6001)=$90),$6000和$6001中的内容合成跳转地址$9000,跳转地址分别送入程序计数器PC的低八位PC\(_{L}\)和高八位PCH,这样程序就从PC指示的新地址$9000开始继续执行下去。指令执行过程是:($5000+$FF)=00,($5000+$FF+1)=$00;($6000)=$00,($6001)=$90;$00→PC\(_{L}\),$90→PCH。(乌振声)
