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

话不多说直接上文件框架

 可以看到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篇章就此告一段落,

继续学习详细请看第二篇

版权声明:本文为CSDN博主「小鱼儿-余」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuweize520/article/details/122166530

话不多说直接上文件框架

 可以看到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篇章就此告一段落,

继续学习详细请看第二篇

版权声明:本文为CSDN博主「小鱼儿-余」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuweize520/article/details/122166530

生成海报
点赞 0

小鱼儿-余

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