十一、Rom中的地址
这一部分先简单介绍一下GB/GBC Rom中的地址相关的内容。
游戏中的地址都是两个字节,从0000~FFFF,大致可以划分为下面几部分

但我们之前在CrystalTile2中看到的地址是000F048C,000123456这样的四字节的十六进制数,这两者是如何对应的呢?
GB/GBC游戏运行的时候会把Rom按照16384个字节一组分成许多个Bank。比如00000000-00003FFF是Rom0,00004000-00007FFF是Rom1,00008000-0000BFFF是Rom2…
其中Rom0是主Bank,地址是固定的,对应游戏中的双字节地址从0000-3FFF。
双字节地址4000-7FFF,对应的是除了Rom0以外的其它Bank,他们在游戏中的地址都是4000-7FFF,但会用不同的Bank号来区分。比如上一节我们提到的de中的地址6FEC,它实际对应的是Rom4F的6FEC,Bank号可以在BGB调试器右上角寄存器的最后一行看到(rom=4F)。

这个地址对应的绝对地址应该是
(4F-1) * 4000 + 6FEC = 0013EFEC
这里都是16进制数,可以用程序员计算器选择HEX(16进制)来进行计算。
双字节地址8000-9FFF对应的是VRAM的地址,我们需要把文本对应的Tile写到这里。
双字节地址A000-BFFF我不太清楚,好像和存档有点关系。
双字节地址C000-DFFF是WRAM,游戏开始运行后会在这里进行数据读写操作,金手指就是通过修改游戏时WRAM中的数值,来实现修改游戏的目的
双字节地址E000-FFFF也是WRAM,游戏开始运行后会在这里进行数据读写操作,这里有一些特殊的地址,具体作用我也搞不清楚。
因为4000-7FFF这一区间一次只能对应一个Bank,如果要访问其他的Bank,就要进行Bank的切换,一般是通过把Bank号写入特定的地址来实现的,比如这个游戏中通过下面这个命令来实现Bank的切换,

切换Bank的操作根据Rom类型的不同会有区别,建议还是采用游戏本身使用的命令或程序来进行Bank的切换,以免出错。
如果要修改或者添加程序,一定要注意地址的问题,如果程序的地址在Rom0,也就是0000-3FFF,那么无论现在在那个Bank,都可以调用操作。如果地址4000-7FFF,那只能调用当前程序对应地址的程序,尤其在程序涉及到切换Bank的时候,一定要确认要调用的程序的位置。
我们再回到上一节的那个问题,现在我们知道游戏从0013EFEC这里读出一个编号7B,然后把这个编号的Tile写到VRAM中的9987这里。我们可以在CT2中去访问这个地址,也可以在BGB模拟器中来访问。
右键点击BGB调试器左下方窗口,选择Go to…,输入Rom:13EFEC或者4F:6FEC,可以来到这个地址

仔细观察的话会发现,这一段其实是对应的就是将要显示的画面,每一个字节对应的编号就是要在屏幕上显示的Tile的编号。这里的7B7C7B7C7D7E,以及隔一行的9B9C9B9C9D9E就是对应“いいえ”,我们修改一下,让它只显示为“え”。上方修改为7D7E40404040,下方修改为9D9E40404040(这里40对应的是全黑的Tile)。

这里修改的是Rom本身的内容,是可以保存的,这样我们就不用担心下次进游戏时会变回去。
采用这样的方法,我们就可以把这种类型的图片也汉化了。