该楼层疑似违规已被系统折叠隐藏此楼查看此楼
一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读UCDOS16点字库文件的示例。
在UCDOS的点阵字库HZK16中,字符点阵是按照汉字内码排列的,汉字的内码从一些图形字符开始,起始编码为A1A1H,汉字内码第一位为区码,每区为94个汉字,第二位为每区内的编码,每个汉字的点阵为16点*16点共32字节,数据按第一行1-8点,9-16点,第二行1-8点,9-16点...排列,每位数据1为要显示点,0为不显示点。汉字点阵数据在字库中的偏移量为((区码-A1H)*94+(区内编码-A1H))*32。
本程序为一个简单的例子,要显示的汉字在变量DISP_DATA中,且没有考虑汉字、英文混用的情况。
源程序:
;WriteinMay22,1996
;ByLuoYunBin-----
.286
LINE_CHAREQU210;在屏幕上第几行显示
COL_CHAREQU230;在屏幕上第几列显示
COLOR_CHAREQU0EH;显示颜色
CHARSEQU(offsetdisp_data_end-offsetdisp_data)/2
CODESEGMENT
ASSUMECS:CODE,DS:CODE
ORG100H
START:
jmpinstall
CC_FILEDB'C:\UCDOS\HZK16',0;字库文件名,用UCDOS的16点阵汉字库
HANDLEDW?;filehandle
DISP_DATADB'罗云彬';要显示的汉字
DISP_DATA_ENDEQUTHISBYTE
D_OPEN_ERRORDB'FileC:\UCDOS\HZK16notfound!',0dh,0ah,24h
install:
movax,3d00h;打开汉字库
movdx,offsetcc_file
int21h
jnbopen_ok
movah,9
movdx,offsetd_open_error
int21h
int20h
open_ok:
movhandle,ax
movsi,offsetdisp_data
movdi,offsetzi_buffer
movcx,chars
cld
ins2:
lodsb
movah,al
lodsb
callget_dots;读出汉字点针
loopins2
calldisp_cc;显示到屏幕
int20h
GET_DOTSPROC
pusha
subax,0a1a1h;汉字的内码从A1区开始
cwd
movdl,al;所以绝对开始区是内码-A1
moval,ah;点阵在字库中的位置为
cbw
movbl,94;((汉字码1-A1)*94+汉字码2-A1)*32
mulbl
addax,dx
movbx,32
mulbx
movcx,dx
movdx,ax
movax,4200h;移动读写指针到点阵数据位置
movbx,handle
int21h
movah,3fh
movcx,32
movdx,di
int21h
popa
adddi,32
ret
GET_DOTSENDP
DISP_CCPROC
movax,12h;640*480mode
int10h;设置640*480/16色显示模式
movcx,chars
movsi,offsetzi_buffer
movbx,col_char-20;BX=column
dh_lop0:
addbx,20;everycharcolumn+20
pushcx
movcx,16;l6lines/char
movdx,line_char;DX=startline
dh_lop1:
pushbx
pushcx
lodsb;16dots/line
movah,al
lodsb
movcx,16
dh_lop2:
shlax,1
pushax
pushbx
pushcx
jcdb_color
xoral,al;backcoloris0
jmpshortdb_draw
db_color:
moval,color_char
db_draw:
movah,0ch
movcx,bx
xorbh,bh
int10h
popcx
popbx
popax
incbx;inccolumn
loopdh_lop2
incdx;nextline
popcx
popbx
loopdh_lop1
popcx
loopdh_lop0
xorah,ah
int16h
movax,3
int10h
ret
DISP_CCENDP
ZI_BUFFEREQUTHISBYTE
CODEENDS
ENDSTART