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

Assembly 如何从VGA控制器内存中手动恢复系统字体?,assembly,fonts,dos,vga,Assembly,Fonts,Dos,Vga,我可以使用一台东芝386旧电脑(T2000Sx),其VGA系统字体极不寻常;我希望将其恢复为网站中的字体文件和文档 如何编写从VGA内存读取字体数据并将其写入软盘的程序? 该系统几乎无法从软盘启动,内存很少(1MB基本内存+9MB扩展),没有硬盘驱动器。它曾经通过并行端口上的ZIP驱动器引导Debian2.1,但这似乎不再有效 这个问题包括以下几个方面: 是否已经有(DOS)程序来执行此操作?(我还没有找到,但可能有?) 编程工具:我可以使用哪种语言/编译器?显然,这台机器不会运行任何现代操作系

我可以使用一台东芝386旧电脑(T2000Sx),其VGA系统字体极不寻常;我希望将其恢复为网站中的字体文件和文档

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

该系统几乎无法从软盘启动,内存很少(1MB基本内存+9MB扩展),没有硬盘驱动器。它曾经通过并行端口上的ZIP驱动器引导Debian2.1,但这似乎不再有效

这个问题包括以下几个方面:

  • 是否已经有(DOS)程序来执行此操作?(我还没有找到,但可能有?)

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

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


  • 假设您有一张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图像文件中查找字体数据。

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

    我不确定Linux有这个功能多久了;一个想法可能是去挖掘非常旧的Linux引导盘(Debian/Slackware/Yggdrasil等)并找到一个带有此实用程序的引导盘,或者可能将引导盘拆开并将
    setfont
    二进制文件复制到中。请注意,自1.x/2.0/2.2后期以来,Linux已经发生了巨大的变化,因此您需要完全从虚拟机内部完成所有准备工作

    为了完成一项彻底的工作,您还需要使用
    vga=ask
    将卡推入80x43、80x50等,以便您能够以这些分辨率启动并捕获这些字体


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

    可能是一个带有较旧Linux发行版(例如,仍然支持386的发行版)的启动/救援磁盘,以及库和实用程序?如果您在这个项目上取得了任何进展,请告诉我。我对这些旧字体非常感兴趣。您的东芝386字体是否与本网站可安装字体中列出的相同?我不确定
    setfont
    是否真的会转储显卡自己的字体,或者是否会简单地用
    setfont
    转储视频RAM中加载的最后一种字体。这是一个很好的观点-为了获得正确/准确的VGA ROM转储,您需要确保系统/发行版/etc尚未加载字体,因为如果那是记忆中的东西,那就是被丢弃的东西。在没有帧缓冲区的情况下运行也可能有帮助(因为fbcon可以在内核初始化时加载特定字体,这也可能会造成干扰)。