我不记得它是如何完成的(二十年前我做过这个),但你可能想看一下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)
如果我没记错并且显卡没有太大变化(我上次玩它已经是 15 多年前了),字体信息并不位于给定的内存地址,而是加载到显卡内存上。