任天堂NES模拟器如何开发3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任天堂NES模拟器如何开发3?
NES的CPU处理方框图
NES的数据总线只有8位,也就是说上图4个单元数据的传输只是8位,用计算机里的就是一个字节,一次只能完成8位数据(0--255)的处理
CPU(中央处理单元)方框图下有两个通道,一个是8位控制总线,一个是16位地址总线。
NES的CPU的内存寻址大小为64kB,所以它用16位地址总线的寻址范围从$0000-$FFFF.
CPU的全局控制内存映像图说明:
1. $0000--$00FF 6502 CPU 零页公共区 (256字节)
2. $0100--$01FF 6502 CPU 公共堆栈区 (256字节)
3. $0200--$0700 公共内存区 (1.5K字节)
4. $0800--$1FFF $0000 -- $0700的镜像. 连做了3次镜像(6K字节)
换句话说,对它们的操作(读/写)实际就是对$0000--$07FF的操作。
比如:读取 $08AB 的内容实际等于读取$00AB的内容。
而向$15CC写数据实际等于向$05CC写数据. $0800--$0FFF, $1000--$17FF, $1800--$1FFF 这3块不是物理的 RAM,它们都是镜像.
5. $2000--$3FFF 6502 PPU I/O 地址区,系统使用. (8K字节)
6. $4000--$43FF CPU 内部功能部件 I/O 地址区,系统使用 (1K字)
7. $4400--$5FFF 扩充空间 (5K字节)
可用于各种扩充外设的 I/O 端口,或扩充ROM和RAM地址空间.
8. $6000--$7FFF 公共RAM空间
公共内存区,可为系统程序及用户程序使用
9. $8000--$BFFF 分页区间 (16K字节)
按16K字节分区,页号00--FF(一个字节),最大支持4M字节容量.用于系统程序及应用程序的主要程序数据区.
10.$C000--$FF00 公共RAM空间(16K字节)
公共内存区,可为系统程序及用户程序使用. (注$C000--$FFFF 区间的RAM与分页区间的最后一页第FF页的RAM是同一段区域)
也就是说第9和第10这32k空间是一起的!
11.$FF00--$FFFF 系统区
6502内部有6个可供使用的寄存器(A,X,Y,S,P,PC),其中除程序计数器PC是16位以外,其它寄存器均为8位。
1. 累加寄存器A(Auumulator)
它是一个8位寄存器,一般称为累加器或A寄存器,它同算术逻辑运算单元ALU一起完成各种算术逻辑运算,在通常的工作中,它既为ALU提供始操作数据又担任存放ALU的运算结果的任务,它是使用最多的寄存器.
2. 变址寄存器 X、Y(lndex Register)
变址寄存器共有2个,均为8位寄存器,分别用字母X、Y表示(不分大小写),它们主要用在变址寻址方式中存放地址偏移量(变址器).也常被为做计数的使用,还可以作为通用寄存器用于暂存数据.
3. 堆栈指针寄存器 S(Stack Pointer)
它是专用于指示系统堆栈栈顶位置的8位寄存器,由于6502CPU规定系统堆栈区设置在第一页($100~$1ff),所以堆栈指针S有8位已能满足使用,
工作中它指向堆栈地址的低8位,在有数据进栈时,S内容自动减一,数据出栈时,S内容自动加一.
4. 程序计数 PC(Program Counter)
PC是6502CPU中的16位寄存器,它主要用于存放下一条指令的首字节地址,当程序顺序执行时,每取出一个指令程序PC自动加一,为取下一个指令字节作为准备;当程序需要转移到新的地址时,则PC中将放进要转移的目标地址.
5. 标志寄存器 P(Pracessor Status)
标志寄存器P也称状态寄存器,也是一个8位寄存器,工作中只使用了7位.状态寄存器可以提供CPU执行完上一条指令后的状态信息.
C —进位标志(Carry),它标志着指令执行后最高位的进位状态,进行加法运算时,若高位有进位则C=1,否则C=0,进行减法运算时,若最高位有借位则C=0,否则C=1
Z —零标志(Zero),它表示本次操作执行结果的情况,若结果为0则Z=1;否则Z=0.
I —中断禁止(屏蔽)标志(Interrupt Disuble),它表明是否允许中断.允许中断时I位为0,禁止中断时I位为1.
D —十进制运算标志,在任天堂游戏(FC)中没有被使用.
B —软件中断指令标志(Break Flay),它表示软件中断状态,当执行BRK指令后B位置1,否则B位为0.
V —溢出标志(Verlow),它表明本次运算结果的溢出状态,若有溢出则V位置1,否则V位置0.
N —负数标志(Negative Flay),它表明本次运算结果是否为负,实际上是把本次运算运结果的最高位(D7位)复制到N中(对于带符号的8位二进制数,D7位为0是正数,D7位为1是负数.
若V=0(无溢出时),N代表运算结果的符号,即运算结果为负数时N 为1,否则N为0.
若V=1(有溢出时),N代表的符号与运算结果符号相反,即运算结果是负数时N=0,是正数时N=1.。