中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 为什么一些软件能在英文文本模式下显示中文?
作者:
标题: 为什么一些软件能在英文文本模式下显示中文? 上一主题 | 下一主题
chenyucheng
初级用户

我是新人



积分 152
发帖 70
注册 2023-7-21
来自 浙江省台州市
状态 离线
『楼 主』:  为什么一些软件能在英文文本模式下显示中文? [已使用 LLM 解释]

如图所示

在英文文本模式下,UCDICT英汉词典软件能直接在屏幕上显示中文。

Last edited by chenyucheng on 2023-8-1 at 21:08 ]
LLM 解释

该现象的核心机制是软件通过直接修改显卡字符发生器(Character Generator, CG)的自定义字符集,将汉字字模拆分为两个连续的8×16(或16×16,需对应模式)文本字符单元,从而在标准文本模式下模拟显示汉字。其技术细节与当年的硬件限制、中文显示需求直接相关,具体解释如下:

1. DOS文本模式的显示原理

DOS默认的文本模式(如80×25彩色文本,模式3)中,屏幕内容由视频缓冲区(如VGA的0xB8000)和字符发生器共同决定:

  • 视频缓冲区中每个字符占2字节:低字节是ASCII码(或扩展ASCII码),高字节是属性(颜色、闪烁等)。
  • 字符发生器是显卡ROM/RAM中的字模库,存储每个ASCII码对应的点阵(如8×16像素)。显卡会根据视频缓冲区的ASCII码,从字符发生器中取出对应字模并渲染到屏幕。

2. 软件实现中文显示的关键步骤

UCDICT等软件未依赖系统级中文DOS(如UCDOS的驻留模块),而是通过动态修改字符发生器的自定义区域实现中文显示,具体流程为:

  • 字模拆分:16×16点阵的汉字需占据2个连续的文本字符位置(横向拼接)。软件会将汉字字模拆分为左半8×16和右半8×16两部分,分别对应两个自定义的ASCII码(通常使用128~255的扩展ASCII码区域,该区域在英文DOS中未定义标准字模)。
  • 字模写入:通过显卡端口(如VGA的0x3C0~0x3CF)将拆分后的左右半字模,写入字符发生器的RAM自定义区域(部分显卡支持将ROM字模切换为RAM可写模式)。
  • 屏幕输出:在视频缓冲区中写入两个连续的扩展ASCII码(对应拆分后的字模),显卡会从修改后的字符发生器中取出字模,拼接显示为完整的汉字。

3. 当年常见的误解与技术限制

你引用的“将一个汉字拆分成两个字符并写入字符发生器”的描述是准确的,但需明确其边界条件:

  • 非系统级支持:这种方式仅对当前软件有效,退出软件后字符发生器会恢复默认,其他程序无法共享中文显示能力(与UCDOS等驻留型中文系统的全局支持不同)。
  • 硬件兼容性:部分早期显卡(如CGA、EGA)的字符发生器RAM容量有限,或不支持动态修改,可能导致显示异常。
  • 显示效率:字模拆分、写入字符发生器的过程需要直接操作硬件端口,在当年的低速CPU(如486)上可能存在轻微性能开销。

4. 该方案的历史意义

在中文DOS未普及或用户不愿加载驻留模块(节省内存)的场景下,这种“软件自实现中文显示”的方案是一种轻量级替代。但随着Windows图形界面的普及,这种依赖硬件字符发生器的技术逐渐被图形模式下的直接点阵渲染(如GDI)取代。

补充:与驻留型中文系统的区别

UCDOS等驻留型中文系统会通过TSR(内存驻留程序)接管系统中断(如int 10h显示中断),实现全局的中文文本输出支持,无需每个软件单独处理字模。而UCDICT的方案更轻量,但功能受限——这也是当年中文显示技术从“软件自实现”到“系统级支持”的过渡阶段产物。





新手上路!
现在的我来研究研究,我小时没用过的操作系统--DOS。古老的DOS资源比较稀缺,现在新开发的DOS软件也很少,还需要大家的努力,让DOS玩出新花样.
2023-8-1 21:02
查看资料  发送邮件  发短消息  网志  OICQ (744766348)  编辑帖子  回复  引用回复
chenyucheng
初级用户

我是新人



积分 152
发帖 70
注册 2023-7-21
来自 浙江省台州市
状态 离线
『第 2 楼』:  其他图片 使用 LLM 解释/回答一下

图2
图3

Last edited by chenyucheng on 2023-8-1 at 21:07 ]




新手上路!
现在的我来研究研究,我小时没用过的操作系统--DOS。古老的DOS资源比较稀缺,现在新开发的DOS软件也很少,还需要大家的努力,让DOS玩出新花样.
2023-8-1 21:06
查看资料  发送邮件  发短消息  网志  OICQ (744766348)  编辑帖子  回复  引用回复
chenyucheng
初级用户

我是新人



积分 152
发帖 70
注册 2023-7-21
来自 浙江省台州市
状态 离线
『第 3 楼』:   [已使用 LLM 解释]

