tonight123 发表于 2013-3-28 22:05:32

请教,如何制作和使用fc游戏的rom.bin文件。关于fc移植到fpga

大家好,本人最近在excd—1(spartan 3e初级板)开发版上移植fc游戏到fpga,遇到些瓶颈。希望大家集思广益下,帮帮小弟。
1,我下载了些国外网站上的源码(见附件),然后自己按照自己开发版的io,进行了配置,可是发现,基本的rom文件没有,无法运行。按照老外的说明因为rom文件涉及版权,rom文件是不提供的,如果仅仅是学习使用,需要自己去下载rom文件。问题随之而来,典型的fc游戏文件时*.nes文件,就是俗称的黄色卡带,这个卡带内有两大部分组成rom和vrom,见图1.。。。。。小白的情况下,使用名字为ROMORG.exe的程序,可以瞬间把,nes文件分离,但是分离后格式还是nes文件的格式,有地址有指令。和微软标准的bin文件格式有区别 。这样就导致无法迅速达成转换,bin-----hex-----coe文件。这里也有小工具,可以达成转换。我做了很多努力,但是无法实现。
2,看了论坛内的大神,sky5566(炸弹杰克(街机) on FPGA)的程序,做了下参考,也仔细研究大神早期发表的一些源码,但是还是没有rom.bin文件的操作使用方法。本人实在是愚钝。
3,仔细分析移植的fc游戏源码,基本思路都是cpu+rom+外设。有很多的free-ip的cpu可以使用,其指令集不同,需要在cpu,和ppu中存放指令。这些指令是根据芯片来的,也不是很了解。
4,下面分享几个源码,都是sky5566(炸弹杰克(街机) on FPGA)大神的帖子给的灵感,然后去google的。特此感谢。

sme 发表于 2013-3-29 09:35:28

我做过红白机(NES)这颗IC,给你一些提示。

1. bin文件可以转成文本的十六进制或二进制,一行一个地址的数据,然后利用verilog的$readmem/$readmemh函数读入,如果是synplify之类的综合软件,会综合出带CODE的ROM。
reg                        mem        [(1<<(ADDR_W-1))-1:0];
        reg                        rd_addr;

        initial
        begin
                $readmemh(ROM_FILE,mem);
                $display("**************************************************************");
                $display("*                                                                                                                           *");
                $display("*Read code file from file %s *",ROM_FILE);
                $display("*                                                                                                                           *");
                $display("**************************************************************");
    end

        always @(posedge clk)
        begin
                                if (ce & we)
                                        mem        <=        #`U_DLY di;
                                rd_addr        <=        #`U_DLY addr;
        end
        assign        #`U_DLY        dout        =        (/* ce & */ oe) ? mem : {BUS_W{1'b0}};
上面的代码在做RTL仿真或综合时都可以用。
另外,除非你的FPGA BLOCK RAM够大,否则不一定能装下整个游戏。

2. 主机是不包含你图里最上面黄色方框这部分(Mapper + PROM+VROM+VRAM)。你如果只做主机(插游戏卡),这部分不都要考虑。如果你要连游戏一起跑,就是把游戏卡这部分做进来 ,那Mapper不得不考虑,现在的游戏卡大多是多合一的,且Mapper种类较多,你需要确定你游戏卡对应的Mapper。

3. 如果跑单个小游戏,可以不包含mapper,只需要PROM、VROM。

