PC6下载站

分类分类

汉字显示编程示例

关注+2004-10-15作者:蓝点

概述:

     一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 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

    
    
     
    
    
展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消