以前很少接触到dos, 由于工作的关系,我不得不在dos下写一些字符显示之类的程序。有些东西只有自己经历过了,才有点感触。我觉得我自己到现在以来很不自信,特别对自己的记忆力有十二分的不自信。很多东西看过了,以为就知道了。到了用得到的时候,才知道,原来自己还是一巧不通。
今天我想把过去写的汉字显示程序及英文程序记录下来,以便将来查阅。
汉字显示原理:本程序主要是查汉字库HZK16,将我们输入汉字的内码转化区位码,计算出汉字在汉字库中的偏移量。开辟一个内存,在用putpixel()打印出来汉字。
/**********************************
* 汉化显示程序
**********************************
* x, y is position.
* z is between hz and hz width
* p_hz is charater pointer.
* color is hz color
* type is hz type default is 1 ------get rid of int type,
* size is hz size default is 1 16*16
*/
void hzShow(int x, int y, int z, unsigned char *p_hz, rgb color, int size)
{
int i, j, k;
unsigned char hz16[16][2], hz24[24][3];
const unsigned char *string;
FILE *fp_hzk;
string = p_hz;
if(size == 1)
{
fp_hzk = fopen(PATH_HZK, "rb");
if(fp_hzk == NULL)
{
printf("hzk16 file can't open !");
getch();
exit(0);
}
while(*string)
{
i = *string - 0xa0;
j = *(string+1) - 0xa0;
fseek(fp_hzk, (94*(i-1)+(j-1))*32l, SEEK_SET);
fread(hz16, 32, 1, fp_hzk);
for(i=0; i<16; i++)
for(j=0; j<2; j++)
for(k=0; k<8; k++)
if((hz16[i][j] & (0x80>>k)) != NULL)
putPixel(j*8+k+x, i+y, color);
string += 2;
x = x + z + 16;
}
fclose(fp_hzk);
}
else if(size == 2)
{
fp_hzk = fopen("c://hzk2424.dat", "rb");
if(fp_hzk == NULL)
{
printf("hzk24 file can't open !");
getch();
exit(0);
}
while(*string)
{
i = *string - 0xa0;
j = *(string+1) - 0xa0;
fseek(fp_hzk, (94*(i-1)+(j-1))*72l, SEEK_SET);
fread(hz24, 72, 1, fp_hzk);
for(i=0; i<24; i++)
for(j=0; j<3; j++)
for(k=0; k<8; k++)
if((hz24[i][j] & (0x80>>k)) != NULL)
putPixel(j*8+k+x, i+y, color);
string += 2;
x = x + z + 24;
}
fclose(fp_hzk);
}
}
英文显示原理:也可以像汉字一样打印出来,但是手上没英文字库,而且字库本身固化在VIDEO ROM中。所以利用BIOS功能调用直接取得英文字库的起始地址。程序如下:
void outTextxy(int x,int y,unsigned char *ch,rgb color)
{
struct REGPACK in;
int pbp,pb;
const unsigned char *string;
unsigned char ch_ch[16][1];
unsigned char *e_addr;
int i,j,k;
string=ch;
in.r_ax=0x1130;
in.r_bx=0x0600;
intr(0x10,&in);
pbp=in.r_bp;
while(*string)
{
i=*string;
pb=i*16+pbp;
e_addr=(unsigned char*)MK_FP(0xc000,pb);
memcpy(ch_ch,e_addr,16);
for(i=0;i<16;i++)
for(j=0;j<1;j++)
for(k=0;k<8;k++)
if((ch_ch[i][j]&(0x80>>k))!=NULL)
putPixel(j*8+k+x,i+y,color);
string++;
x+=8;
}
}