汉字显示编程示例


概述:

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




(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net