主题:文本方式下显示汉字的源程序
qb45
[专家分:2880] 发布于 2003-10-29 09:31:00
'$INCLUDE: 'qb.bi'
CLS
DIM SHARED ax AS INTEGER, bx AS INTEGER, cx AS INTEGER, dx AS INTEGER, es AS INTEGER, bp AS INTEGER
DIM test%(64)
es = VARSEG(test%(32)) '获得缓冲区的段址
DEF SEG = es
FOR i = 1 TO 96
READ t
POKE i, t
NEXT i
DEF SEG
bp = 1
ax = &H1100
bx = &H1000
cx = 6
dx = &HCC
int10
FOR i = 0 TO 5
PRINT CHR$(&HCC + i);
NEXT i
END
DATA 0 , 32 , 19 , 16 , 0 , 7 , 240 , 16 , 17 , 16 , 23 , 16 , 20 , 24 , 16 , 3
DATA 32 , 40 , 252 , 32 , 32 , 254 , 146 , 84 , 16 , 148 , 254 , 32 , 32 , 80 , 140 , 4
DATA 2 , 1 , 63 , 32 , 64 , 31 , 0 , 0 , 1 , 255 , 1 , 1 , 1 , 1 , 5 , 2
DATA 0 , 0 , 252 , 4 , 8 , 224 , 64 , 128 , 4 , 254 , 0 , 0 , 0 , 0 , 0 , 0
DATA 16 , 16 , 35 , 34 , 74 , 251 , 18 , 34 , 67 , 246 , 74 , 3 , 26 , 226 , 66 , 2
DATA 128 , 72 , 252 , 8 , 8 , 248 , 0 , 4 , 254 , 148 , 148 , 252 , 148 , 148 , 148 , 12
SUB int10
DIM InRegs AS RegTypeX
DIM OutRegs AS RegTypeX
InRegs.ax = ax
InRegs.bx = bx
InRegs.cx = cx
InRegs.dx = dx
InRegs.es = es
InRegs.bp = bp
INTERRUPTX &H10, InRegs, OutRegs
ax = OutRegs.ax
bx = OutRegs.bx
cx = OutRegs.cx
dx = OutRegs.dx
es = OutRegs.es
bp = OutRegs.bp
END SUB
5 楼
QB71 [专家分:1300] 发布于 2004-03-19 01:48:00
'将此程序改进了一下,做成了一个过程,但是
'还是不能完成实际的功能
'希望哪位高手能够把这个功能做出来
'方便大家使用
DECLARE SUB Textp (Lx%, LY%, Text$, Bfcolor%, BkColor%)
'$INCLUDE: 'qbx.bi' '如果是 Quick Basic 4.5 的版本用 '$INCLUDE: 'qb.bi'
DEFINT A-Z
CLS
SCREEN 0, 0
tt$ = "文本模式下写汉字到屏幕功能并未完善"
Textp 2,10,tt$,4,1
end
Textp (Lx%, LY%, Text$, Bfcolor%, BkColor%)
'********************************************************************
' 文本模式下,写汉字到屏幕
' Lx% Ly% 为要写到的位置
' Text$ 是要写的汉字
' BfColor% BkColor% 是前景色和背景色
' 使用时请把UCDOS的汉字字库文件hzk16,放到同目录下
'********************************************************************
STATIC reg AS RegTypeX '定义中断类型变量
STATIC Buff%() '定义字模缓冲
STATIC Vseg% '定义字模地址变量
STATIC Lc%, hzkfile%, byte$ '定义汉字字模文件变量
IF Lc% = 0 THEN '第一次调用时初始化
Lc% = 1
REDIM Buff%(1024) '置缓冲变量
Vseg% = VARSEG(Buff%(32)) '取缓冲地址
hzkfile = FREEFILE '取打开汉字文件的一个空闲文件号
OPEN "Hzk16" FOR RANDOM AS #hzkfile LEN = 32
FIELD #hzkfile, 32 AS byte$ '置读取文件缓冲为 32 个字节
END IF
slen% = LEN(Text$)
DEF SEG = Vseg% '置字模的段地址
FOR LL% = 1 TO slen% STEP 2
L% = ASC(MID$(Text$, LL%, 1)) - 161 '取汉字区码
r% = ASC(MID$(Text$, LL%, 1)) - 160 '取汉字位码
Index% = L% * 94 + r% '取字模位置
GET #hzkfile, Index% '取字模数据
FOR i% = 1 TO 16 '写字模到内存
POKE Sum + i%, ASC(MID$(byte$, i% * 2 - 1, 1))
POKE Sum + i% + 16, ASC(MID$(byte$, i% * 2, 1))
NEXT
Sum = Sum + 32
NEXT
DEF SEG '恢复地址
Now% = Lx% * 80 + Ly% - 81
reg.ax = &H1100 '设置中断各寄存器
reg.bx = &H1000
reg.cx = 80
reg.dx = Now%
reg.es = Vseg%
reg.bp = &H1
InterruptX &H10, reg, reg '调用中断 &H10 &H11号功能
Loca% = Lx% * 160 + LY% * 2 - 162
Clr% = BkColor% * 16 + Bfcolor%
DEF SEG = &HB800 '设置文本显示段地址
'写汉字到屏幕
FOR i = 1 TO slen%
POKE Loca% + i * 2 - 2, Now% + i - 1
POKE Loca% + i * 2 - 1, Clr%
NEXT
DEF SEG
END SUB