话不多说直接上文件框架

可以看到NES模拟器主要包含以下几大部分

6502(必要):这是用程序模拟NES内核,即用程序写一个CPU,主要目的就是来运行NES文件

adcrock与keyNum(自定义):这两个是获取上下左右方向和获取按键信息的一个文件夹,具体内容,可以根据你们自己的文件而定

joypad(必要):这个文件主要就是来处理方向信息和按键信息的一个文件

nes_main(必要):这个文件就是来执行NES的主文件

nes_rom(必要):这个文件就是游戏的数据信息了

NES(非必要):这个是Arduino的执行文件,当你们用安信可平台或者KEIL等其他IDE时就不需要这个文件了

PPU(必要):这个跟显示游戏内容相关

type(非必要):这里面存放的是变量类型

首先我读取一份程序,本人建议自己看头文件,了解大题步骤,这里我们直接看nes_main.h这个文件再对nes_main.c这个文件进行解析

#ifndef _NES_MAIN_H_
#define _NES_MAIN_H_#include <stdio.h>
#include <string.h>
#include "type.h"
#include "nes_rom.h"typedef struct
{char filetype[4];  //字符串“NES^Z”用来识别.NES文件       u8 romnum;         //16kB ROM的数目                        u8 vromnum;            //8kB VROM的数目                u8 romfeature;     //D0:1=垂直镜像,0=水平镜像 // D1:1=有电池记忆,SRAM地址$6000-$7FFF// D2:1=在$7000-$71FF有一个512字节的trainer // D3:1=4屏幕VRAM布局 //  D4-D7:ROM Mapper的�4�    u8 rommappernum;  // D0-D3:保留,必须是0(准备作为副Mapper号^_^)// D4-D7:ROM Mapper的高4位           //u8 reserve[8];    // 保留,必须是0                       //OM段升序排列,如果存在trainer,它的512字节摆在ROM段之前 //VROM段, 升序排列
}NesHeader; u8 nes_main(void);
void NesFrameCycle(void);
u8 nes_mem_creat(void);     //开辟nes运行所需的RAM.
void nes_mem_delete(void);  //删除nes运行时申请的RAM    //PPU使用
extern u8 *NameTable;           //2K的变量
extern u16  *Buffer_scanline;   //行显示缓存,上下标越界最大为7,显示区 7 ~ 263  0~7 263~270 为防止溢出区
//CPU使用
extern u8 *ram6502;             //RAM  2K字节,由malloc申请#endif

可以看到引用的头文件中

#include <stdio.h>
#include <string.h>
#include "type.h"      //存放数据类型
#include "nes_rom.h"   //存放游戏数据

前两个就不做解释了,学过C的都懂,下面主要介绍

#include “type.h”和#include “nes_rom.h”文件夹

其中#include “type.h”文件内容为:这里面存放的是变量类型

#ifndef _TYPE_H_
#define _TYPE_H_#define u8 unsigned char       //定义一个8位的无符号变量类型
#define u16 unsigned short     //定义一个16位的无符号变量类型
#define u32 unsigned int       //定义一个32位的无符号变量类型typedef unsigned short WORD;   //定义一个16位的无符号变量类型,主要在6502文件中使用
typedef unsigned char  BYTE;   //定义一个16位的无符号变量类型,主要在6502文件中使用#endif

是不是很简单,就5句话,没错他就这么简单,

其中#include “nes_rom.h”

#include "nes_rom.h"#define _USE_BIGTANK_          0   //使用导弹坦克nes
#define _USE_SUPPERMARIO_   1   //超级玛丽#if _USE_SUPPERMARIO_ == 1
const unsigned char rom_file[40976]=
{0x4E,0x45,0x53,0x1A,0x02,0x01,............................................................0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
}

没错这个文件存放的就是游戏数据了,想要玩什么游戏,只需把.nes游戏文件转化为HEX文件,再是生成游戏数据的数组就行了 ,具体操作如下

 至此第一篇中引用的头文件就讲完了

接下去我们看结构体

