VCD和DVD机兼容FC游戏的原理是什么?

对裕兴VCD感兴趣的推荐直接加入 步步高多媒体学生电脑吧 。


裕兴兼容FC核心是三大块,第一块是CPU,裕兴在做VCD之前也是山寨FC大户,跟台湾山寨FC类似,硬件核心从任天堂的2A03,拆成了MOS6502+整合Mapper芯片两块,N合一黄卡的流行,让这些山寨货搭载整合Mapper芯片成了刚需。

而至于ROM格式这块,我在下面直接贴大佬的裕兴bin格式和iNes格式转换教程了,不感兴趣的可以跳过(大部分人应该不感兴趣吧)。

简单总结,就是没有使用iNes的header,但是核心ROM二进制是一致的。


以下内容转载自贴吧:

百度安全验证

按大小划分, 裕兴的光盘游戏BIN文件一共有这几种类型:34K,50K,66K,130K,258K,386K,514K,770K.

每个BIN文件,前2K(&H000-&H7FF)内容为游戏加载器,在VCD模拟器运行时会加载到&H6000内存。先执行&H6400地址。从&H800开始就是游戏的数据。些游戏数据可以转换成普通NES文件并运行成功。

裕兴VCD光盘游戏转NES:

一、128K以上的几种类型

直接将&H800之前的2K数据删除。再添加16个字节的NES文件头,另存为NES文件即可用任何FC模拟器运行了。

  • 130K的,文件头是[4E45531A080020000000000000000000],含义:prg=8,chr=0,mapper=2
  • 258K的,文件头是[4E45531A081040000000000000000000],含义:prg=8,chr=16,mapper=4
  • 386K的,文件头是[4E45531A101040000000000000000000],含义:prg=16,chr=16,mapper=4
  • 514K的,文件头是[4E45531A102040000000000000000000],含义:prg=16,chr=32,mapper=4
  • 770K的,文件头是[4E45531A2020A0400000000000000000],含义:prg=32,chr=32,mapper=&H4A=76

二、66K的转成mapper3,prg=32K,chr=32k.

文件头=4E45531A020430000000000000000000

prg1=BIN文件:&H800-&H47FF,大小=&H4000=16K

prg2=BIN文件: &HC800-结尾,大小=&H4000=16K

winhex打开BIN文件后,先建立一个新文件。将两个prg模块复制到新文件的&H0000和&H4000

CHR=BIN文件:&H4800-&Hc7FF,大小=&H8000=32K

再将CHR模块复制到新文件地址结尾:&H8000

这样新文件大小=64KB。在最前面加上16字节的文件头,另存为NES文件即可。

三、34K的转成mapper0

文件头=4E45531A 02010000 0000000000000000 含义:prg=2,chr=1,mapper=0,大小40K

将&H0800起&H2000字节复制到文件结尾,删除前&H800字节的2K内容,再 粘贴16字节的文件头到0000地址,另存为NES文件即可。

其中,有的文件可以转成16K+8K大小32K的NES。不过不保险,因为舍弃了&H2800地址的8K内容。这一部分内容在有的文件中是有用的,舍弃的结果要么是画屏,要么是运行出错。其实这个类型的游戏本身来源于32K的NES,只不过裕兴在改编时修改了个别数据。如果你拿它和原版NES对比,就可以找到它修改的个别数据。

四、50K的转成mapper0

文件头=4E45531A 02010000 0000000000000000 含义:prg=2,chr=1,mapper=0,大小40K

将&H0800起&H2000字节8K数据(chr)复制到文件结尾,变成58K。删除前&H4800字节的18K(2K加载器,8K CHR,8K 裕兴自制程序)内容,变成40K。最后粘贴16字节的文件头到0000地址,另存为NES文件即可。

这里要特别说明一下,8K被删除的裕兴自制程序里是有重要数据的。其中有2个字节是NES必须的RESET端口数据。有的BIN文件里,prg2里的reset端口没有修改。用以上方法制作的NES就可以成功运行了。

什么时reset端口?reset端口就是游戏开始运行时要执行的内存地址,通常就是NES文件中最后一个prg模块的最后第3个和第4个这两个字节。在运行状态下,这个模块总是加载到C000-FFFF或E000-FFFF。reset端口=&HFFFC+ &HFFFD.比如一个50K的BIN文件最后6个字节为

04 80 00 A0 24 80

,这6个字节一定要加载到内存FFFA处。其中,前2个字节04 80 叫NMI端口,中间2个字节00 A0叫RESET端口,后两个字节24 80叫IRQ端口。这里reset就是&HA000.

但是,有的50K的BIN文件中,RESET端口被修改过,这时如果不恢复正确的端口2个字节,新NES不能运行。原因在于,修改后的reset端口会先运行裕兴自制程序prg0模块(A000地址为自制程序,8000为CHR)。自制程序先把原版的RESET端口写到0400内存,再通过切bank,把&H4800的prg1模块加载到8000.最后跳转0400内存去执行原版reset端口。但是我们要转换成的NES是mapper0,只有2个prg模块,裕兴的这个prg0模块没办法装载。

其实在34K转换时也有这个问题,但是因为它的有效prg只有一个,所以我们可以把它多出来的一个模块装入8000,正常模块装入C000.RESET不正确的问题被掩盖了。

因此,在50K游戏转换NES时,必须从裕兴自制程序prg0模块中找到正确的reset端口,将prg2模块中的reset端口2个字节修改恢复成原版RESET端口才行。即把BIN文件结尾处倒数第3、4字节修改成这两个字节。

那么怎么找到正确的RESET端口呢?

方法:

  1. 先找现有的reset端口’,比如A000A004等等。
  2. 把这个内存地址换换算成BIN文件的地址。内存A000=BIN文件的2800,内存A004=BIN文件的2804.
  3. 转到BIN文件的2800地址,一般第一个字节是78 ,这是NES中程序开始通常都是这个字节。往下找,找到4C 00 04 A9 01 8D 00 80 4C这几个字节。
  4. 接下来的2个字节就是原版的RESET端口。其中4C 00 04 代表程序跳转到0400A9 01 8D 00 80代表把&H8000的16K内存切BANK成prg1模块。最后一个4C=JMP,后面的两个字节是跳转地址如00 80 ,代表跳转到8000。这里最关键的是4C 00 04这三个字节。通常在这三个字节之前,会有11个字节的复制程序,例如

A2 08 BD 3E A0 9D FF 03 CA D0 F7 ,负责把A9 01 8D 00 80 4C XX XX这8个字节复制到内存0400-0407.

这里BD 3E A0中的A0 3E在不同的BIN文件中并不一定相同,但是一定是4C 00 04之后的这个地址。下面粘贴上这段完整代码:

data: array[0..70] of byte = (
$78, $D8, $A9, $00, $85, $00, $8D, $00, $20, $8D, $01, $20, $8D, $06, $20, $8D,
$06, $20, $A8, $EA, $EA, $EA, $EA, $EA, $EA, $A2, $20, $A9, $80, $85, $01, $B1,
$00, $8D, $07, $20, $C8, $D0, $F8, $E6, $01, $CA, $D0, $F3, $A9, $04, $8D, $00,
$55, $A2, $08, $BD, $3E, $A0, $9D, $FF, $03, $CA, $D0, $F7, $4C, $00, $04, $A9,
$01, $8D, $00, $80, $4C, $00, $80
);

编辑于 2026-06-26 · 著作权归作者所有