逆向:程序研究/AT1/字体例程

Xiyan讨论 | 贡献2021年5月23日 (日) 20:17的版本 (新建页面)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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是一个十进制数字),可以改变字体。每个字体有独立的字库描述字符串,和字库地址。分别以两个数组存储(一般挨在一起)。