0

我可以使用带有非常不寻常的 VGA 系统字体的东芝 386 PC (T2000Sx) ;我想将其恢复为网站中的字体文件和文档。

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

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

问题是以下组合:

  1. 是否有(DOS)程序可以做到这一点?(我还没有找到;但也许有?)

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

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

4

2 回答 2

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 图像文件中找到字体数据。

于 2014-05-15T21:56:35.053 回答
0

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

我不确定 Linux 拥有这个功能多久了。一个想法可能是去挖掘极其古老的 Linux 引导盘(Debian/Slackware/Yggdrasil 等)并找到一个带有此实用程序的,或者可能将引导盘拆开并复制setfont二进制文件。请注意,自从1.x/2.0/2.2 天后,您将需要完全从虚拟机内部完成所有准备工作。

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

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

于 2016-07-17T03:00:24.497 回答