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模拟器(一)相关推荐

  1. 如何写一个NES模拟器(二)——显示命名表

    前面写了读取和显示图案表,现在来写如何显示命名表.这些内容都出现在<任天堂产品系统文件>中,若有疑惑,请下载此文件. PPU 的内存空间如下 地址0x0000- 0x1fff 是图案表,所 ...

  2. 模拟器不全屏_puNES 适用于 Windows 和 Linux 的开源 NES 模拟器

    在游戏方面,我个人并不喜欢玩网络游戏,如果要玩游戏,也都是玩一些单机版的,我个人比较喜欢 ATC 动作过关游戏.年前的时候用发小的 PS4 玩了几天,虽然游戏都是大作,但是仍然无法撼动我对单机以及像素 ...

  3. 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合

    让嵌入式想java一样一处编写到处运行 第一次写博客,其实接触嵌入式已经快两年了,从开始学51单片机的时候,怀着满腔的热情.写出了点亮第一个流水灯代码的时候那个无比的激动,到后面自己做许多有趣的东西( ...

  4. 一个完整的NES模拟器

    (这个版本的忍者神龟,好多年都没玩过了.译者) 也许不久后,你就可以在android手机上重温以前在电视上玩塞尔达和超级玛丽来度过暑假的日子了,就是这个NES模拟器. 模拟器有两个版本:lite版,你 ...

  5. 写一个GAMEBOY的模拟器

    想写一个GAMEBOY的模拟器应该是很久很久以前的想法了,不过都没有去实现过.一则工作太忙,二则很懒,三是自己做事情总是虎头蛇尾.去年某一天,突然下定决心要写一个GAMEBOY的模拟器,主要还是想要锻 ...

  6. 单片机开发---ESP32S3移植NES模拟器(二)

    书接上文 <单片机开发-ESP32-S3模块上手> <单片机开发-ESP32S3移植lvgl+触摸屏> <单片机开发-ESP32S3移植NES模拟器(一)> 暖场视 ...

  7. jsemu - 用 JavaScript 写成的模拟器大集合

    转载地址:https://juejin.im/entry/564ad56b60b2260e5ba13612 原文链接:https://github.com/BigEd/jsemu 一个大大的列表,全部 ...

  8. 单片机开发---ESP32S3移植NES模拟器(一)

    书接上文 <单片机开发-ESP32-S3模块上手> <单片机开发-ESP32S3移植lvgl+触摸屏> 参考内容 依旧是参考韦东山老师的作品来移植的 <ESP32|爷青回 ...

  9. 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载

    NES Emulator TV精选了上千款经典的红白机小游戏,我们小时候玩过的经典游戏都能够在这里找到,每一款游戏在这里都能够分别存档,没有太多时间的上班族可以尝试一下,给玩家带来最好的游戏体验. 软 ...

  10. 使用js在桌面上写一个倒计时器_论一个倒计时器的性能优化之路

    原文发表于 2018.05.25,搬运自个人博客. 引子 回顾这半年,扛需求能力越来越强,业务代码也是越写越多.但稍一认真看看这些当时为了满足快速上线所码的东西,问题其实还是不少.这次就从一个简单的计 ...

最新文章

  1. Generic Data Access Layer泛型的数据访问层
  2. 了解下SOAP Envelope 元素
  3. 在线作图|2分钟在线绘制RDA图
  4. 智慧旅游建设方案_智慧灯杆及智慧交通设施建设方案
  5. 将二叉搜索树转换为有序的双向链表
  6. python基本输入输出代码示例
  7. 信贷风控知识问答库(持续更新)
  8. VTK:可视化算法之ColoredAnnotatedCube
  9. 飞鸽传书程序IT基础架构和应用的管理
  10. 最小化安装的redhat/centos安装gnome桌面
  11. Python爬虫 糗百段子
  12. 运动控制系统常用传感器介绍
  13. 左手招新,右手裁员,2019开年就业形势扑朔迷离
  14. 中国五笔 恶意软件清理助手
  15. 下载excel打开后弹出警告提示,文件类型和文件内容不符问题处理
  16. 天赐转债,强联转债,再22转债上市价格预测
  17. 室内定位的电子地图编辑工具
  18. push to origin/dev was rejected
  19. 卸载vivo手机自带的应用程序
  20. 哔咔服务器无响应,哔咔哔咔漫画进不去怎么办 无法进入解决办法

热门文章

  1. 经典胶片图像效果lr预设
  2. C语言骑士与金币问题
  3. 要留住优秀员工,除了钱,你还可以用什么?
  4. Lighttpd介绍
  5. 阿里巴巴Mysql规范
  6. 给排水科学与工程和计算机选哪个,2021中国给排水科学与工程专业大学排名 最好的高校排行榜...
  7. Go:一次 exit code 是 137 且 无 coredump 的排错经历
  8. 用border-color 的 transparent 制作一个三角形
  9. 利用边长计算三角形面积 — 海伦公式推导过程
  10. 【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库