4. 下面是我写的将bin转换成hex文件的一段程序,供参考(BCB编写)
    int         iIn,iOut;
    int                iLength,iInst,iAddr,i;
    unsigned char        *cTmp = new char;

    if (OpenDialog1->Execute ())
    {
      asFileIn = OpenDialog1->FileName;
      if ((iIn = FileOpen(asFileIn,fmOpenRead)) == -1)
              {
                      MessageDlg("Can't open input file!",mtError,TMsgDlgButtons()<<mbOK,0);
                      return;
              }
    }
    else
            return;
    EditInputFile->Text        =        asFileIn;
    asFileOut = ChangeFileExt(ExtractFileName(asFileIn),".mem");
    EditOutputFile->Text    =        asFileOut;

    FileSeek(iIn,0,0);

    if ((iOut = FileCreate(asFileOut)) == -1)
            {
                    MessageDlg("Can't create the output file!",mtError,TMsgDlgButtons()<<mbOK,0);
                    return;
            }

        for(iAddr=0;/* iAddr<iLength && */ iAddr<StrToInt(EditDepth->Text);iAddr++)
        {
                if (FileRead(iIn,cTmp,1) <= 0)
                        break;
                iInst        =        cTmp;    // + cTmp*0x100;
      if (CheckAddr->Checked)
            wsprintf(cTmp,"@%05x %02x\r\n",iAddr,iInst);
      else
            wsprintf(cTmp,"%02x //@%05x\r\n",iInst,iAddr);
                FileWrite(iOut,cTmp,StrLen(cTmp));
        }
        FileClose(iIn);
        FileClose(iOut);
        MessageDlg("Convert successfully!",mtInformation,TMsgDlgButtons()<<mbOK,0);
        delete        cTmp;

tonight123 发表于 2013-3-29 10:17:18

sme 发表于 2013-3-29 09:35 static/image/common/back.gif
我做过红白机(NES)这颗IC,给你一些提示。

1. bin文件可以转成文本的十六进制或二进制,一行一个地址的 ...

1,:谢谢你的提点,第一次接触Verilog$readmem or $readmemh ,这段程序很实用。谢谢了
2,3:是的,如你所说我只是跑一个小游戏,因为没有足够的block ram,或许外接是个办法,我先做好第一步,再去研究外接。
4:再次仔细看了下,bin,hex的文件格式,也在尝试用BCB bulid下。这个是我接下来要去做的,再次感谢。

sme 发表于 2013-3-30 18:09:27

tonight123 发表于 2013-3-29 10:17 static/image/common/back.gif
1,:谢谢你的提点,第一次接触Verilog$readmem or $readmemh ,这段程序很实用。谢谢了
2,3:是的,如 ...

你只要取出PROM、CROM的话很简单的。
先看NES文件格式,先是16字节的文件头,再是是否包含512字节trainer,然后就是PROM的内容,再跟着就是CROM的内容,你只要按长度剪切出来就行了。


附件我传了一个NES,以及两个提取出来的bin文件,供你研究。
这个NES是多合一的,需要配合mapper才能工作,只供你分析NES文件和BIN文件的关系。

gaoyukun 发表于 2013-3-31 15:20:56

先mark。等板子回来了再折腾折腾~!

tonight123 发表于 2013-4-1 13:26:45

sme 发表于 2013-3-30 18:09 static/image/common/back.gif
你只要取出PROM、CROM的话很简单的。
先看NES文件格式,先是16字节的文件头,再是是否包含512字节trainer ...

你好,请问你是用那个软件打开的那个nes文件,那个nes文件,在模拟器上运行,提示mapper 205,就是我的模拟器不支持你那个nes,我试了别的模拟器也是一样的,

tonight123 发表于 2013-4-1 13:27:20

gaoyukun 发表于 2013-3-31 15:20 static/image/common/back.gif
先mark。等板子回来了再折腾折腾~!

可以交流下啊,我新搞了nexys 3.但是还是不能测试好

sme 发表于 2013-4-1 14:26:42

tonight123 发表于 2013-4-1 13:26 static/image/common/back.gif
你好,请问你是用那个软件打开的那个nes文件,那个nes文件,在模拟器上运行,提示mapper 205,就是我的模 ...

用的ultraedit打开,以二进制查看。

上传的这些文件是供你研究NES文件格式,模拟器可能不能直接运行,因为包含mapper。

tonight123 发表于 2013-4-1 15:28:30

sme 发表于 2013-4-1 14:26 static/image/common/back.gif
用的ultraedit打开,以二进制查看。

上传的这些文件是供你研究NES文件格式,模拟器可能不能直接运行,因 ...

您好,查看了您给你c09.chrc09.nesc09.prg,能说说您这三个文件如何分离的么,或者说这三个文件如何生成的

skylly3 发表于 2013-4-1 15:34:27

最开始的话, 建议用比较简单的mapper0, mapper2的(譬如: 魂斗罗、绿色兵团、赤色要塞、超级玛莉之类)来做测试,之后再搞复杂的mapper.