typedef struct
{char filetype[4];  //字符串“NES^Z”用来识别.NES文件       u8 romnum;         //16kB ROM的数目                        u8 vromnum;            //8kB VROM的数目                u8 romfeature;     //D0:1=垂直镜像,0=水平镜像 // D1:1=有电池记忆,SRAM地址$6000-$7FFF// D2:1=在$7000-$71FF有一个512字节的trainer // D3:1=4屏幕VRAM布局 //  D4-D7:ROM Mapper的�4�    u8 rommappernum;  // D0-D3:保留,必须是0(准备作为副Mapper号^_^)// D4-D7:ROM Mapper的高4位           //u8 reserve[8];    // 保留,必须是0                       //OM段升序排列,如果存在trainer,它的512字节摆在ROM段之前 //VROM段, 升序排列
}NesHeader; 

这个没什么好讲的,就是一个识别存放NES文件的一个结构体,我移植的时候这一段直接复制就行了

继续往下看

u8 nes_main(void);
void NesFrameCycle(void);
u8 nes_mem_creat(void);     //开辟nes运行所需的RAM.
void nes_mem_delete(void);  //删除nes运行时申请的RAM

nes_main(void);:这个是主内容:不管你用ESP32还是STM32还是什么其他单片机或者其他平台只要调用这个函数你的游戏就能启动了。这部分每一篇都会讲

void NesFrameCycle(void);这个是游戏启动之后一直在循环的函数,这部分放到最后一篇再讲

u8 nes_mem_creat(void);        //开辟nes运行所需的RAM.即游戏启动前使用本函数,为游戏开辟运行内存

void nes_mem_delete(void);    //删除nes运行时申请的RAM,即游戏结束之后,为结束内存空间,对游戏内存进行释放

//PPU使用
extern u8 *NameTable;           //2K的变量
extern u16  *Buffer_scanline;   //行显示缓存,上下标越界最大为7,显示区 7 ~ 263  0~7 263~270 为防止溢出区
//CPU使用
extern u8 *ram6502;             //RAM  2K字节,由malloc申请

这几个变量主要就是配合:u8 nes_mem_creat(void); 、void nes_mem_delete(void);  这两个函数使用的,即u8 nes_mem_creat(void); 、void nes_mem_delete(void); 这两个函数申请内存和释放内存时,即是对这三个变量进行操作的

至此第一篇关于nes_main头文件的介绍至此就结束了,关于nes_main.h篇章就此告一段落,

继续学习详细请看第二篇

