FC模拟器的实现 - MOS6502(3) - JAVA

/ 编程技术 / 没有评论 / 2120浏览

作者:玉米


前面的文章我们简述了CPU的构造,以及CPU通用的寄存器相关解释。但是这并不是很全面。

以下内容是作为对MOS6502部分的一些补充说明。

MOS6502的寻址能力

因为MOS6502有一条16位地址总线,固16位寻址能力 = 2^ 16次方 = 65536byte = 64KB数据。

2进制转10进制数:1111 1111 1111 1111(2) = 65536

所以MOS6502能读取64KB的内存大小。又因为64KB = 0x10000。 所以以下内容则用0x10000这个16进制数来说明内存镜像的分配。

MOS6502寻址内存镜像

其中这个内存镜像中:

[0x10000 , 0x8000) = PRG-ROM 注:Program(PRG),程序代码存储区

[0x8000 , 0x6000) = SRAM 注:SRAM 为人物精灵运算存储区

[0x6000 , 0x4020) = Expansion-ROM

[0x4020 , 0x2000) = I/O Register 注:MOS6502的端口

[0x2000 , 0x0000) = RAM 注:MOS6502的RAM

MOS6502状态寄存器的的状态标记

状态寄存器 标志(Processor Status Register Flags)

状态寄存器寄存器包括8个 "标记" (标记 = 显示某些事情发生或者没有发生的东西).

状态寄存器寄存器中的位的值得修改 依赖于算术和逻辑运算的结果. 位被描述如下:

7 6 5 4 3 2 1 0 Bit No.(位编号)

N V - B D I Z C

C_FLAG equ 01h ; 1:

进位标记(Carry): 运算结果出现进位的时候设置为1

Z_FLAG equ 02h ; 1:

零标记(Zero): 运算结果出现0的时候设置为1

I_FLAG equ 04h ; 1:

硬件中断标记(IRQ): 中断启用的时候,该标记设置为1

D_FLAG equ 08h ; 1:

十进制模式标记(Decimal): 启用十进制模式的时候,该标记设置为1

B_FLAG equ 10h ; 1:

程序中断标记(BRK): 程序中断启用时,该标记设置为1

R_FLAG equ 20h ; 1:

未被使用,该标记默认是1

V_FLAG equ 40h ; 1:

溢出标记(Overflow): 运算结果溢出时,该标记设置为1

N_FLAG equ 80h ; 1:

负数标记(Negative): 运算结果出现负数时,该标记设置 为1


MOS6502CPU的寻址方式

MOS6502有13种寻址方式,分别是立即寻址、零页寻址、零页 X 变址、零页 Y 变址、绝对寻址、绝对X变址、绝对Y变址、间接寻址、先变址X后 再间接寻址、后变址Y 再间接寻址、隐含模式、累加器、相对寻址。

什么是寻址方式?

寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。

原文出自:百度百科

至于具体怎么算的,我到时候会做详细说明。


MOS6502CPU 的几种中断

MOS6502有三种中断,分别是:硬件中断(IRQ)、不可屏蔽中断(NMI)、可屏蔽中断(BRK) 也称复位Reset。

什么是中断?

中断全过程指的是从中断源发出中断请求开始,CPU响应这个请求,现行程序被中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来的程序继续执行的整个过程。

原文出自:百度百科


指令时钟周期

另外为了模拟出FC硬件的真实环境。我们还需要给CPU每一条指令设置一个指令时钟周期。

指令周期是取出一条指令并执行这条指令的时间。一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。

指令周期类型有非访内指令的指令周期、取数指令的指令周期、存数指令的指令周期、空操作指令和转移指令的指令周期。

原文出自:百度百科

有了以上知识后,我们可以比较轻松搭建我们的CPU骨架,当然这里还未涉及指令集。