如何从VGA控制器内存手动恢复系统字体?

时间:2014-05-15 08:29:26

标签: assembly fonts dos vga

我可以访问东芝386 PC(T2000Sx),其中包含极其不寻常的VGA系统字体;我希望恢复为字体文件并在网站上提供文档。

如何编写从VGA内存中读取字体数据并将其写入软盘的程序?

系统几乎从软盘启动,内存很少(1MB基本+ 9MB扩展名),没有硬盘。它曾经通过并行端口上的ZIP驱动器启动Debian 2.1,但这似乎不再起作用了。

问题是:

的组合
  1. 那里有(DOS)程序吗? (我还没有找到;但也许有?)

  2. 编程工具:我可以使用哪种语言/编译器?显然这台机器不会运行任何现代操作系统,所以GCC / VS是不可能的。 20年前,我有一些经验,从汇编手动编写.COM可执行文件,但它生锈了;现在有没有更好的编程工具?

  3. VGA标准:地址空间中的哪个地址可以找到字体数据,我应该读取多少字节?我还没有在网上找到其他资料。

2 个答案:

答案 0 :(得分:2)

假设您有一个MSDOS 6.22启动软盘,您可以启动软盘,然后运行调试并创建小型汇编程序。

INT 6(偏移十六进制18)可能是指向当前字体表的远指针(至少为0到7fh)。

致电INT 10

AX = 1130h
BH = pointer specifier
    00h INT 1Fh pointer
    01h INT 43h pointer
    02h ROM 8x14 character font pointer
    03h ROM 8x8 double dot font pointer
    04h ROM 8x8 double dot font (high 128 characters)
    05h ROM alpha alternate (9 by 14) pointer (EGA,VGA)
    06h ROM 8x16 font (MCGA, VGA)
    07h ROM alternate 9x16 font (VGA only) (see #0020)
    11h (UltraVision v2+) 8x20 font (VGA) or 8x19 font (autosync EGA)
    12h (UltraVision v2+) 8x10 font (VGA) or 8x11 font (autosync EGA)
Return: ES:BP = specified pointer
    CX    = bytes/character of on-screen font (not the requested font!)
    DL    = highest character row on screen

您可以将cs和ds段寄存器设置为视频卡BIOS的段(可能是十六进制C000),然后将cx设置为字节数,使用n设置文件名,然后执行写操作。这将创建bios的二进制文件。可能有实用程序为其他操作系统执行此操作。然后,您必须从视频BIOS图像文件中找到字体数据。

答案 1 :(得分:0)

Linux setfont实用程序允许您将当前正在使用的VGA字体(在屏幕上)捕获到文件中。

我不确定Linux有多长时间使用此功能;一个想法可能是挖掘极其旧的Linux引导盘(Debian / Slackware / Yggdrasil等),并在其上找到一个带有此实用程序,或者可能将bootdisk分开并复制setfont二进制文件。注意Linux有自从1.x / 2.0 / 2.2天后期以来,您需要完全从VM内部完成所有准备工作,这一变化非常显着。

要完成一项彻底的工作,您还需要与vga=ask进行一些工作,将卡片推入80x43,80x50等,以便您可以启动这些分辨率并捕获这些字体。

根据您的经验水平,您可能会发现其他评论建议更容易使用汇编语言进行实验。请注意,此区域的快速迭代比以往任何时候都更容易;即使在非常基本的硬件上,QEMU-KVM(以及类似的)也会在大约不到一秒的时间内启动DOS等。