第一篇:手把手教你移植任天堂,没有声音、无需外置SD卡、可使用独立按键也可使用外置手柄,本人使用的芯片为ESP32,移植到STM32均可使用。(本篇主要介绍nes_main.h这个文件)相关推荐

  1. 第三篇:手把手教你移植任天堂,没有声音、无需外置SD卡、可使用独立按键也可使用外置手柄,本人使用的芯片为ESP32,移植到STM32均可使用。(本篇主要介绍ppu.c文件,即教你如何移植屏幕)

    这一篇就比较简单了,直接上核心代码,也就是大家要修改的地方,不修改这里,直接拿过去是无法编译通过的 //PPU 将行缓存,写入LCD //NES游戏的分辨率为256*240. void NES_LCD ...

  2. python 批量下载网页图片_手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ /1 前言/ 上篇文章 手把手教你爬取天堂网1920*1080大图片(批量下载)--理论篇我们谈及了天堂网 ...

  3. 手把手教你破解Linux系统root密码——无需任何工具,有手就行

    [写作说明]:笔者是Linux学习和爱好者,学习或者工作中总是看到有人忘记root密码不知所措,其实不用慌张,Linux下破解root密码非常简单,今天我就手把手教会大家在Linux下破解root密码 ...

  4. 怎么批量在数字里加入网页_手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇

    /1 前言/ 平时我们要下载图片,要要一个一个点击下载是不是觉得很麻烦?那有没有更加简便的方法呢?答案是肯定的,这里我们以天堂网为例,批量下载天堂网的图片. /2 项目准备工作/ 首先 我们第一步我们 ...

  5. 手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 不经一番寒彻骨,怎得梅花扑鼻香. ...

  6. 独家 | 17篇手把手教技术指南、技术进阶干货大合集

    数据派一直致力于打造数据科学人才聚集地,传播数据科学知识,分享前沿科技动态,分析应用案例,组织线下活动.本文通过梳理往期内容,挑选出数据派研究部出品的"一文读懂"."手把 ...

  7. 你知道豆瓣电影是怎么评分的吗?(实战篇—手把手教你分析豆瓣电影)

    点赞再看,养成好习惯 Python版本3.8.0,开发工具:Pycharm 写在前面的话: 如果你是因为看到标题进来的,那恭喜你,又多了一个涨(入)知(坑)识的机会. 在这篇豆瓣电影Top250的分析 ...

  8. 菜鸟篇--手把手教你制作机器人

    如何让一个菜鸟玩转机器人,而不是被机器人玩?本文的目的就是帮助那些还未接触过机器人的朋友在短时间内制作出具有一定专业水准的机器人,手把手教大家如何制作机器人. 在这之前,先让我们初步了解一下什么是机器 ...

  9. tiny4412 uboot 2020.10版本移植(四)——uboot修改支持sd卡、eMMC引导内核及其他一些杂项设置

    本文在<tiny4412 uboot 2020.10版本移植(三)--uboot初步启动> 的基础上继续向tiny4412 uboot 2020.10版添加功能. 主要有三块内容:1. D ...

  10. 第一篇 - 手把手教你理清EOS各种开发环境搭建来龙去脉

    目前来讲,任何学习EOS相关技术的资料都来自https://github.com/EOSIO/eos,可能大家在搭建EOS开发环境的过程中,会很迷茫,网上资料都很乱,自己也理不清头绪,不知如何下手.在 ...

最新文章

  1. Android中windowTranslucentStatus与windowTranslucentNavigation的一些设置(转)
  2. Oracle Compile 编译 无效对象(ORA-04063: package body SYS.DBMS_XPLAN 有错误)
  3. 《Python高效开发实战》实战演练——开发Django站点1
  4. python里面如何安装nltk_nltk的安装和简单使用
  5. Angular Component 的 renderer 创建机制以及 Angular 版本号的确定方式
  6. exit java_没有System.exit,如何退出Java程序?(通过用户输入?)
  7. 特洛伊木马脚本linux,手动查杀特洛伊木马
  8. oracle长连接超时设置
  9. 第十二节:ES6 Proxy代理 和 去银行存款有什么关系?
  10. 荣耀linux装win读不出u盘,华为/荣耀路由器USB接入硬盘/U盘后无法识别怎么解决?...
  11. 51nod 1086 背包问题 V2 【二进制/多重背包】
  12. jenkins 部署 并执行npm run dev 项目时,execute shell自动结束进程问题
  13. C语言程序设计实验报告——实验三
  14. 学习AngularJS有这一篇就好了
  15. 帮你踩坑系列:酷我音乐的歌词获取/下载,示例代码用 python
  16. 【反思】写在腾讯电话面试之后
  17. 互联网之子:亚伦·斯沃茨
  18. 大数据圈儿微信公众号
  19. 任务教学法在计算机教学,“任务驱动”教学法在计算机基础教学中的应用
  20. HyperLPR车牌识别技术算法之车牌粗定位与训练

热门文章

  1. Matlab画图颜色设置
  2. php网站模板怎么改动,ECshop网站模板修改详细教程 and 模板对应的文件
  3. fluidsim元件库下载_FluidSIM5|FluidSIM(液压气动仿真软件)下载 v5.0中文免费版 附安装教程 - 121下载站...
  4. Unity3D占用内存太大的解决方法
  5. Hadoop概述--四大组件架构及其关系
  6. Android开发之——统计代码行数
  7. MATLAB的安装步骤
  8. 华为虚拟机eNSP命令大全
  9. sql2019更改了表的部分字段设计出现不允许保存更改解决方案
  10. excel解决线性规划求解问题