一、西文文本方式下汉字显示
VGA/EGA通常带有256K VRAM,共分四个平面,每平面64K。文本方式下,偶内存地址的数据被放置于平面0中,它用于存放ASCII或汉字,奇内存地址的数据放置于平面1中(存放显示字符的属性,前四位表示背景色,后四位表示前景色)。而VGA/EGA显示的字符集(字模数据库),均放置于平面2中。我们不仅可使用其固化的ROM字库,还可以使用用户自己定义的字库。
对于VGA,平面2被分成8个8K的区域(用0-7表示其区号),可同时加装8种不同的字库;EGA则分为4个区(0-3表示其区号),可同时加装4种字库。实际上VGA/EGA文本模式下,字符的点阵信息均放置于平面2中。若我们将汉字的字模作为VGA/EGA一个字库,然后将其加装到平面2中,那么我们便可在西方文本方式下显示汉字。如,要显示汉字“我”,可先将“我”字的点阵信息取代字符C1、C2的点阵信息(汉字一般为16*16点阵,而西文字符为8*16点阵,所以一个汉字需要占两个字符位置),然后将“我”的内码更改为c1、c2,再将其输入屏幕即可。
此技术说起来非常简单,但在实际编程中有许多矛盾需要解决,标准ASCII,32-127之间的字符是可显示字符,若我们将汉字字模放置它们对应的字模处,则屏幕上发生混乱;而西文字符192-223是制表符,程序中经常用到,因此我们只能用128-191,224-255这些字符作为汉字字符的代替字,这样在屏幕上同时只能显示48个汉字。另一方面,我们在编程中还发现,若将以上的字符字模作为汉字字模区域,则汉字中总有一条空行,非常不美观,经验告诉我们,将192-223的字符作为汉字左边部分的代替字(右边随便,只要不与左同),汉字将正常显示,但此时英文制表符也会变成汉字。
解决这问题,似乎只有一个办法:将当前模式设置为图形方式,然后再取出各自的点阵信息显示在屏幕上,即可圆满解决。若这样作的话,此处“在西文文本方式下显示汉字”,也就不可谈了。
在VGA显卡中,平面2中同时加装8种不同的字库,但同一时刻,最多可使用2种字库,一个被称为字符集A,另一个被称为字符集B,因此屏幕上可同时显示512个不同的字符,这主要是由通过设置字符影射选择寄存器进行。我们可通过如下BIOS调用进行设置。
入口参数: BL=装入字符映射寄存器值
b4,b1,b0 =字库A在位平面2 中的区号
b5,b3,b2 =字库B在位平面2 中的区号*/
EGA b4,b5没用
AX=1103h
如:BL的b4,b1,b0=1,1,1 则表示字库A将选择7号区的字库。
此时,属性字节的B3位用于选择使用到的字符集(A或B,为1是使用字符集A)。若只激活一种字符集(A、B的值相同),属性字节的b3位可用作选择字符的高亮度。
现在,若我们将西文字符字库放置于平面2的n区号,中文字符字库放置于平面2的m区号(mn),便可以圆满在西文文本方式下显示中西混合字串,而且互不干涉。
这一技术处理过程如下:
1、将VGA/EGA标准西文字符集读入平面2的n区;
2、将用户含有中文字模信息的字符集读入平面2的m区(nm);
3、设置选择的AB字符集(如A选择区号为n的,B选择区号为m的)。
4、若为汉字,修改其内码,使之与其对应的字模保存处相同,如:字库偏移地址n*16(每个8*16点阵的字符字模占用16个字节),m*16处分别保存的是汉字X的左右点阵信息,则显示汉字X时,就将内码改为n,m,同时将其对应的属性b3位设置为1或0(视3步中AB选用的字库)。
二、屏幕翻译英汉字典的制作方法
UCDOS 6.0中为我们提供了一个EC.imd英中输入法文件,我们完全可以用此为英汉数据库。此文件是一个输入法驱动程序(IMD)。格式分析,笔者在《在西文方式下挂接UCDOS 5.0中的万能汉字输入》一文全面介绍过,限于篇幅,不再此复述,若读者对此感兴趣,可与笔者联系。
有了英汉字典,现在便是怎样读取屏幕上的英文单词。这是一个非常简单的问题,因为在文本模式3 中,显存地址从b800:0000处开始,字符的值存入偶地址,属性则存放在奇地址中,故坐标(x,y)处的字符便为peek(0xb800,y*160+2*x)。坐标(x,y)处屏幕上对应的英文单词,用户可参阅GetScreenWord()函数。
为了使我们的《屏幕英汉翻译字典》更具有通常性,我们有必要让用户在屏幕选择单词与自己输入单词中进行切换,另外若用户当前模式已经在中文环境下,我们没有必要用以上讲的西文文本方式下显示中文技术进行显示字串,因此我们最好要知道当前处于什么的文本模式下。
这一问题,较好的解决方法是读取0x3c5寄存器的值,若为奇数,表示当前处于中文文本方式下;为偶则表示处于西文文本方式下。因为中文文本模式下通常扫描行为8点,而西文方式下为9点。
三、程序实现
本程序利用UCDOS 6.0中的EC.IMD文件制作了一个屏幕英汉翻译字典(文件名为EC.c),用户在DOS下键入EC,便可对屏幕英语单词进行动态翻译(光标移动即选择单词)。另外,用户可通过TAB键切换到输入单词方式(再按一次,切换到屏幕翻译方式)进行动态翻译,按ESC键,则返回DOS。
若将此程序设计成TSR,便可动态在线翻译屏幕,这样便与朗道EC没有什么两样。读者不访动手试试。
VGA/EGA通常带有256K VRAM,共分四个平面,每平面64K。文本方式下,偶内存地址的数据被放置于平面0中,它用于存放ASCII或汉字,奇内存地址的数据放置于平面1中(存放显示字符的属性,前四位表示背景色,后四位表示前景色)。而VGA/EGA显示的字符集(字模数据库),均放置于平面2中。我们不仅可使用其固化的ROM字库,还可以使用用户自己定义的字库。
对于VGA,平面2被分成8个8K的区域(用0-7表示其区号),可同时加装8种不同的字库;EGA则分为4个区(0-3表示其区号),可同时加装4种字库。实际上VGA/EGA文本模式下,字符的点阵信息均放置于平面2中。若我们将汉字的字模作为VGA/EGA一个字库,然后将其加装到平面2中,那么我们便可在西方文本方式下显示汉字。如,要显示汉字“我”,可先将“我”字的点阵信息取代字符C1、C2的点阵信息(汉字一般为16*16点阵,而西文字符为8*16点阵,所以一个汉字需要占两个字符位置),然后将“我”的内码更改为c1、c2,再将其输入屏幕即可。
此技术说起来非常简单,但在实际编程中有许多矛盾需要解决,标准ASCII,32-127之间的字符是可显示字符,若我们将汉字字模放置它们对应的字模处,则屏幕上发生混乱;而西文字符192-223是制表符,程序中经常用到,因此我们只能用128-191,224-255这些字符作为汉字字符的代替字,这样在屏幕上同时只能显示48个汉字。另一方面,我们在编程中还发现,若将以上的字符字模作为汉字字模区域,则汉字中总有一条空行,非常不美观,经验告诉我们,将192-223的字符作为汉字左边部分的代替字(右边随便,只要不与左同),汉字将正常显示,但此时英文制表符也会变成汉字。
解决这问题,似乎只有一个办法:将当前模式设置为图形方式,然后再取出各自的点阵信息显示在屏幕上,即可圆满解决。若这样作的话,此处“在西文文本方式下显示汉字”,也就不可谈了。
在VGA显卡中,平面2中同时加装8种不同的字库,但同一时刻,最多可使用2种字库,一个被称为字符集A,另一个被称为字符集B,因此屏幕上可同时显示512个不同的字符,这主要是由通过设置字符影射选择寄存器进行。我们可通过如下BIOS调用进行设置。
入口参数: BL=装入字符映射寄存器值
b4,b1,b0 =字库A在位平面2 中的区号
b5,b3,b2 =字库B在位平面2 中的区号*/
EGA b4,b5没用
AX=1103h
如:BL的b4,b1,b0=1,1,1 则表示字库A将选择7号区的字库。
此时,属性字节的B3位用于选择使用到的字符集(A或B,为1是使用字符集A)。若只激活一种字符集(A、B的值相同),属性字节的b3位可用作选择字符的高亮度。
现在,若我们将西文字符字库放置于平面2的n区号,中文字符字库放置于平面2的m区号(mn),便可以圆满在西文文本方式下显示中西混合字串,而且互不干涉。
这一技术处理过程如下:
1、将VGA/EGA标准西文字符集读入平面2的n区;
2、将用户含有中文字模信息的字符集读入平面2的m区(nm);
3、设置选择的AB字符集(如A选择区号为n的,B选择区号为m的)。
4、若为汉字,修改其内码,使之与其对应的字模保存处相同,如:字库偏移地址n*16(每个8*16点阵的字符字模占用16个字节),m*16处分别保存的是汉字X的左右点阵信息,则显示汉字X时,就将内码改为n,m,同时将其对应的属性b3位设置为1或0(视3步中AB选用的字库)。
二、屏幕翻译英汉字典的制作方法
UCDOS 6.0中为我们提供了一个EC.imd英中输入法文件,我们完全可以用此为英汉数据库。此文件是一个输入法驱动程序(IMD)。格式分析,笔者在《在西文方式下挂接UCDOS 5.0中的万能汉字输入》一文全面介绍过,限于篇幅,不再此复述,若读者对此感兴趣,可与笔者联系。
有了英汉字典,现在便是怎样读取屏幕上的英文单词。这是一个非常简单的问题,因为在文本模式3 中,显存地址从b800:0000处开始,字符的值存入偶地址,属性则存放在奇地址中,故坐标(x,y)处的字符便为peek(0xb800,y*160+2*x)。坐标(x,y)处屏幕上对应的英文单词,用户可参阅GetScreenWord()函数。
为了使我们的《屏幕英汉翻译字典》更具有通常性,我们有必要让用户在屏幕选择单词与自己输入单词中进行切换,另外若用户当前模式已经在中文环境下,我们没有必要用以上讲的西文文本方式下显示中文技术进行显示字串,因此我们最好要知道当前处于什么的文本模式下。
这一问题,较好的解决方法是读取0x3c5寄存器的值,若为奇数,表示当前处于中文文本方式下;为偶则表示处于西文文本方式下。因为中文文本模式下通常扫描行为8点,而西文方式下为9点。
三、程序实现
本程序利用UCDOS 6.0中的EC.IMD文件制作了一个屏幕英汉翻译字典(文件名为EC.c),用户在DOS下键入EC,便可对屏幕英语单词进行动态翻译(光标移动即选择单词)。另外,用户可通过TAB键切换到输入单词方式(再按一次,切换到屏幕翻译方式)进行动态翻译,按ESC键,则返回DOS。
若将此程序设计成TSR,便可动态在线翻译屏幕,这样便与朗道EC没有什么两样。读者不访动手试试。

; /*响铃*/