• [FC]狮子王5合卡提取

    再来一个山寨fc游戏,本rom来自俄罗斯组织CaH4e3所dump的一个三合一游戏《3-in-1 Lion King 5, The (Unl)[U][!]》,我把当中的《狮子王5》单独分离出来,本游戏跟goodnes收录的《狮子王3》类似。

     十二月 16th, 2008  madcell   No comments

  • [FC]两个卡拉OK Demo减肥版

    传两个rom上来,原rom是由周哥发布的(查看原帖),原大小分别是256K和1024K。
    查看rom结构后,发现是“overdump”,剪掉重复数据后的大小分别是192K和512K。

     十二月 15th, 2008  madcell   No comments

  • [FC]《热血物语》汉化版080922

    程序:madcell
    翻译:AirTeam / 竹竿
    开始汉化热血物语是在06年,fc的汉化并不是那么好做,自己业余时间有限,曾想过放弃,但看着空气组提供的润色再润色的文本,还有自己写的大量汉化程序,都是花了不少时间,始终不忍删掉。
    汉化版改动的地方很多,起名、密码和存档系统都不能正常使用。目前最遗憾的是,每次出现汉字之前,画面都会闪烁并跳动一下,为了在游戏中看到中文字符,大家只能忍了,有点不好意思啊,哈哈。
    如果想做到完全不闪烁,需要重新设计汉化方案,也不一定能做到,这个待日后有机会再研究了。
    另外,如果游戏过激的话,可能会出现死机。
    注意,对画面闪烁感到不适者,应立即停止使用本汉化游戏,出现问题概不负责。
    只推荐使用Nestopia运行热血物语汉化版。
    对本汉化游戏有任何建议及问题,可以到天使乐园遗址留言。

     九月 22nd, 2008  madcell   No comments

  • [FC]《热血物语》汉化进度080915

    开始汉化本游戏,大约是两年多前的事,最近再次把它翻出来汉化。

    引用“硫酸脸”的话:
    有一件事我想要补充,我认为开发PS3游戏根本就没那么难。如果要比的话,给FC开发游戏要难得多,这是大实话。我的意思是,找一个PS3游戏的开发人员来,给他一台FC,看看他能不能做出一个FC游戏,我敢说肯定不行。没错,这就可以证明我所言不假,我愿意跟你打赌……

    同理,FC汉化要比PS3难得多。

     九月 15th, 2008  madcell   No comments

  • [FC]熊猫冒险(Panda Adventure)移除合卡菜单

    这个rom是我早前从惊风dump的一个合卡rom中单独分离出来的,现在把碍眼的图形选择菜单去掉。

     九月 15th, 2008  madcell   No comments

  • [FC]《双截龙III-罗塞塔石碑》汉化版080908

    程序:madcell 翻译:灰米さん
    fc经典动作游戏之一,双截龙系列三作中,本人最喜欢2代。
    因为有了汉化,才能首次完整了解到双截龙3的故事。
    本汉化游戏是改用mapper191,只推荐用nestopia运行。

     九月 8th, 2008  madcell   No comments

  • [GB]《热血硬派》及《坦克大战》汉化版

    大半前已经汉化好的游戏,首次在网上发布。GB的机能比FC强,写起程序也比FC灵活很多。坦克大战是作为练习之用,就做了几个汉字。热血硬派汉化了单人模式下的全部剧情,双人联机模式的剧情与单人模式不同,没有汉化,剧情由”照照坊主”进行翻译。个人感觉热血硬派有点难度,这里做了一个不减血版本,适合像我这样无作弊不欢的玩家。汉化版适用于任何模拟器,本人用goomba在GBM上通关。

     八月 21st, 2008  madcell   No comments

  • [FC]地球虫2(Earth Worm Jim 2)去合卡菜单

    前段时间本人发布过一个从合卡中提取的游戏Earth Worm Jim 2,没能去掉合卡菜单,于是拜托周哥,如今做好了。但发现残留有选择游戏完毕后“嘀”的一声,经分析,我把控制音量大小的相关数值降到0,大概相当于变成静音。 虽然这样做有点取巧,也不算完美rom,但是目前也只能这样,况且这游戏有否单卡版本也是无从考证。

    相关链接:周哥工作室

     八月 19th, 2008  madcell   No comments

  • [FC]一堆新ROM(不是新游戏)

    新ROM发布,注意是新ROM,不是新游戏,原游戏全部都可以在GoodNES v3.14中找到。

    Adam & Eve / Balloon Monster / Bookyman / Cosmos Cop / Porter / Magic Carpet 1001

    从合卡“6-in-1 (Caltron) [!]”分离出来,每个游戏都发行过单卡,版权标识为MegaSoft或NTDEC,Adam & Eve、Bookyman、Porter、Magic Carpet 1001的单ROM版本还未有流传。厂商做成合卡后改标识Caltron发行。正确来说,分离出来的ROM都不算官方的发行版本。

    Linus Spacehead / Super Robin Hood / Boomerang Kid / Treasure Island Dizzy
    Baseball Pro’s / BMX Simulator / Soccer Simulator / Pro Tennis Simulator
    CJ’s Elephant Antics / Stunt Buggies / F-16 Renegade / Go! Dizzy Go!

    以上12个游戏是从合卡“Quattro Adventure (Camerica) [!p]、Quattro Sports (Camerica) [!p]、Quattro Arcade (Camerica) [!]”中分离出来的。
    Super Robin Hood早些年已由俄罗斯组织CaH4e3所发布,因为是从盗版单卡中吸出,所以缺少了制作商和发行商的标志,而此版从官方的合卡中分离出来的,完整保留了原来的出场标志。BMX Simulator有收录在GoodNES中,但该版本似乎改动过数据。Quattro Arcade不同与其他两个合卡,显示厂商logo的程序和数据是存放在同一个游戏中,其他三个是调用该游戏的显示程序,所以分离出来后,只有一个ROM有logo。这些游戏都没有发行过单卡版本,只在合卡中出现。

    EarthWorm Jim 2 / Mortal Kombat 3

    从合卡“Golden Card 6-in-1 (Unl) [!]”中提取。
    目前还没发现EarthWorm Jim 2的单ROM,只有原开发者之一的周哥保留的半成品版。可惜合卡的菜单程序是混合在本ROM中,没能跳过。
    Mortal Kombat 3和GoodNES中收录的Mortal Kombat 3 Extra 60是同一个游戏,个人认为10人版才是原版,至于那个60人版,D商忽悠小朋友的惯用伎俩。
    SuperGame仿制的,都是MD上的精品游戏,所用的游戏图像、音乐以及角色动作,也是严格按照MD版,制作出来的游戏质量很不错。

    Stakk’M

    从合卡“Maxi 15 (AVE) [!]”中提取,跟麻将方块(MaJiang FangKuai – Majohn Block)、Poke Block(海外版)以及AV Dragon Mahjang(Hacker添加色情成份)雷同,做成合卡并改掉标题后,由AVE发行。原合卡为Mapper234,提取后发现不能用此mapper运行,经跟踪修改,还原AVE常用的mapper79。

    Family

    从“2-in-1 – Family Kid & Aladdin 4 (Ch) [!]”中提取,跟Somari雷同,只是改掉了操作角色。据网上资料,somari是原版,卡带最早在香港出现,family是改版。本游戏仿制得很不错,索马里这个名字也够恶搞的。此游戏也和另外三个游戏Sonic 3D Blast 6、Sonic & Knuckles 5以及Sonic The Hedgehog雷同,ROM中的数据和图形绝大部分相似,估计只是换操作角色和关卡的增减,因为D商的本质,情况比较混乱,有了解的朋友告之。

    Jackpot

    从合卡“Mind Blower Pak (HES)”中提取,似乎是“水果狸”的海外版。

    Block Force

    从合卡“Tetris Family 9-in-1 (Hwang Shinwei) (Unl) [!]”中提取,此游戏发行过单卡。

    Sunday Funday

    从合卡“Sunday Funday (Wisdom Tree) [!]”中提取,跟Color Dreams发行的Menace Beach雷同。

    Panda Adventure

    从合卡“Super Cool Boy 4-in-1 (CB-4034)”中提取。一开始就出现大大的logo和ababsoft.com,查询了一下,网站应该是挂掉了,从网络残留的一些历史信息来看,似乎是制作盗版合卡为主,至于Panda Adventure是否ababsoft制作,就不得而知了。同样是因为菜单程序混合在原游戏程序中,没能跳过。

    Super Donkey Kong 2 / Mortal Kombat 3 Extra 60 / Street Fighter V Turbo 60 / Balloon Monster / Magic Jewelry

    原ROM分别来自Super Donkey Kong 2 (Unl) [a1]、Mortal Kombat 3 Extra 60 (Unl) [!]、Street Fighter V Turbo 60 (Unl)、El Monstruo de Los Globos (Unl)和Magic Jewelry (Unl) [!],删掉当中重复的CHR-ROM或PRG-ROM。
    Mortal Kombat 3 Extra 60减肥版只能用CaH4e3改版的fceu-mm运行,nestopia还不支持,此类非官方卡带,一般都是针对该游戏,对模拟器进行修修补补来支持,如果想用其他模拟器来运行此游戏,只能等待模拟器的更新或者ROM的修改。
    El Monstruo de Los Globos是该游戏在欧洲发行时卡带封面使用的名称。

     七月 31st, 2008  madcell   No comments

  • FC大字体汉化方法

    FC大字体汉化方法

    一.前言:
    本文以FC上第一个发售的游戏《大金刚》为例,介绍如何对标题画面进行大字体汉化。
    阅读本文,必须具备一定的的条件,否则看了也是不知所云。例如:掌握计算机原理、熟悉6502汇编知识、了解FC硬件系统、有编程经验等。这些知识及技能并不需要精通,足够用于汉化即可。
    推荐一些有用的技术文档:任天堂产品系统文件、任天堂游戏编程探秘、Mapper说明文档、NES档案格式说明、6502编程大奥秘、6502微处理指令集、6502基础知识等。

    二.汉化工具:
    1.调试器:VirtuaNES Debugger、FCE Ultra XD-SP、NO$NES。
    2.汇编及反汇编:6502 Simulator、NESDEW、6502 Disassembler。
    3.ROM修改:WinHex、CrystalTile2。

    三.术语解释:
    1.ROM、PROM、VROM:
    FC卡带的ROM有两种:PROM(PRG)和VROM(CHR)。PROM用于存放程序、数据和图形,VROM用于存放图形和数据。FC规定一个PROM的大小是16K,VROM是8K,最基本的FC卡带是一个PROM加一个VROM,共24K。
    2.Mapper:
    内存映射器,通俗来说,是一种切换PROM或VROM的方式,具体是用一块芯片来实现。凡是大于24K的ROM,都要上加这种芯片。24K的ROM没有Mapper,习惯称为Mapper0。

    四.Mapper3工作原理:
    本例中,需要把原ROM的Mapper0改成Mapper3。
    Mapper3不能切换PROM,允许的PROM大小只有两种:16K和32K。VROM理论上是8K至2040K。
    PROM是16K时,16K的PROM全部映射到CPU的$C000-$FFFF,$8000-$BFFF是$C000-$FFFF的镜像。
    PROM是32K时,32K的PROM全部映射到CPU的$8000-$FFFF,其中,#00的PROM(16K)映射到$8000-$BFFF,#01的PROM(16K)映射到$C000-$FFFF。
    Mapper3的特点是可以切换VROM,一次切换一个VROM(8K),映射到PPU(VRAM)的$0000-$1FFF。
    对Mapper3进行操作的方法是:往CPU的$8000-$FFFF这个范围内,写入一个1字节数值,该值就是VROM的编号(Bank Number),以8K为一个单位,理论上是#00至#FF。
    下面是切换VROM的程序,很简单,只需要两条指令:
    例1 :
    lda #$00 ;切换#00的VROM到PPU的$0000-$1FFF
    sta $8000
    例2:
    lda #$01 ;切换#01的VROM到PPU的$0000-$1FFF
    sta $8000

    五.关于CPU I/O端口$2006和$2007:
    这里只说一下在本例汉化中用到的两个端口:$2006和$2007。
    具体操作是:通过连续两次写$2006,设置VRAM的当前操作地址(PPU地址),第一次写入的数值是地址高位,第二次是低位。设置好PPU地址后,再通过写$2007,往VRAM送入数据,每次写完一个数值,PPU地址自动加1或者加32。
    例1:
    lda #$22 ;A=0×22
    sta $2006 ;写0×22到$2006(CPU),设置PPU地址的高位。
    lda #$09 ;A=0×09
    sta $2006 ;写0×09到$2006(CPU),设置PPU地址的低位,此时,PPU的当前操作地址是$2209(PPU)。
    lda #$fe ;A=0xFE
    sta $2007 ;写0xFE到$2007(CPU),往VRAM地址$2209(PPU)处送入数值0xFF,同时PPU地址自动加1,变为$220A(PPU)。
    lda #$88 ;A=0×88
    sta $2007 ;写0×88到$2007(CPU),往VRAM地址$220A(PPU)处送入数值0×88,同时PPU地址自动加1,变为$220B(PPU)。

    六.反汇编NES ROM:
    用NO$NES就可以对整个ROM进行反汇编。
    操作步骤:
    1.载入ROM -> 点击指令窗口 -> Ctrl+G -> 输入“C000” -> 把C000拉到窗口的顶行。
    2.菜单 -> Utility -> Disassemble to File -> 输入“4000” -> 保存。
    3.得到的*.ids就是汇编程序,实际是一个文本文件。

    七.扩容:
    本例使用的文件:Donkey Kong (World) (Rev A).nes,大小24K(24592字节)
    ROM中没有可用的多余空间,解决方法是扩容,增加一个PROM和一个VROM就足够,还要把Mapper0改成Mapper3。
    原ROM结构:16B Header + 16KB PROM + 8KB VROM
    新ROM结构:16B Header + 16KB PROM(New) + 16KB PROM + 8KB VROM + 8KB VROM(New)
    原ROM结构(详细):16B Header($0000-$000F) + 16KB PROM($0010-$400F) + 8KB PROM($4010-$600F)
    新ROM结构(详细):16B Header($0000-$000F) + 16KB PROM($0010-$400F,#00) + 16KB PROM($4010-$800F,#01) + 8KB VROM($8010-$A00F,#00) + 8KB VROM($A010-$C00F,#01)
    操作步骤:
    1.WinHex打开ROM -> 光标定位到$0010 -> Ctrl+0(粘贴0字节) -> 输入“16384”。
    2.光标移到文件结尾的字节 -> Ctrl+0(粘贴0字节) -> 输入“8192”。
    3.改NES文件头:由于增加了一个PROM和一个VROM,$0004和$0005处都改为0×02;改Mapper3,$0006处改为0×30。
    这样就完成了ROM扩容和Mapper修改,修改后的PROM为32K,VROM为16K,ROM大小为48K。
    试着用任何模拟器运行《大金刚》,效果跟原来的没两样。

    八.新VROM的修改:
    先把原ROM中的8K VROM复制到新增的VROM中。
    我们看一下标题画面用了哪些Tile图案,组成“DONKEY KONG”的编号为62的图案,黑色背景#24的图案,还有就是英文和数字。
    这就是说,除了#62和#24不能改动外,其他的都可以改,那么就从#70开始改动吧。
    菜单和版权信息翻译后用到汉字有“单双人游戏AB198任天堂日本制造”。
    制作码表,为了方便,就用Tile号作为每个汉字编码:
    70=单
    74=双
    78=人
    7c=游
    80=戏
    84=A
    88=B
    8c=1
    90=9
    94=8
    98=任
    9c=天
    a0=堂
    a4=日
    a8=本
    ac=制
    b0=造
    最后用CrystalTile2制作字符,定位到$B710 -> 属性设置:宽度16,高度16,绘图模式ObjH-1234 -> 设置字体及大小 -> 导入码表完成字符制作。

    九.调试器VirtuaNES Debugger的使用:
    常用的调试器有VirtuaNES Debugger、FCE Ultra XD-SP和NO$NES,功能是各取所需,这里以简单直观的VNES为例。
    载入ROM后,分别打开以下窗口:
    1.RAM:查看CPU内存$0000-$FFFF,也就是6502的寻址范围。
    2.图案:开启“图案表查看器”,FC有两个图案表,称之为“图案表0”和“图案表1”。上部分(图案表0)对应VRAM的$0000-$0FFF,占用4K,Tile编号0×00至0xFF。下部分(图案表1)对应VRAM的$1000-$1FFF,占用4K,Tile编号0×00-0xFF。本例中,图案表0是用于活动块,图案表1是用于背景。
    3.VRAM:开启“命名表/属性表查看器”,查看活动块属性、调色板、命名表、属性表,对应VRAM的$2000-$27FF。本例中,我们只关注$2000-$23BF。
    当画面停在游戏标题画面时,光标定位到$2209,该处数值是0×01,也就是Tile ID。
    4.背景:开启“背景查看器”,大窗口包含四个小窗口,本例中,我们只关注左上角的,该窗口对应VRAM的$2000-$23BF。
    当画面停在游戏标题画面时,鼠标点取“1 PLAYER GAME A”中的“1”,窗口下面显示信息的为“Tile:01,Address:2209”,表示VRAM地址的$2209处,显示背景图案表中编号为01的Tile,也就是图案“1”。
    本窗口和VRAM窗口描述的是同一个事情,一个用具体图案表现,一个用数值表示。
    5.精灵:查看当前活动块情况。
    6.DEBUG:开启“指令显示控制”,用于设置断点进行跟踪分析。
    下面就以《大金刚》为例,介绍跟踪操作:
    1.勾选左下角的“一开始暂停”,重新载入ROM,此时模拟器暂停,准备执行第一条指令,图案表、命名表、调色板、内存等清零。
    2.设置断点,在“注释内出现”后面填入“[2007]=A=0×01”,点击右边的“确定”,模拟器立即执行N条指令后停下,这时注意以下几个窗口的状态:
    调试窗口:窗口底部最后一条指令为“F216: 8D 0720  STA $2007  ;[2007]=A=0×01”,表示往VRAM的$2209写入0×01(图案“1”),
    背景窗口:标题“DONKEY KONG”已经显示出来,同时还有一个图案“1”;
    命名表/属性表窗口:$2209处的数值是01,周围一大块都是24(空白Tile图案)和62(组成DONKEY KONG标题的Tile图案)。
    模拟器窗口:空白。
    3.在“PC为”后面填入F216,再按后面的“确定”,执行N条指令后,窗口底部最后显示的指令是“F216:8D 0720  STA $2007  ;[2007]=A=0×24”,表示往VRAM的$220A写入0×24(空白Tile图案),
    4.继续按“确定”,显示的指令还是“F216:8D 0720  STA $2007  ;[2007]=A=0×19”,表示往VRAM的$220B写入0×19(图案“P”)。这时再看一下背景窗口,已经出现图案“1 P”。
    5.连续按“确定”,陆续出现L、A、Y、E、R,直到菜单和版权信息全部出现,模拟器响起音乐,进入标题画面等待状态。
    6.让模拟器继续运行,会再次停在断点$F216,但这次不是我们需要的。$F216处的指令除了绘制菜单外,还有其他作用。绘制标题画面、写调色板、绘制游戏画面等,用的也是这条的指令。反正先记下“F216:8D 0720  STA $2007”,从这里开始构思修改方法。
    7.重复步骤1和2,模拟器停下后,勾选窗口下面的“停止刷新”,往上拉滚动条,注意看注释,寻找包含信息“[2006]=??????”的指令。很容易就找到两条,“F1EC: 8D 0620  STA $2006”和“F1F2: 8D 0620  STA $2006”,其对应的注释正是“[2006]=A=0×22”和“[2006]=A=0×09”(请查看前面关于端口$2006和$2007的说明)。
    记下这两个地址:$F1EC和$F216,$F1EC是设置PPU地址,$F216是往VRAM送入数据。

    十.程序修改:
    前面说过,绘制标题画面、游戏画面、写调色板等都是同一条指令“F216: STA $2007”,这里的问题就是如何修改程序,使这条指令在绘制菜单的过程中不执行。方法是:在某处加入判断语句,按条件执行分支程序,在绘制菜单时,不执行$F216而执行自写程序,在绘制除菜单外的图案时,执行$F216。
    但是在本例中,用更简便的方法:从绘制完整个标题画面到模拟器窗口出现画面的这段时期内,寻找某个指令,该指令在这期间只执行过一两次,并且在除此之外的其他时候不会再次出现。这样我们只要该处设置一个跳转指令,去执行自写程序,执行完毕就跳回原来的程序。当然这也要经过多次的设断点,进行跟踪、分析、测试,才有可能找到。
    从NO$NES反汇编出来的文件中,关注$F1EC-$F23B这段程序,同时配合调试器,经过N次的跟踪分析,往上找到了一处指令:“C921: LDA $0511”。经测试,这条指令在上面所说的情况下,只执行过一次,并且在游戏操作画面中也没有再次出现(反正是暂时没发现),正符合要求。
    记下这两条指令:“C921:LDA $0511”和“C924: STA $0200”。
    大家可能会发现,当程序执行到$C921时,背景窗口已经完成了标题画面的绘制,但是,注意此时屏幕还是处于关闭状态(模拟器窗口空白)。
    我们要做的,就是趁画面还没显示出来之前,擦除不需要的图案,然后绘制自己喜欢的图案。我们只是修改游戏,只要是简便并且达到最终效果就可以。
    扩容后的ROM,CPU的$8000-$BFFF这个范围是可以自由使用,与之对应的ROM绝对地址是$0010-$400F。
    操作步骤:
    1.NESDEW打开ROM,设置:文件0×4010,汇编0xC000,16K Bank。
    2.点击“重载”,完成反汇编。
    3.在“搜索”前面填入“C921”,点击“搜索”,跳到该处。
    4.把光标定位到该行,点击“修改” -> 输入“JMP 8000” -> 完成。
    5.两条指令都是占用3字节,最后点击“保存”。
    当原程序在执行到$C921时,就会跳转到自写程序$8000。

    十一.自定义程序的编写:
    $8000-$BFFF是可以自由使用的空间,用于执行自写程序。
    从这里开始,标题画面的绘制就在我们的完全掌握之中,只要有兴趣,可以改成全新的标题画面。
    运行6502 Simulator,这个工具有很多功能,我们只使用其中的代码编辑和编译。
    操作步骤:
    1.按新建文件,代码如下(注意每行代码前面最少要加一个Tab,否则不能编译):
    .org $8000 ;指定程序的执行地址。
    pha ;保护现场
    txa
    pha
    tya
    pha
    ;从这里开始自由发挥
    lda #$01 ;切换#01的VROM到PPU的$0000-$1FFF
    sta $8000


    ;自由发挥结束
    pla ;恢复现场
    tay
    pla
    tax
    pla
    lda $0511 ;执行游戏原来的命令
    jmp $c924 ;返回原来的程序
    2.保存源码文件*.65s,实际也是一个文本文件。
    3.按“Assemble”图标,对源码进行编译,如果代码有错会出现提示,编译过程瞬间完成。
    4.菜单 -> File -> Save Code -> 保存类型选“*.65b” -> 点击“Options” -> Begin:0×8000,Length:0×0400,End:0×83FF(够用即可)。注意在Save Code之前,一定要先执行“Assemble”,否则保存出来的就不是最新修改。
    5.保存为二进制文件“*.65b”。
    6.把这个二进制文件插入ROM中。以WinHex为例:同时打开65b文件和nes文件 -> 选取65b文件前面有数据的部分 -> 复制 -> 将nes文件的光标定位到$0010 -> Ctrl+B写入数据(注意是写入,不是粘贴)。
    7.保存nes文件,模拟器运行之。

    十二.大字体显示程序的思路:
    一个大汉字占用4个Tile,切开变成:左上角、右上角、左下角、右下角。
    写VRAM的过程如下:
    设置PPU地址,指定第一个汉字的左上角位置 -> 写入左上角图案 -> PPU地址自动加0×01 -> 写入右上角图案 -> PPU地址加0×1F,设置汉字的左下角位置 -> 写入左下角图案 -> PPU地址自动加0×01 -> 写入右下角图案 -> PPU地址减加0×1F,设置第二个汉字的左上角位置 -> 如此循环,直到写完该行文本。
    关于文本数据区的解释:
    22 0b | 70 78 7c 80 84 | fe
    PPU地址 | 单 人 游 戏 A | 文本分隔符(FF为文本结束)
    注意在绘制汉化菜单之前,要先擦除原来的菜单,完整代码如下:
    ;代码开始
    .ORG $8000 ;from c921
    ;保留现场:
    PHA
    TXA
    PHA
    TYA
    PHA
    ;切换VROM:
    LDA #$01 ;切换#01的VROM
    STA $8000
    ;擦除不需要的图案:
    LDY #$02
    LDX #$60
    LDA #$22
    STA $2006
    LDA #$00
    STA $2006
    LDA #$24
    jp8
    STA $2007
    DEX
    BNE jp8
    DEY
    BNE jp8
    ;大字体显示程序:
    LDY #$02
    LDX #$00
    jp7
    LDA text,x ;读取要设置的PPU地址高位
    STA $20
    INX
    LDA text,x ;读取要设置的PPU地址低位
    STA $21
    INX
    jp3
    LDA text,x ;读取文本编码
    CMP #$ff ;判断,如果编码是0xFF,则完成大字体显示,跳出自写程序
    BEQ jp5
    CMP #$fe ;判断,如果编码是0xFE,则继续绘制下一行文本
    BNE jp6
    INX
    JMP jp7
    jp6
    STA $22
    INX
    jp1
    LDA $20
    STA $2006 ;设置当前PPU地址高位(用于写入数据)
    LDA $21
    STA $2006 ;设置当前PPU地址低位(用于写入数据)
    LDA $22
    STA $2007 ;写入汉字的左上角或左下角图案
    INC $22
    LDA $22
    STA $2007 ;写入汉字的右上角或右下角图案
    INC $22
    DEY
    BEQ jp2
    CLC ;以下几条指令的作用:写完汉字的右上角后,将PPU地址设置为该汉字的左下角
    LDA $21
    ADC #$20
    STA $21
    LDA $20
    ADC #$00
    STA $20
    JMP jp1
    jp2
    LDY #$02
    SEC ;以下几条指令的作用:写完汉字的右下角后,将PPU地址设置为下一个汉字的左上角
    LDA $21
    SBC #$1e
    STA $21
    LDA $20
    SBC #$00
    STA $20
    JMP jp3
    ;恢复现场并跳回原来的程序:
    jp5
    LDA #$00
    STA $20
    STA $21
    STA $22
    PLA
    TAY
    PLA
    TAX
    PLA
    LDA $0511
    JMP $c924
    text
    .DB $22,$0b,$70,$78,$7c,$80,$84,$fe,$22,$4b,$70,$78,$7c,$80,$88,$fe,$22,$8b,$74,$78,$7c,$80,$84,$fe,$22,$cb,$74,$78,$7c,$80,$88,$fe,$23,$03,$8c,$90,$94,$8c,$98,$9c,$a0,$fe,$23,$14,$a4,$a8,$ac,$b0,$fe,$20,$43,$b4,$fe,$20,$4f,$b8,$fe,$20,$5b,$bc,$fe,$23,$4a,$c0,$c4,$c8,$cc,$d0,$d4,$ff
    ;代码结束

    十三.修改活动块属性:
    完成菜单的汉化后,发现菜单前面的“*”光标的位置不是很好,需要作适当的调整。
    图案“*”属于活动块,存放在“图案表0”中,Tile ID为A2。
    控制活动块属性的数值存放在CPU地址$0200开始的256个字节中,一个活动块占4个字节。
    这里要修改的是:控制Y座标的第1字节和控制X座标的第4字节。活动块的座标是以像素为单位的,调整到合适为止。通过观察内存,很容易发现对应“*”图案的4个字节是$0200-$0203。
    设置断点,在访问$0203时停下,找到“$C933: LDA #$38”,0×38就是X座标,改为0×4b。
    再次设置断点,在访问$0200时停下,不过这次要找的Y座标复杂一点,需要往上跟踪几次,最后找到“$C7C5: LDA #$7F”,把0×7f改为0×82。同时还要修改两处地方:“$C974: LDA #$7F”,0×7f改成0×82;“$C970: CMP #$BF”,0xbf改成0xc2。

    十四.在游戏画面切换原来的VROM:
    标题画面的汉化做好了,但是进入游戏画面会发现花屏现象,因为此时用的VROM还是自定义的那个。这里要做的是,在游戏画面出现之前的某个时刻,切换回原来的VROM。
    同样地,在修改程序的过程中,我们也尽量寻找只出现过一两次的指令。在修改标题画面的过程中,相对比较容易地就找到目标指令,但是在大多数情况下,都需要花很长时间进行跟踪分析。
    在这里提供一个方法,利用FCE Ultra XD-SP的“Trace Logger”功能,记录下某个阶段执行过的所有指令,然后筛选出符合条件的目标指令,在符合条件的指令之中,再优先选择JMP或JSR指令,最后在调试器中反复测试该指令是否真正符合要求。
    如何在上万条指令中找出合适的指令?如果有编程经验,就不是很难的事情。
    通过跟踪分析,最终找到“C812: JMP $F228”,经测试,该指令在每次进行画面切换时,都会执行一两次。
    把“C812: JMP $F228”改成“C812: JMP $80E0”,跳到自写程序的$80e0。
    要注意在定义这段程序的开始地址时,不能覆盖前面$8000那段程序的数据。前面已经说过,CPU的$8000-$BFFF,与之对应的ROM绝对地址是$0010-$400F,所以$80E0对应ROM的$00F0。
    程序很简单,只要切换回原来#00的VROM:
    ;代码开始
    .ORG $80e0 ;from C812
    PHA
    LDA #$00 ;切换#00的VROM
    STA $8000
    PLA
    JMP $F228 ;返回原来的程序
    ;代码结束

    十五.结束:
    经过多个模拟器的反复测试,暂时没有发现问题,至此,大字体汉化完成。
    程序的跟踪、分析、修改和编写方法因个人经验和喜好不同,本文关于FC大字体汉化的方法,相对来说,还是一种比较基础和简单的方法,希望对FC汉化爱好者起到抛砖引玉作用。

    madcell
    2008.06

     六月 6th, 2008  madcell   No comments