逆向:程序研究/AT1/字体例程
< 逆向:程序研究
AT1的字体例程目前仅研究了主显示用的主字体,对于其他(战斗字体)不甚了解。即使是主字体,目前也仅跟踪到一个缓冲区,对更细节的显示部分并不了解。
AT1的主字体,是24*24,4bpp的灰度位图字体。显示时,字体例程会对其缩放。
取字例程
主取字例程,首先将编码和一个缓存区中的编码数组(int32)里的编码比较。如果没有取到,那么就调用另一取字例程,从字库中取字,复制到缓冲区中。
从字库取字的例程大约工作方式如下:
index = get_index(encode) ptr = texture_base + 24 * 24 * 0.5 * index # 24*24, 4bpp copy_to_cache(ptr)
get_index是一个函数,它在字库描述字符串中比对传入的编码encode,并返回比对成功时的字库索引。
textrue_base是字库基址。这个基址会因字体的变化而变化。
字库索引获取例程
ptr = texture_description i := 0 while *ptr <> 0 if *ptr = encoding & 0xff00: ptr += 1 if *ptr = encoding & 0xff: return i else: ptr += 1 end; else: ptr += 2 endif; endwhile;
encoding是传入的要获取的字符编码。
texture_description是字库描述字符串的基址。
字体选择器
通过内部控制或控制符FD(D是一个十进制数字),可以改变字体。每个字体有独立的字库描述字符串,和字库地址。分别以两个数组存储(一般挨在一起)。