请问在纯DOS汇编,如何才能显示汉字?
其中一回帖表示:

中文DOS下 (比如CCDOS, TWAY32, UCDOS等), 直接输出字符串(含汉字)即可。
如果你不用中文系统,有两种方式:
一种是文本模式显示汉字,有点复杂,将一个汉字拆分成两个字符并将其字模写入显卡的字符发生器
另一种简单点,是图形模式下在屏幕上画出汉字的每一点。


将一个汉字拆分成两个字符并将其字模写入显卡的字符发生器 ? ? ?
LLM 解释

在 DOS 时代的 VGA/EGA 环境下,这种技术被称为**“自定义字体(User-defined Fonts)”“软字库技术”**。它允许程序在不进入图形模式的情况下,通过修改显卡字符发生器(Character Generator)中的字模数据来显示非 ASCII 字符。

以下是该技术的原理与实现机制的详细解释:

1. 显卡文本模式的原理

在标准 VGA 文本模式(如 3h 模式,80x25 行)下,屏幕上的每一个字符位由两个字节组成:

  • ASCII 码(1 字节):指定显示哪一个字符(0-255)。
  • 属性字节(1 字节):指定颜色、闪烁等。

显卡根据 ASCII 码,从其内置的 字模显存(Plane 2) 中读取对应的 8x16(或其他尺寸)像素位图,并将其渲染到屏幕上。

2. 汉字拆分与字模重定义

标准汉字字模通常是 16x16 像素。由于文本模式下单个字符单元格的宽度固定为 8 像素(某些模式下为 9 像素),一个汉字在物理上无法放入一个字符位中。

具体操作步骤如下:

  1. 拆分:将一个 16x16 的汉字字模纵向切分为左、右两个 8x16 的部分。
  2. 映射:在 VGA 字符表的 256 个编码中,选取两个不常用的编号(例如 ASCII 128 和 129)。
  3. 写入:通过 BIOS 中断 INT 10h, AX=1100h 或直接操作 VGA 寄存器,将汉字的左半部分位图写入 ASCII 128 的存储区,右半部分写入 ASCII 129 的存储区。
  4. 显示:当需要在屏幕坐标 (x, y) 处显示该汉字时,程序在显存(B800h 段)的对应位置连续写入字符 128 和 129。

3. 技术限制与“动态刷新”

这种方法的主要限制是字符数量

  • 标准 VGA 文本模式支持 256 个字符。如果保留前 128 个标准 ASCII 字符,剩下的 128 个位置只能同时显示 64 个不同的汉字(128 / 2 = 64)。
  • 通过 VGA 的扩展功能,可以开启“双字库”模式,将字符上限提升至 512 个(利用属性字节中的第 3 位作为切换标志),此时可同时显示 192 个左右的汉字。

由于一屏幕显示的汉字往往超过 64 个,类似 UCDICT 或某些中文系统的“英文汉化版”会采用动态缓存机制: 程序会实时监控屏幕内容,根据当前屏幕上出现的汉字,动态地将需要的字模写往显卡的字模 RAM 中。如果屏幕上的汉字种类超过了 256/512 的上限,则会导致字符显示混乱或产生花屏现象。

4. 为什么不直接进入图形模式?

在 286/386 时代,直接在图形模式(如 Mode 12h, 640x480)下绘图显示中文虽然灵活,但存在以下缺陷:

  • 性能开销大:图形模式下移动光标、滚动屏幕需要处理大量的像素位操作,速度远慢于文本模式。
  • 内存占用高:图形显存的管理比文本模式复杂。
  • 兼容性:文本模式可以无缝继承 DOS 系统的各种指令输出,而图形模式往往需要完全接管显示逻辑。

5. 汇编层面的关键操作

在汇编中,实现这一功能的核心通常是操作 VGA 寄存器进入字模读写模式,或调用 BIOS 中断:

; 示例:使用 BIOS 中断加载自定义字模
mov ax, 1100h    ; 功能号:装入字模
mov bh, 16       ; 每个字符的高度(字节数)
mov bl, 0        ; 要加载到第几个字体块
mov cx, 1        ; 连续加载的字符个数
mov dx, 128      ; 起始 ASCII 码
push ds
pop es
mov bp, offset MyCharData ; 指向 16 字节的字模数据偏移地址
int 10h

总结

你所看到的 UCDICT 界面,本质上是将显卡当作一个可编程的字符显示器。它并未改变 DOS 的文本显示架构,而是通过高频率地欺骗显卡,将原本存储“英文字母”的内存区域替换成了“汉字的零碎部件”。这种技术在 90 年代初期的查词工具、安装程序及部分轻量级汉字系统(如简易版长城中文系统)中非常普遍。





新手上路!
现在的我来研究研究,我小时没用过的操作系统--DOS。古老的DOS资源比较稀缺,现在新开发的DOS软件也很少,还需要大家的努力,让DOS玩出新花样.
2023-8-1 21:13
查看资料  发送邮件  发短消息  网志  OICQ (744766348)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: