什么是DOS中字符表的内存地址?

use*_*475 13 c memory assembly dos vga

DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新的字体和符号?

我知道用BIOS中断来改变它,但是我只需要dos中字符表的内存地址来直接访问.

Dar*_*ust 7

我不记得它是如何完成的(二十年前我做过这个),但你可能想看一下FreeVGA项目.根据文本模式文档,您可以自己选择地址(有点;请参阅字符映射选择寄存器).此处说明访问该寄存器.

您可能还想查看此演示文稿,该演示文稿也可以处理此主题(并且可能更容易理解).

编辑: 这是一篇解释如何替换单个字符的帖子.他使用int 10h,ax = 1100h(替代文档)来交换一个字符,但是在CX寄存器中你可以实际告诉应该交换多少个字符.这是一个非常全面的int 10h功能列表.

编辑2:找到另一个很好的文档.

编辑3:在最后一个链接的文档中,有这样的:

用于直接访问字符发生器RAM的编程

以下序列设置EGA和VGA以访问字符发生器存储器.有关相关信息,请参阅EGA I/O端口.

out 3c4H, 0402H   Mask reg; enable write to map 2
out 3c4H, 0704H   Memory Mode reg ; alpha, ext mem, non-interleaved
out 3ceH, 0005H   Graphics Mode reg; non-interleaved access
out 3ceH, 0406H   Graphics Misc reg; map char gen RAM to a000:0
out 3ceH, 0204H   Graphics ReadMapSelect reg; enable read chargen RAM
Run Code Online (Sandbox Code Playgroud)

在这些OUT之后,字体数据从a000:0开始,字符的字体数据的第一个字节从字符的ASCII值*32开始.读取或写入字体数据后,以下序列将EGA/VGA恢复为正常操作:

out 3c4H, 0302H   Mask reg; disable write to map 2
out 3c4H, 0304H   Memory Mode reg; alpha, ext mem, interleaved
out 3ceH, 1005H   Graphics Mode reg; interleaved access
out 3ceH, 0e06H   Graphics Misc reg; regen buffer to b800:0
out 3ceH, 0004H   Graphics ReadMapSelect reg; disable read chargen RAM
Run Code Online (Sandbox Code Playgroud)


APr*_*mer 1

如果我没记错并且显卡没有太大变化(我上次玩它已经是 15 多年前了),字体信息并不位于给定的内存地址,而是加载到显卡内存上。

  • 如果_我_没记错的话(我也有十多年没有使用它了),它位于显卡上,但它映射到内存地址。 (3认同)