如何写一个NES模拟器(一)
1.认识NES文件格式
偏移0-3 字符串“NES^Z”用来识别.NES 文件
偏移4 16kB ROM 的数目
偏移5 8kB VROM 的数目
(摘自《任天堂产品系统文件》)
NES文件的前16个字节是文件头,前4个字节是NES^Z,文件标识。第5个字节是16K ROM的数量,第6个字节是8K VROM的数目。
ROM文件格式具体是这样:16字节(文件头)+16K x N(程序主体) + 8K x N(VROM),这就是一个完整的NES格式的ROM文件。其中8K VROM是点阵格式的字模文件,就是游戏中画面的最小元素,如果你了解点阵格式的话,你知道A的点阵大约是
00010000 一个字节
00202000 一个字节
03000300 一个字节
20000020 一个字节
11111110 一个字节
20000020 一个字节
30000030 一个字节
如果只是黑白点阵格式,图中的2和3,只能是1,因为2进制只有0和1,且每行一个字节,那么8个字节可以表示一个字母。任天堂使用2个点阵来表示一个点阵,其中前一个点阵(8字节)表示颜色的bit0位,后一个点阵(8字节)表示颜色的bit1位。
那么上图就是把2个点阵叠加在一起。
知道了这些内容后,我们写一个读取VROM的程序。
先读取rom文件到buf中,这里我把文件指针直接移动到了字模处
liCurrentPosition.LowPart = neshreader->romnum * 16 * 1024;
SetFilePointerEx(hFile, liCurrentPosition,&liCurrentPosition,FILE_BEGIN);
ReadFile(hFile,(LPVOID)buf,8 * 1024,&readsize,NULL);
然后就是画单个字模图形函数。
根据上图来绘制单个字模。
void Draw_Tile(int x,int y,unsigned char * p,unsigned char index,unsigned char high2bit,char flip,int type){int i,j,c = 0,d;unsigned char a,b,a1,b1;//绘制图案for (j =0;j < 8;j++){//存储8*8图案一共需要16个字节,a1 = *p; //指向上图的地址0b1 = *(p+8); //指向上图的地址8 for (i = 0;i < 8; i++){
//从左至由绘制点
a = (a1 >> (7 - i) << 1 ) & 2; //a值=a1右移后再左移一位b = (b1 >> (7 - i)) & 1;//颜色索引,a和b组成低2位 (a or b)d = (unsigned char)(a | b);
//如果低2位是1,2,3分别绘制不同的颜色
if(d == 1 ){draw_window_point(x * 8 + i,y * 8 + j,RGB(0,0,255),(UINT *)color,256);}else if(d == 2){draw_window_point(x * 8 + i,y * 8 + j,RGB(0,255,255),(UINT *)color,256);}else if(d == 3){draw_window_point(x * 8 + i,y * 8 + j,RGB(255,255,255),(UINT *)color,256);}}p++;}}
--------------------
绘制所有图形
void drawchr(void * buf){int i,j,x,y,c = 0,d;unsigned char a,b,a1,b1;//分配内存地址pScreenMem =(unsigned char *) malloc(256*128*4);
//创建dib位图CreateScreen(m_hWnd);
//得到图案表首地址
unsigned char * p = (unsigned char * )buf;
//绘制16行
for (y = 0; y < 16;y++){
//每行绘制32个块for(x = 0; x < 32; x++){Draw_Tile(x,y,p,0,0,0,0);p += 16;}}//得到窗口句柄HDC hDc = ::GetDC(m_hWnd);//开始显示图形LoadFrame(color,hDc);}
---------------------
附图一张,接下来我们就可以绘制整个命名表了,接着就是精灵的绘制,我们还要模拟CPU,并在vblank中不断的绘制图形,形成游戏画面了。Demo程序地址如下
链接:https://pan.baidu.com/s/1WdZx3T7HifTW75bcRYqhNQ
提取码:q8oq
如何写一个NES模拟器(一)相关推荐
- 如何写一个NES模拟器(二)——显示命名表
前面写了读取和显示图案表,现在来写如何显示命名表.这些内容都出现在<任天堂产品系统文件>中,若有疑惑,请下载此文件. PPU 的内存空间如下 地址0x0000- 0x1fff 是图案表,所 ...
- 模拟器不全屏_puNES 适用于 Windows 和 Linux 的开源 NES 模拟器
在游戏方面,我个人并不喜欢玩网络游戏,如果要玩游戏,也都是玩一些单机版的,我个人比较喜欢 ATC 动作过关游戏.年前的时候用发小的 PS4 玩了几天,虽然游戏都是大作,但是仍然无法撼动我对单机以及像素 ...
- 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合
让嵌入式想java一样一处编写到处运行 第一次写博客,其实接触嵌入式已经快两年了,从开始学51单片机的时候,怀着满腔的热情.写出了点亮第一个流水灯代码的时候那个无比的激动,到后面自己做许多有趣的东西( ...
- 一个完整的NES模拟器
(这个版本的忍者神龟,好多年都没玩过了.译者) 也许不久后,你就可以在android手机上重温以前在电视上玩塞尔达和超级玛丽来度过暑假的日子了,就是这个NES模拟器. 模拟器有两个版本:lite版,你 ...
- 写一个GAMEBOY的模拟器
想写一个GAMEBOY的模拟器应该是很久很久以前的想法了,不过都没有去实现过.一则工作太忙,二则很懒,三是自己做事情总是虎头蛇尾.去年某一天,突然下定决心要写一个GAMEBOY的模拟器,主要还是想要锻 ...
- 单片机开发---ESP32S3移植NES模拟器(二)
书接上文 <单片机开发-ESP32-S3模块上手> <单片机开发-ESP32S3移植lvgl+触摸屏> <单片机开发-ESP32S3移植NES模拟器(一)> 暖场视 ...
- jsemu - 用 JavaScript 写成的模拟器大集合
转载地址:https://juejin.im/entry/564ad56b60b2260e5ba13612 原文链接:https://github.com/BigEd/jsemu 一个大大的列表,全部 ...
- 单片机开发---ESP32S3移植NES模拟器(一)
书接上文 <单片机开发-ESP32-S3模块上手> <单片机开发-ESP32S3移植lvgl+触摸屏> 参考内容 依旧是参考韦东山老师的作品来移植的 <ESP32|爷青回 ...
- 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载
NES Emulator TV精选了上千款经典的红白机小游戏,我们小时候玩过的经典游戏都能够在这里找到,每一款游戏在这里都能够分别存档,没有太多时间的上班族可以尝试一下,给玩家带来最好的游戏体验. 软 ...
- 使用js在桌面上写一个倒计时器_论一个倒计时器的性能优化之路
原文发表于 2018.05.25,搬运自个人博客. 引子 回顾这半年,扛需求能力越来越强,业务代码也是越写越多.但稍一认真看看这些当时为了满足快速上线所码的东西,问题其实还是不少.这次就从一个简单的计 ...
最新文章
- Generic Data Access Layer泛型的数据访问层
- 了解下SOAP Envelope 元素
- 在线作图|2分钟在线绘制RDA图
- 智慧旅游建设方案_智慧灯杆及智慧交通设施建设方案
- 将二叉搜索树转换为有序的双向链表
- python基本输入输出代码示例
- 信贷风控知识问答库(持续更新)
- VTK:可视化算法之ColoredAnnotatedCube
- 飞鸽传书程序IT基础架构和应用的管理
- 最小化安装的redhat/centos安装gnome桌面
- Python爬虫 糗百段子
- 运动控制系统常用传感器介绍
- 左手招新,右手裁员,2019开年就业形势扑朔迷离
- 中国五笔 恶意软件清理助手
- 下载excel打开后弹出警告提示,文件类型和文件内容不符问题处理
- 天赐转债,强联转债,再22转债上市价格预测
- 室内定位的电子地图编辑工具
- push to origin/dev was rejected
- 卸载vivo手机自带的应用程序
- 哔咔服务器无响应,哔咔哔咔漫画进不去怎么办 无法进入解决办法
热门文章
- 经典胶片图像效果lr预设
- C语言骑士与金币问题
- 要留住优秀员工,除了钱,你还可以用什么?
- Lighttpd介绍
- 阿里巴巴Mysql规范
- 给排水科学与工程和计算机选哪个,2021中国给排水科学与工程专业大学排名 最好的高校排行榜...
- Go:一次 exit code 是 137 且 无 coredump 的排错经历
- 用border-color 的 transparent 制作一个三角形
- 利用边长计算三角形面积 — 海伦公式推导过程
- 【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库