概述:
一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 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
.286
LINE_CHAR EQU 210 ;在屏幕上第几行显示
COL_CHAR EQU 230 ;在屏幕上第几列显示
COLOR_CHAR EQU 0EH ;显示颜色
CHARS EQU (offset disp_data_end-offset disp_data)/2
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
START:
jmp install
CC_FILE DB 'C:\UCDOS\HZK16',0 ;字库文件名,用 UCDOS 的16点阵汉字库
HANDLE DW ? ;file handle
DISP_DATA DB '罗云彬' ;要显示的汉字
DISP_DATA_END EQU THIS BYTE
D_OPEN_ERROR DB 'File C:\UCDOS\HZK16 not found !',0dh,0ah,24h
install:
mov ax,3d00h ;打开汉字库
mov dx,offset cc_file
int 21h
jnb open_ok
mov ah,9
mov dx,offset d_open_error
int 21h
int 20h
open_ok:
mov handle,ax
mov si,offset disp_data
mov di,offset zi_buffer
mov cx,chars
cld
ins2:
lodsb
mov ah,al
lodsb
call get_dots ;读出汉字点针
loop ins2
call disp_cc ;显示到屏幕
int 20h
GET_DOTS PROC
pusha
sub ax,0a1a1h ;汉字的内码从 A1区开始
cwd
mov dl,al ;所以绝对开始区是内码-A1
mov al,ah ;点阵在字库中的位置为
cbw
mov bl,94 ;((汉字码1-A1)* 94 + 汉字码2 - A1)* 32
mul bl
add ax,dx
mov bx,32
mul bx
mov cx,dx
mov dx,ax
mov ax,4200h ;移动读写指针到点阵数据位置
mov bx,handle
int 21h
mov ah,3fh
mov cx,32
mov dx,di
int 21h
popa
add di,32
ret
GET_DOTS ENDP
DISP_CC PROC
mov ax,12h ;640*480 mode
int 10h ;设置640*480/16色显示模式
mov cx,chars
mov si,offset zi_buffer
mov bx,col_char-20 ;BX = column
dh_lop0:
add bx,20 ;every char column+20
push cx
mov cx,16 ;l6 lines/char
mov dx,line_char ;DX = start line
dh_lop1:
push bx
push cx
lodsb ;16 dots/line
mov ah,al
lodsb
mov cx,16
dh_lop2:
shl ax,1
push ax
push bx
push cx
jc db_color
xor al,al ;back color is 0
jmp short db_draw
db_color:
mov al,color_char
db_draw:
mov ah,0ch
mov cx,bx
xor bh,bh
int 10h
pop cx
pop bx
pop ax
inc bx ;inc column
loop dh_lop2
inc dx ;next line
pop cx
pop bx
loop dh_lop1
pop cx
loop dh_lop0
xor ah,ah
int 16h
mov ax,3
int 10h
ret
DISP_CC ENDP
ZI_BUFFER EQU THIS BYTE
CODE ENDS
END START
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 去除winrar注册框方法
最新文章
比特币病毒怎么破解 比去除winrar注册框方法
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据
人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程
查看所有0条评论>>