资源简介
一个自己编写的FC模拟器,可以运行一些体积小于40KB的游戏(部分游戏有Bug),程序结构简单,可以说是模拟FC最少所需要的代码量。使用freeglut库输出图像。

代码片段和文件信息
#include
#include “Cpu.h“
using namespace std;
CCpu::CCpu(void):NesFile(NULL)
{
}
CCpu::~CCpu(void)
{
delete NesFile;
}
// 初始化CPU
void CCpu::Init(CNesFile* FileCPpu* ppu)
{
if(NesFile)
delete NesFile;
NesFile=File;
Ppu=ppu;
Reset();
}
// 复位CPU
void CCpu::Reset(void)
{
Ppu->Init(NesFile);
memset(Memory00x800); //将内存全部设为0
memset(SRAM00x2000); //SRAM设为0吧
RegA=RegX=RegY=0;
RegSP=0xff;
RegPC=ReadWord(RES_VECTOR);
RegP=Z_FLAG|R_FLAG;
isUp=isDown=isLeft=isRight=isA=isB=isSelect=isStart=false;
}
// 模拟一条CPU指令
bool CCpu::emulate(void)
{
BYTE opcode=ReadByte(RegPC++);
WORD WordTemp;
BYTE ByteTempByteTemp2;
switch(opcode)
{
//ADC Immediate
case 0x69:
ByteTemp=ReadByte(RegPC++);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC Zero Page
case 0x65:
ByteTemp=ReadByte(RegPC++);
ByteTemp=ReadByte(ByteTemp);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC Zero PageX
case 0x75:
ByteTemp=ReadByte(RegPC++);
ByteTemp=ReadByte((ByteTemp+RegX)&0xff);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC Absolute
case 0x6d:
WordTemp=ReadWord(RegPC++);
RegPC++;
ByteTemp=ReadByte(WordTemp);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC AbsoluteX
case 0x7d:
WordTemp=ReadWord(RegPC++);
RegPC++;
ByteTemp=ReadByte(WordTemp+RegX);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC AbsoluteY
case 0x79:
WordTemp=ReadWord(RegPC++);
RegPC++;
ByteTemp=ReadByte(WordTemp+RegY);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTemp;
TestFlag(RegA==0Z_FLAG);
TestFlag(RegA&0x80N_FLAG);
break;
//ADC (IndirectX)
case 0x61:
ByteTemp=ReadByte(RegPC++);
WordTemp=ReadWord((ByteTemp+RegX)&0xff);
ByteTemp=ReadWord(WordTemp);
WordTemp=RegA+ByteTemp+(RegP&C_FLAG);
TestFlag(WordTemp>0xFFC_FLAG);
TestFlag((~(RegA^ByteTemp))&(RegA^WordTemp)&0x80V_FLAG);
RegA=(BYTE)WordTe
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 32504 2011-10-12 12:49 nesEmu\nesEmu\Cpu.cpp
文件 4313 2011-10-13 11:33 nesEmu\nesEmu\Cpu.h
文件 3616 2011-10-15 22:18 nesEmu\nesEmu\Main.cpp
文件 306176 2011-10-13 12:56 nesEmu\nesEmu\nesEmu.exe
文件 4774 2011-10-13 11:48 nesEmu\nesEmu\nesEmu.vcxproj
文件 1586 2011-05-11 21:13 nesEmu\nesEmu\nesEmu.vcxproj.filters
文件 143 2011-05-11 16:35 nesEmu\nesEmu\nesEmu.vcxproj.user
文件 997 2011-05-11 23:32 nesEmu\nesEmu\NesFile.cpp
文件 1492 2011-05-22 11:02 nesEmu\nesEmu\NesFile.h
文件 7251 2011-10-15 22:17 nesEmu\nesEmu\Ppu.cpp
文件 2516 2011-10-13 11:33 nesEmu\nesEmu\Ppu.h
文件 24592 2002-10-27 15:29 nesEmu\nesEmu\test
文件 156 2011-10-15 22:17 nesEmu\nesEmu\typedef.h
文件 40976 2011-10-12 13:35 nesEmu\nesEmu\五子棋
文件 65552 2011-10-12 13:36 nesEmu\nesEmu\俄罗斯方块
文件 40976 2011-10-12 13:36 nesEmu\nesEmu\弹球
文件 40976 2011-10-12 13:37 nesEmu\nesEmu\拆屋工
文件 40976 2011-10-12 13:35 nesEmu\nesEmu\挖金子
文件 24592 2011-10-12 13:36 nesEmu\nesEmu\敲冰块
文件 40976 2011-10-12 13:37 nesEmu\nesEmu\超级玛丽
文件 885 2011-05-11 16:35 nesEmu\nesEmu.sln
..A..H. 20480 2011-10-15 22:18 nesEmu\nesEmu.suo
目录 0 2011-10-15 22:18 nesEmu\nesEmu
目录 0 2011-10-15 22:19 nesEmu
----------- --------- ---------- ----- ----
706505 24
- 上一篇:词法分析器语言源代码
- 下一篇:基于51单片机的家庭防火防盗设计
相关资源
- 虚拟光驱deamon 适用于64位服务器的
- pfc 使用说明.doc
- 虚拟鼠标
- 黑苹果硬件兼容检测和查询软件
- 基于MFC扩展CListCtrl子项显示图片并叠
- 黑白棋(带简单AI)
- 卡西欧工程计算器模拟器Casio FX
- MFC程序-碰撞的小球
-
Cme
taFileDC的使用示例 - ado数据库MFC图书管理系统vs2010
- NRF24L01实现51与STM32双向通讯
- mfc单文档窗体画线与写字
- [免费]MFC制作目录树
- web js虚拟键盘(中英文切换)
- 模拟段页式虚拟存储管理中地址转换
- MFC读三维模型obj文件
- 画图程序MFC/VC/VC CRectTracker 串行化
- MFC网络编程实例
- c 程序判断离散数学中命题公式
- MFC控件动态拖动
- Alcor(安国)SC708(FC8708)/AU6987/AU69
- MFC中OpenGL面和体的绘制以及动画效果
- c MFC 画多边形
- RSA AES DES ECC加密算法源码
- Microsoft基本类库 (MFC)(C 库)
- vmnetbridge.dll,vmnet.sys等文件
- vc利用MFC底层开发的二维GIS管理软件,
- (MFC) 时钟日期程序
- 一个基于MFC的GridCtrl,提供类似Excel的
- 用MFC实现简单的画图功能
评论
共有 条评论