更多资料: http://nocash.emubase.de/everynes.htm#cartridgesandmappers

sme 发表于 2013-4-1 17:14:01

本帖最后由 sme 于 2013-4-1 17:32 编辑

tonight123 发表于 2013-4-1 15:28 static/image/common/back.gif
您好,查看了您给你c09.chrc09.nesc09.prg,能说说您这三个文件如何分离的么,或者说这三个文件如 ...

4楼已经写得很清楚了啊。

我提供的文件,prg对应PROM,chr对应CROM。

另,4楼图上PROM起始地址的说明标反了。

tonight123 发表于 2013-5-3 21:04:01

sme 发表于 2013-3-29 09:35 static/image/common/back.gif
我做过红白机(NES)这颗IC,给你一些提示。

1. bin文件可以转成文本的十六进制或二进制,一行一个地址的 ...

兄弟,谢谢你当初的指导,小弟已经可以玩双手柄了,不过我做了改进,用上位机玩去下载rom文件到fpga,再输出,现在测试了49个游戏,无压力。谢谢了

tonight123 发表于 2013-5-3 21:04:42

skylly3 发表于 2013-4-1 15:34 static/image/common/back.gif
最开始的话, 建议用比较简单的mapper0, mapper2的(譬如: 魂斗罗、绿色兵团、赤色要塞、超级玛莉之类)来做 ...

兄弟,谢谢你当初的指导,小弟已经可以玩双手柄了,不过我做了改进,用上位机玩去下载rom文件到fpga,再输出,现在测试了49个游戏,无压力。谢谢了

tonight123 发表于 2013-5-3 21:05:56

gaoyukun 发表于 2013-3-31 15:20 static/image/common/back.gif
先mark。等板子回来了再折腾折腾~!

兄弟,mark后板卡来了,什么板卡,聊聊啊,小弟已经可以玩双手柄了,不过我做了改进,用上位机玩去下载rom文件到fpga,再输出,现在测试了49个游戏,无压力。

何汉荣 发表于 2013-5-3 23:56:31

sme 发表于 2013-3-29 09:35 static/image/common/back.gif
我做过红白机(NES)这颗IC,给你一些提示。

1. bin文件可以转成文本的十六进制或二进制,一行一个地址的 ...

你移植过nes?用的是拟核么?在2C8上怎么搞,有兴趣做个游戏{:smile:}

sme 发表于 2013-5-6 08:44:24

何汉荣 发表于 2013-5-3 23:56 static/image/common/back.gif
你移植过nes?用的是拟核么?在2C8上怎么搞,有兴趣做个游戏

不明白你说的“拟核”是什么意思?

我是做的IC,但先用FPGA验证过。

何汉荣 发表于 2013-5-6 21:04:16

sme 发表于 2013-5-6 08:44 static/image/common/back.gif
不明白你说的“拟核”是什么意思?

我是做的IC,但先用FPGA验证过。

哦,如果搞你这个,2C8上的LE够吗?我看你用DE2的

sme 发表于 2013-5-7 09:09:04

何汉荣 发表于 2013-5-6 21:04 static/image/common/back.gif
哦,如果搞你这个,2C8上的LE够吗?我看你用DE2的

不好意思,你可能搞错了,用DE2的不是我。我用的是xilinx xc3s400。

tonight123 发表于 2013-5-7 17:48:23

http://v.youku.com/v_show/id_XNTUyOTc4MjY4.html

何汉荣 发表于 2013-5-8 20:12:34

tonight123 发表于 2013-5-7 17:48 static/image/common/back.gif
http://v.youku.com/v_show/id_XNTUyOTc4MjY4.html

正的是资源不够哦,换成atera 的ep2c8编译出错了

tonight123 发表于 2013-5-9 17:32:42

何汉荣 发表于 2013-5-8 20:12 static/image/common/back.gif
正的是资源不够哦,换成atera 的ep2c8编译出错了

资源不够,那只能想办法了。

何汉荣 发表于 2013-5-14 15:59:31

tonight123 发表于 2013-5-9 17:32 static/image/common/back.gif
资源不够,那只能想办法了。

能指导一下怎么做吗?497599141
页: [1]
查看完整版本: 请教,如何制作和使用fc游戏的rom.bin文件。关于fc移植到fpga