单片机---HLK-W801移植Nes模拟器(一)

总目录

《单片机—HLK-W801移植Nes模拟器(一)》
《单片机—HLK-W801移植Nes模拟器(二)》
《单片机—HLK-W801移植Nes模拟器(三)》

背景介绍

年关将至,不过学习的脚步不能停,最近在着手研究一个能在单片机上运行的Nes模拟器,就是我们小时候常玩的红白机。
单片机---HLK-W801移植Nes模拟器(一)_第1张图片

参考了网上的各位高手的文档,发现STM32上的居多,但是要能够存储和运行Nes模拟器,对rom和ram的要求,相对来说还是高一些,手中的103FC8T6目前还不能用,因为存不下也运行不起来。
不过还是被我发现了一个绝世高手的文章,最终运行ram居然只需要30多Kb,2013年的文章,这个真是不服不行。
单片机---HLK-W801移植Nes模拟器(一)_第2张图片

传送至大佬文章

所以准备试一下前一阵买的HLK801,毕竟这个主频和存储,都没大问题。
开搞!!

代码准备

LCD驱动

目前是采用了之前用过的SPI总线的LCD,驱动芯片是ili9341。这块就不细说了,就是初始化SPI总线,然后按照手册读写。

模拟器源码

源码可以从大佬的文章中下载下来使用。
单片机---HLK-W801移植Nes模拟器(一)_第3张图片
单片机---HLK-W801移植Nes模拟器(一)_第4张图片

环境准备

开发环境搭建参考前面的文章《单片机—HLK-W801开发环境搭建》,还是采用了默认的SDK程序包,然后将nes模拟器的代码,添加到app路径下。

然后,将我们之前用到的ili9341的LCD显示屏也一并移植过来,放在同级目录,这里目前只需要实现一个描点画图即可,最后的图像显示,就是通过描点的方式显示出来的。

整体结构如下
单片机---HLK-W801移植Nes模拟器(一)_第5张图片

漫漫征途

接下来就是开始漫长的编译,解决问题过程了。
单片机---HLK-W801移植Nes模拟器(一)_第6张图片

首先添加必要的头文件链接路径
单片机---HLK-W801移植Nes模拟器(一)_第7张图片
然后将lcd的头文件包含在info_nes.h中。最后main包含info_nes.h就可以调用nes的函数和lcd的函数了。
主函数书写如下

void UserMain(void)
{
	printf("lcd init \n");
	lcd_init();

	printf("start malloc \n");

	if(0!=InfoNES_Load(NULL))
	{
		printf("InfoNES_Load fail \n");
	}
	else
	{ 
		printf("InfoNES_Load success \n");
		InfoNES_Main();
	}
}

开始编译起来吧。
单片机---HLK-W801移植Nes模拟器(一)_第8张图片

mapper包含编译问题

单片机---HLK-W801移植Nes模拟器(一)_第9张图片
我们在mapper.c中包含了一系列的nes提供的mapper文件,但是在编译的时候,回去自动重新单独编译这些cpp文件,这与我们本来打算只编译InfoNES_Mapper.c的初衷是违背的,所以这里就选择了一种方式,将其cpp都改为头文件,然后就不再编译了。
重命名两百个文件,采用了bat脚本方式
单片机---HLK-W801移植Nes模拟器(一)_第10张图片
放在mapper路径下,双击执行即可。
然后把所有包含的名称也对应修改即可。
单片机---HLK-W801移植Nes模拟器(一)_第11张图片
然后重新删除nes路径,再添加到工程中。
单片机---HLK-W801移植Nes模拟器(一)_第12张图片

图像显示

代码中的显示方式为逐行扫描,每行更新,所以这里只修改行显示

void InfoNES_LoadLine()
{
  int i;
  if(PPU_Scanline == 0)
  {
	FrameCount++;
	InfoNES_LoadFrame();
  }
  
  for(i=0;i<240;i++)
  {
  		ILI9341_DrawPoint(i,PPU_Scanline,WorkLine[i]); 
		//lcd_ili932x_pixel_draw_step2(WorkLine[i]);
		// GrContextForegroundSet(&sContext, WorkLine[i]);
		// GrPixelDraw(&sContext, i, PPU_Scanline);
  }
}

编译成功

单片机---HLK-W801移植Nes模拟器(一)_第13张图片
烧写,开测!!!
上来就是黑屏待遇。
单片机---HLK-W801移植Nes模拟器(一)_第14张图片
不放弃,正当我在阅读代码的时候,屏幕突然出了图像!!!
单片机---HLK-W801移植Nes模拟器(一)_第15张图片
这熟悉的配方,眼泪都要掉下来了。开来启动需要一些时间。
单片机---HLK-W801移植Nes模拟器(一)_第16张图片

然后修改一下划线的函数,不过可能是因为这个高低位的问题,这么以修改,速度提高了,但是颜色变了

void ILI9341_DrawLineOne(u16 y,unsigned char* data)
{
	ILI9341_Address_Set(0,y,240,y);//设置光标位置 
	GPIO_DATA();//写数据
	tls_spi_write(data,480);
}

然后提高了一下SPI的速度,这下稍微能看了一点,不过还是很有延迟,再打开了跳帧
单片机---HLK-W801移植Nes模拟器(一)_第17张图片
效果如下

今日总结

今天就做到这里吧。其实这个玩意已经尝试了好几天了,手里的芯片试了一遍,发现只有W801能放得下,然后就是各种内存不足,只好在网上搜索,直到看到那位高手的方法,他的修改已经建立在对这个模拟器相当熟悉的程度上才能做出那种修改。
要学习的东西还很多。
明天再添加按键和尝试提速。

结束语

搞这个东西真的会上瘾,今天中午连饭都没去吃,也没休息,哈哈。
单片机---HLK-W801移植Nes模拟器(一)_第18张图片
还有一天就放假了,那么所有的工作
单片机---HLK-W801移植Nes模拟器(一)_第19张图片

你可能感兴趣的:(单片机,W801,nes,马里奥,infones,ili9341)