W801学习笔记二十四:NES模拟器游戏

news2025/2/27 21:08:59

之前已经实现了NES模拟器玩游戏。W801学习笔记九:HLK-W801制作学习机/NES游戏机(模拟器)

现在要在新版本掌机中移植过来。

1、把NES文件都拷贝到SD卡中。

这回不会受内存大小限制了。我这里拷贝了4个,还可以拷贝更多。

 2、应用初始化中,加载NES文件。

把NES文件名在菜单中进行绑定,动态加载到PSRAM中

int NesSim::scean_init(cJSON*  param){
	char * fileName= cJSON_GetObjectItem(param,"f")->valuestring;
	int sk = cJSON_GetObjectItem(param,"k")->valueint;
	size_t readsize = fatfs_readFile(fileName, &romData);
	LCD_Clear(BLACK);

	if(0!=InfoNES_Load((BYTE*)romData,sk))
	{
		printf("InfoNES_Load fail \n");
	}
	else
	{ 
		printf("InfoNES_Load success \n");
		InfoNES_Main();
	} 
	return 0;
}

k参数用于设置跳过的帧数,以提高最终游戏帧率。

3、修改并确认按键。

InfoNES_system.c

void InfoNES_PadState( DWORD *pdwPad1, DWORD *pdwPad2, DWORD *pdwSystem )
{
   u32 keys = KEY_INPUTB;
    *pdwPad1 = 0;

	if(!(keys & (0x1 << KEY_GPIO_UP)))
	{
		*pdwPad1 |= PAD_JOY_UP;
	}

	if(!(keys & (0x1 << KEY_GPIO_DOWN)))
	{
		*pdwPad1 |= PAD_JOY_DOWN;
	}
	if(!(keys & (0x1 << KEY_GPIO_LEFT)))
	{
		*pdwPad1 |= PAD_JOY_LEFT;
	}
	if(!(keys & (0x1 << KEY_GPIO_RHT)))
	{
		*pdwPad1 |= PAD_JOY_RIGHT;
	}
	if(!(keys & (0x1 <<KEY_GPIO_SEL)))
	{
		*pdwPad1 |= PAD_JOY_START;
	}
	if(!(keys & (0x1 << KEY_GPIO_A)))
	{
		*pdwPad1 |= PAD_JOY_A;
	}
	if(!(keys & (0x1 << KEY_GPIO_B)))
	{
		*pdwPad1 |= PAD_JOY_B;
	}
	if(!(keys & (0x1 << KEY_GPIO_EXIT)))
	{
		*pdwPad1 |= PAD_JOY_SELECT;
	}
	
}

KeyAdepter.h

#define KEY_GPIO_LEFT 	27
#define KEY_GPIO_DOWN 	18
#define KEY_GPIO_RHT 	17
#define KEY_GPIO_UP	 	16
#define KEY_GPIO_A 		21
#define KEY_GPIO_B 		23
#define KEY_GPIO_C 		22
#define KEY_GPIO_D 		24

#define KEY_GPIO_SEL 	26
#define KEY_GPIO_EXIT 	25

#define KEY_INPUTB (*(TLS_REG*)(HR_GPIO_DATA + TLS_IO_AB_OFFSET))

4、在菜单中加入模拟器游戏

。。。
            {
			    "t": "NES 模拟器",
				"i": "-",
				"d": 0,
				"g": {},
				"s": [
					{
						"t": "魂斗罗",
						"i": "-",
						"d": 400,
						"g": {"f":"nes/hdl.nes", "k":1},
						"s": []
					},
					{
						"t": "沙罗曼蛇II",
						"i": "-",
						"d": 400,
						"g": {"f":"nes/slms.nes", "k":1},
						"s": []
					},
					{
						"t": "马戏团",
						"i": "-",
						"d": 400,
						"g": {"f":"nes/mxt.nes", "k":1},
						"s": []
					},
					{
						"t": "超级马里奥",
						"i": "-",
						"d": 400,
						"g": {"f":"nes/cjmla.nes", "k":2},
						"s": []
					}
				]
			}
。。。

5、修改游戏加载

InfoNES.c

