您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF51X技术支持专区 -> BF518/BF512 NES红白机模拟器应用
本帖共有536个阅读者
发表帖子 发表投票 回复主题
BF518/BF512 NES红白机模拟器应用
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518/BF512 NES红白机模拟器应用

代码实现功能

代码实现了NES游戏模拟器在BF51x平台上的运行。运行代码后,会通过文件系统打开工程目录下ROM内的NES游戏ROM,然后运行游戏,在液晶屏上显示出游戏内容。通过开发板上的按键可进行游戏娱乐。目前代码解码支持128K及以下的ROM文件,大于128KROM文件不支持运行。

注意:模拟器音频部分还没有做,有兴趣的朋友可以补上。

硬件平台

开发板:ADSP-EDU-BF518F   淘宝链接:http://item.taobao.com/item.htm?spm=a1z10.3.17.33.5317f8&id=14449990649

仿真器:AD-HP510ICE-FULL   淘宝链接:http://item.taobao.com/item.htm?spm=a1z10.3.17.17.4561b&id=8842330668

代码使用说明

代码通过文件系统打开ROM

       fp = fopen("../rom/hundouluo.nes", "rb");

       lenth = fread(rom_file, 1, 0x200000, fp);

       fclose(fp);

打开液晶屏驱动:                    

InitDMA();

    InitPPI();

    InitTimer();

       PPI_TMR_DMA_Enable();

       LCD_Enable();

       LCDBK_Enable();

      

运行模拟器:

    InfoNES_ReadRom();

    InfoNES_Reset();

    InfoNES_Main();  

液晶屏数据更新:

void InfoNES_LoadFrame(void)

{

       int x,y;

       u16 color_data;

       u8 color_r,color_g,color_b;

              

       for(x = 0;x < 240;x++)

       {    

              for(y = 0;y < 256;y++)

              {    

                     color_data =   ChColor(WorkFrame[x*256+y]);

                     color_r = (color_data>>11)& 0x1f;

                     color_g = (color_data>>5)& 0x2f;

                     color_b = (color_data)& 0x1f;

              

                     color_data = (color_r) | (color_g<<5) | (color_b<<11);

                                          

                     DisplayBuffer_565[x][y*2+220] = (color_data & 0xff) ;

                     DisplayBuffer_565[x][y*2+221] = ((color_data>>8) & 0xff);                  

              }

       }

}

模拟器按键操作:

u8 ReadKey(u8 KeyCodeLast)

{

    u8 KeyCode,i;

    u8 temp_code = 0;

    static u8 KeyDly[10]={3,3,3,3,3,3,3,3,3,3};

              

   temp_code = ~*pKEY_DAT;

   KeyCode = ((temp_code>>0)&0x1)<<4 ;

   KeyCode |= ((temp_code>>1)&0x1)<<6;

   KeyCode |= ((temp_code>>2)&0x1)<<5 ;

   KeyCode |= ((temp_code>>3)&0x1)<<7;

   KeyCode |= ((temp_code>>4)&0x1)<<3;

   KeyCode |= ((temp_code>>5)&0x1)<<1;

   KeyCode |= ((temp_code>>6)&0x1)<<0;

   KeyCode |= ((temp_code>>7)&0x1)<<2;

    for (i = 0; i < 7; i++)

    {

        if ((board_input&(1<<i))!=(KeyCode&(1<<i)))

        {

            KeyDly[i] = 3;

        }

           else

           {

                     if ((KeyCode&(1<<i)))

                     {

                         if (KeyDly[i] < 6)

                         {

                             KeyDly[i]++;

                         }

                         else

                                return (KeyCode);  

                     }

                     else

                     {

                            if (KeyDly[i] > 0)

                         {

                             KeyDly[i]--;

                         }

                         else

                                return (KeyCode);  

                     }

           }

    }

       return(KeyCodeLast);

}


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/9/18 12:30:08
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

按键设置说明:



板卡按键

模拟器功能键

left->left

left->down

left->right

left->up

right->left

B

right->down

A

right->right

SELECT

right->up

START


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/9/18 12:30:38
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

代码实验步骤

  1. 编译运行代码
  2. 待屏幕出现魂斗罗画面,通过按键输入:上上下下左右左右BABA,按START,开始游戏。
  3. 30条命,祝游戏愉快。

代码实验结果

在液晶屏上出现魂斗罗画面,通过按键控制可进行游戏。

注:板卡上的按键使用寿命有限,仅限于运行游戏测试,请误长期使用板卡玩游戏,以免按键疲劳损坏。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/9/18 12:31:18
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154330 Call, 1 Queries, Processed in 0.031250 second(s),