007_house 007_house
关注数: 10 粉丝数: 4 发帖数: 722 关注贴吧数: 1
读取汉字库中的汉字 一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 UCDOS 16点字库文件的示例。 在 UCDOS 的点阵字库 HZK16 中,字符点阵是按照汉字内码排列的,汉字的内码从一些图形字符开始,起始编码为 A1A1H,汉字内码第一位为区码,每区为 94 个汉字,第二位为每区内的编码,每个汉字的点阵为 16点*16点 共32字节,数据按第一行 1-8点,9-16点,第二行 1-8点,9-16点...排列,每位数据 1 为要显示点,0 为不显示点。汉字点阵数据在字库中的偏移量为 ((区码-A1H)*94 + (区内编码-A1H))*32。 本程序为一个简单的例子,要显示的汉字在变量 DISP_DATA 中,且没有考虑汉字、英文混用的情况。源程序:; Write in May 22,1996; By LuoYunBin ----- http://asm.yeah.net .286LINE_CHAREQU210;在屏幕上第几行显示COL_CHAREQU230;在屏幕上第几列显示COLOR_CHAREQU0EH;显示颜色CHARSEQU(offset disp_data_end-offset disp_data)/2CODESEGMENTASSUME CS:CODE,DS:CODEORG 100HSTART:jmpinstallCC_FILEDB'C:\UCDOS\HZK16',0;字库文件名,用 UCDOS 的16点阵汉字库HANDLEDW?;file handleDISP_DATADB'罗云彬';要显示的汉字DISP_DATA_ENDEQUTHIS BYTED_OPEN_ERRORDB'File C:\UCDOS\HZK16 not found !',0dh,0ah,24hinstall:movax,3d00h;打开汉字库movdx,offset cc_fileint21hjnbopen_okmovah,9movdx,offset d_open_errorint21hint20hopen_ok:movhandle,axmovsi,offset disp_datamovdi,offset zi_buffermovcx,charscldins2:lodsbmovah,allodsbcallget_dots;读出汉字点针loopins2calldisp_cc;显示到屏幕int20hGET_DOTSPROCpushasubax,0a1a1h;汉字的内码从 A1区开始cwdmovdl,al;所以绝对开始区是内码-A1moval,ah;点阵在字库中的位置为cbwmovbl,94;((汉字码1-A1)* 94 + 汉字码2 - A1)* 32mulbladdax,dxmovbx,32mulbxmovcx,dxmovdx,axmovax,4200h;移动读写指针到点阵数据位置movbx,handleint21hmovah,3fhmovcx,32movdx,diint21hpopaadddi,32retGET_DOTSENDPDISP_CCPROCmovax,12h;640*480 modeint10h;设置640*480/16色显示模式movcx,charsmovsi,offset zi_buffermovbx,col_char-20;BX = columndh_lop0:addbx,20;every char column+20pushcxmovcx,16;l6 lines/charmovdx,line_char;DX = start linedh_lop1:pushbxpushcxlodsb;16 dots/linemovah,allodsbmovcx,16dh_lop2:shlax,1pushaxpushbxpushcxjcdb_colorxoral,al;back color is 0jmpshort db_drawdb_color:moval,color_chardb_draw:movah,0chmovcx,bxxorbh,bhint10hpopcxpopbxpopaxincbx;inc columnloopdh_lop2incdx;next linepopcxpopbxloopdh_lop1popcxloopdh_lop0xorah,ahint16hmovax,3int10hretDISP_CCENDPZI_BUFFEREQUTHIS BYTECODEENDSEND START
1 下一页