PC机的简易汉卡

🏠 首页 《无线电》杂志 1994年 🔗 第5期 🔗 第30页 分类:无线电技术自学经验交流 🔗 钱忠慈 🔗

(钱忠慈)简易汉卡是一种使用EPROM或者MaskROM芯片制成的汉字字模库的硬卡。其电路结构比较简单,只是将计算机扩充一个ROM存储区,需用时就将这种存储汉字点阵信息的ROM存储器通过读出检测电路读入系统使用。

一、电路原理

本电路汉字字模库采用MaskROM芯片,型号为GB5199B,该芯片是16×16汉字字模库,固化了一二级汉字和常用符号,容量为256KB,也可用型号为27020的2M位EPROM烧写的字模库代替GB5199B,本汉卡电路的核心问题是怎样把字库接到计算机内存地址中,使汉卡成为计算机的一个ROM存储区。由于GB5199B的容量为256KB,需要占用计算机内256KB地址范围,而PC机内大部分地址都被RAM占用,只有C0000H至DFFFFH地址范围可以为外设所利用,又由于硬盘等外设占用一部分,因此只能把字库分成若干页,以缩小占用机内的地址范围。为了使电路简单,本汉卡选择把GB5199B分成256页,D5C00H至D5FFFH的1K地址范围作为汉卡所占用的地址,这样,在1K地址范围内,通过页选择,就可以把GB5199B的全部内容分页读到系统中。该汉卡电路见附图,电路分为两部分,一部分是地址译码电路,译该汉卡占用的机内地址范围;另一部分是数据通过2F4H口输出选择IC2的页。IC3∶C和IC5组成的一个译码电路,当地址范围为D5C00H至D5FFFH时,IC5第8脚输出一个低电位,在MEMR信号为低电位时,IC2被选通,该芯片工作在该1K地址范围内。由IC3:B、IC3:C和IC4组成一个2F4H口地址译码电路,当需要选择IC2的页时,只要选通2F4H口,此时IC4第8脚输出一个低电位,数据总线发来的数据就能通过IC1锁存到输出端,做为IC2的地址,达到选择页的目的。

图1
图1 🔍原图 (1195×1359)

二、软件编制

由于该简易汉卡只是一个字模为16×16字库的硬卡,我们可以用这个硬卡字库去替换一些经常使用的中文系统中的软字库,从而节省计算机256KB内存,使这些中文系统在一些简易的没有硬盘的家用电脑中使用起来更方便。如何运用汉卡中的字库去替换磁盘中的软字库呢?只需编写一个汉卡驱动程序替换原中文系统中的某个文件,例如:CCDOS2.10、CCDOS2.13H中的FILE1文件;王码4.0中的DAO文件,这些文件的作用是检查软字库CCLIB在磁盘上的完好性,为汉字库申请内存。由于使用汉卡,该文件就没有使用意义。所编程序内容见附表,其主程序是识别汉卡,设置7FH中断,7FH中断的内容是把汉字内码转换为字库的页号,通过2F4H口输出以确定选择字库相应的页,并根据内码确定汉字在页内确切地址,把所选中的汉字放入缓冲区。因此,使用汉卡后可以删掉FILE1或DAO以及字库CCLIB文件。除此之外还需修改原系统中的CC-CC或ZHENG文件,把原程序中的汉字内码到字模变换处的内容用所编7FH中断代替,原程序中读字库到内存部分用跳转语句跳过。

例:用DEBUG程序去修改CCDOS2.10的CC-CC文件,把地址CS:2A6C处开始的内容改为CD、7F、C3;地址CS:ADC6处的内容改为EB、3D。

西山CCDOS5.21中的CCLIB文件不仅检查软字库CCLIB文件在磁盘上的完好性,同时在没有硬盘的情况下,把字库装入基本内存,因此,用所编程序就无法替换SPLIB文件,我们只能直接修改SPLIB文件,用所编的7FH中断内容去替换SPLIB文件中的1F中断内容,再用跳转语句跳过读字库到内存部分内容,虽然省略了查询汉卡是否存在那部分内容,但并不影响使用,如果用以上的办法把常用的中文系统经过简单改动,使汉卡能适应多种常用的中文系统,使用起来会更方便。
yLBy

附表 源程序HANKA.ASM

PAGE 60,100

TITLE HANKA***宣武青少年科技馆***

;————————————————

CODESG SEGMENT PARA’CODE’

ASSUME CS:CODESG,DS:CODESG

DATA1 EQU 1FH

DATA2 DW 2F4H

DATA3 DW 0D5C0H

DATA4 DB ’Chinese Card Not exist $’

HANKA PROC FAR

START:

PUSH CS

POP DS

PUSH ES

MOV AX,0D5C0H

MOV ES,AX ;ES中存放汉卡机内地址

MOV AL,34H

MOV DX,2F4H ;选通字库第52页

OUT DX,AL

MOV AX,880H ;用80和08两个数据

CMP ES:DATA1,AX ;和字库1FH地址处内容比较

JNE LOC1 ;若不等转显示缺汉卡错误

JMP SHORT LOC2 ;若等转设置7FH中断向量

LOC1:

MOV DX,OFFSET DATA4;显示没有汉卡的错误

MOV AH,9

INT 21H

MOV AX,4C00H;终止进程

INT 21H

LOC2:

POP ES

MOV AX,CODESG

MOV DS,AX

MOV DX,OFFSET INT_7FH;置7FH中断向量

MOV AX,257FH

INT 21H

MOV DX,400H ;结束并驻留内存

INT 27H

HANKA ENDP

;———————————————————

ORG 100H

DATA5 DB 32 DUP(0)

int_7fh PROC FAR ;7FH中断

PUSH AX

PUSH BX

PUSH CX

PUSH DI

PUSH SI

PUSH DS

PUSH ES

PUSH BP

PUSH CS

POP DS

PUSH DI

PUSH BX

PUSH CX;DX 中存放从键盘输入的汉字内码

AND DX,7F7FH;把汉字内码转换成国标码

PUSH SI

SUB DX,212lH;以下是把国标码变成汉字和符号

CMP DH,0EH ;连续存放的页号和地址

JBE LOC_1

SUB DH,OPH

JMP LOC_4

LOC_3:

ADD DH,48H

LOC_4:

MOV AL,5EH

MUL DH

XOR DH,DH

ADD AX,DX

PUSH AX;以下找出页号

SHR AX,1

SHR AX,1

SHR AX,1

SHR AX,1

SHR AX,1

MOV DX,CS:DATA2

OUT DX,AL;启动汉卡相应的页数地址

POP SI ;以下找出地址

AND SI,1FH

SHL SI,1

SHL SI,1

SHL SI,1

SHL SI,1

SHL SI,1

MOV AX,CS:DATA3

MOV DI,OFFSET DATA5 ;设置32个字书的缓冲区

PUSH DS

PUSH ES

PUSH CS

POP ES

MOV DS,AX

MOV CX,10H

LOC_5:

LODSW ;把汉字字模存入缓冲区内

STOSW

LLP

P

P

P

P

P

POP DI

LEA DX,CS:DATA5

MOV CL,4

SHR DX,CL

ADD DX,C

P

P

P

P

P

P

P

P

IRET

int_7fhENDP

;————————————————

CODESG ENDS

END START