int InfoNES_Load( BYTE * rom, int sk)
{
/*
 *  Load a cassette
 *
 *  Parameters
 *    const char *pszFileName            (Read)
 *      File name of ROM image
 *
 *  Return values
 *     0 : It was finished normally.
 *    -1 : An error occurred.
 *
 *  Remarks
 *    Read a ROM image in the memory. 
 *    Reset InfoNES.
 */

  // Release a memory for ROM
  InfoNES_ReleaseRom();

  // Read a ROM image in the memory
  GameFrameSkip = sk;
	  
	  
  if ( InfoNES_ReadRom( rom ) < 0 )
    return -1;

  // Reset InfoNES
  if ( InfoNES_Reset() < 0 )
    return -1;

  // Successful
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring:OAuth2.0

文章目录 一、认证与授权二、OAuth2.0介绍 一、认证与授权 认证&#xff08;Authentication&#xff09;与授权&#xff08;Authorization&#xff09;在网络安全和系统管理中是两个重要的概念&#xff0c;它们各自有不同的作用和目标。 认证是验证确认身份以授予对系统的访问…

编辑员工信息——后端

需求&#xff1a; 在员工管理列表页面点击编辑按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击保存按钮完成编辑操作。 代码开发流程&#xff1a; 点击编辑按钮&#xff0c;页面跳转到add.html&#xff0c;并在url中携带参…

高精度数学计算的瑞士军刀,mpmath库详解与应用示例

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 做为一个一只脚已经踏进35岁大关的程序员&#xff0c;对于职场&#xff0c;几乎向上无望&#xff0c;已经没有太多的期待…

面向侧扫声纳目标检测的YOLOX-ViT知识精馏

面向侧扫声纳目标检测的YOLOX-ViT知识精馏 摘要IntroductionRelated WorkYOLOv-ViTKnowledge DistillationExperimental Evaluation Knowledge Distillation in YOLOX-ViT for Side-Scan Sonar Object Detection 摘要 在本文中&#xff0c;作者提出了YOLOX-ViT这一新型目标检测…

Springboot+vue项目零食销售商城

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;零食销售商城当然也不能排除在外。零食销售商城是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff…

Yolov8实现loopy视频识别

1、前言 loopy是一个非常可爱的动漫角色&#xff08;可爱粉色淀粉肠&#xff09;&#xff0c;闲来无事&#xff0c;打算用yolov8训练一个模型对loopy进行识别。 2、准备工作 先在网络上搜寻很多loopy的图片&#xff0c;然后将图片导入Lablel Studio软件进行标注&#xff0c;并…

Ansible---inventory 主机清单

一、inventory 主机清单 1.1、inventory介绍 hosts配置文件位置&#xff1a;/etc/ansible/hosts Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.2、inventory中的变量 Inventory变量名含义…

Service 和 Ingress

文章目录 Service 和 IngressServiceEndpointservice 的定义代理集群外部服务反向代理外部域名Service 常用类型 IngressIngress-nginx安装使用 Service 和 Ingress service 和 ingress 是kubernetes 中用来转发网络请求的两个服务&#xff0c;两个服务用处不同&#xff0c;se…

python魔法方法是什么

魔法方法是python内置方法&#xff0c;不需要主动调用&#xff0c;存在的目的是为了给python的解释器进行调用&#xff0c;几乎每个魔法方法都有一个对应的内置函数&#xff0c;或者运算符&#xff0c;当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法&…

【软考】模拟考卷错题本2024-05-07

1 项目路径 这里的图没有加载出来&#xff0c;没u哦i关系了。其实主要是的算出最长的路径中包含那些元素即可。这里是蒙圈了&#xff0c;没有考虑到还有更长的。要顾头也顾尾。 2 算法分析-贪心 该问题主要考核的是算法设计策略来达到目标的方式。主要的设计策略有&#xff1a;…

python实现图书馆借阅管理系统-文件存储

《面向对象》案例引入 通过本章的学习,请用面向对象思想实现《图书馆借阅管理系统》的登录注册页面和用户信息维护页面和图书借阅页面。 【功能要求】: 1、用面向对象思想改写上一章的《函数模块》案例引入。 2、增加图书借阅页面。 ①学生登录后,可以进入图书借阅页面,实现…

【自动驾驶|毫米波雷达】卡尔曼滤波

目录 一. 滤波器分类 二.卡尔曼滤波&#xff08;Kalman Filter&#xff09;原理 &#xff08;1&#xff09;定性理解 &#xff08;2&#xff09;定量推导 1. 预测阶段 2. 更新阶段 3. 卡尔曼增益 1&#xff09;卡尔曼增益 2&#xff09;如何理解卡尔曼增益&#xff1f; 三…

线程理论篇1

本章问题&#xff1a;什么是线程?线程的使用场景&#xff1f;什么是线程池&#xff1f;线程池是如何工作的&#xff1f;线程池共享了哪些资源?线程安全代码怎么写&#xff1f;什么是线程安全? 什么是线程&#xff1f; 线程是为了提高进程的效率。进程的地址空间中保存了cpu…

紧跟生成式AI暴雨发布新时代推理服务器

近日&#xff0c;暴雨发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AIG…

重学java 31.API 3.数学相关类

看似不起波澜的日复一日&#xff0c;会突然在某一天让人看到坚持的意义 —— 24.5.8 数学相关类 1.Math类介绍 1.概述 数学工具类 2.作用 主要用于数学运算 3.特点 a、构造方法私有了 b、方法都是静态的 4.使用 类名直接调用 static int abs(int a) ->求参数的绝对值 stat…

ChatGLM-Math:强化数学能力

大型语言模型&#xff08;LLM&#xff09;在文本摘要、问答和角色扮演对话等语言任务上表现出色&#xff0c;在数学推理等复杂问题上也具有应用潜力。 但目前提高 LLM 数学问题解决能力的方法&#xff0c;往往会导致其他方面能力的下降。例如RLHF的方法&#xff0c;虽然可以提…

软考系列必过资料分享-系统架构师-系统分析师-信息系统项目管理师

建议,写在前面 知识点是公用的,原则上不分新旧。每年会有少部分的题目切合当前时间段&#xff08;也是通过旧的知识演变的&#xff09; 信息系统项目管理师证书 系统架构师证书 系统分析师证书 资料分享 关注公众号 回复 信息系统项目管理师资料 即可获取信息系统项目管理师资…

翻译《The Old New Thing》 - The new scratch program

The new scratch program - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050422-08/?p35813 Raymond Chen 2005年4月22日 译注&#xff1a;此篇是 翻译《The Old New Thing》 - The scratch program 姊妹篇&#xff0c;对 scratch 程序作…

【通信】电子科协通信专题

数字通信 最直观的通信方式-基带通信 问题&#xff1a;①无限大的带宽②天线体积

[QTcreator]QT中一个cpp文件如何使用另一个界面的控件

在工作过程中将函数封装成一个类放入一个cpp文件中&#xff0c;但是里面的函数需要运用到其他界面的控件&#xff0c;以此记录昨天的学习。 首先明确一下我需要在vtkfuntion.cpp使用mainwindow.ui中的qvtkwidget控件 step1:更改mainwindow.h 添加需要应用的文件的头文件&…