老文章档案 · 2003 年

汉字显示编程示例

天下资讯 · 破解文章 · 2003-10-14 · 作者:人气: · 出处:赢政天下整理收藏)

概述:

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

COL_CHAR EQU 230 ;在屏幕上第几列显示

COLOR_CHAR EQU 0EH ;显示颜色

CHARS EQU (offset disp_data_end-offset disp_data)/2CODE SEGMENT

ASSUME CS:CODE,DS:CODE

ORG 100H

START:

jmp installCC_FILE DB 'C:\UCDOS\HZK16',0 ;字库文件名,用 UCDOS 的16点阵汉字库

HANDLE DW ? ;file handleDISP_DATA DB '罗云彬' ;要显示的汉字

DISP_DATA_END EQU THIS BYTED_OPEN_ERROR DB 'File C:\UCDOS\HZK16 not found !',0dh,0ah,24hinstall:

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 20hGET_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

retGET_DOTS ENDPDISP_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 retDISP_CC ENDPZI_BUFFER EQU THIS BYTE

CODE ENDS END START(出处:赢政天下整理收藏)

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1998-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史