?? hz.c
字號:
/* ------------------------------------------------------------------------
FILENAME: HZ.C
FUNCTION: Includes some basic HanZi I/O routines.
AUTHOR: Bob Kong.
DATE: ?
MODIFIED: 1995/2/16
----------------------------------------------------------------------- */
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <dos.h>
#include <string.h>
#include <fcntl.h>
#include <alloc.h>
#include <graphics.h>
#include <def.inc>
#include <func.inc>
UI EMB_HZ_handle = 0xFFFF;
static UC far *Rom_char_lib;
static UC Hzk_file_j[64] = "\\C&C08A\\DATA\\CCLIBJ.DOT";
static UC Hzk_file_f[64] = "\\C&C08A\\DATA\\CCLIBF.DOT";
static UC hz_str_type=1; /* 16 pixel */
//#define WIN_LEFT 8
#define WIN_RIGHT 632
int winleft,left,right;
UC win_prn_flag;
/* ============================= load_char_lib =========================== */
void load_char(void)
{
static UI keep_es1,keep_es2,keep_bp1,keep_bp2;
keep_es1 = _ES;
keep_bp1 = _BP;
_AX = 0x1130;
_BH = 0x06;
geninterrupt(0x10);
keep_bp2 = _BP;
keep_es2 = _ES;
_BP = keep_bp1;
_ES = keep_es1;
Rom_char_lib = MK_FP(keep_es2, keep_bp2);
}
void set_hzk_file(UC *file_j, UC *file_f)
{
if (file_j!=NULL && *file_j!='\0')
strcpy(Hzk_file_j, file_j);
if (file_f!=NULL && *file_f!='\0')
strcpy(Hzk_file_f, file_f);
}
/* ------------------------------------------------------------------------
FUNCTION: Load the Chinese characters' library to the extened memory.
CALLS:
CALLED BY:
INPUT: None.
OUTPUT: None.
RETURN: 0 -- Load successfully.
1 -- No enough extened memory.
2 -- File \C&C08A\DATA\CCLIB.DOT not exist.
3 -- No enough temp memory.
4 -- Error reading file \C&C08A\DATA\CCLIB.DOT .
5 -- Error accessing extened memory.
------------------------------------------------------------------------- */
UC load_hzk(UC hz_style)
{
UC * tmp_buf;
UI tmp_handle;
UI bytes;
UC loopi;
if ( EMB_size()<250 )
return 1; /* Not enough EMB memory */
EMB_HZ_handle = EMB_alloc(250);
if (EMB_HZ_handle==0xFFFF)
return 1; /* Not enough EMB memory */
if (hz_style == 1)
tmp_handle = open(Hzk_file_j, O_BINARY|O_RDONLY);
else
tmp_handle = open(Hzk_file_f, O_BINARY|O_RDONLY);
if (tmp_handle==0xffff)
return 2;
tmp_buf = (UC *)farmalloc(65536L);
if (tmp_buf==NULL)
{
close(tmp_handle);
return 3;
}
bytes = 10*94*32;
for (loopi=0; loopi<8; loopi++)
{
if (read(tmp_handle, (UC *)tmp_buf, bytes)==-1)
{
farfree(tmp_buf);
close(tmp_handle);
return 4;
}
if (EMB_write(EMB_HZ_handle, (UL)bytes*loopi, tmp_buf, bytes)!=0)
{
farfree(tmp_buf);
close(tmp_handle);
return 5;
}
}
bytes = 94*32;
if (read(tmp_handle, (UC *)tmp_buf, bytes)==-1)
{
farfree(tmp_buf);
close(tmp_handle);
return 4;
}
if (EMB_write(EMB_HZ_handle, (UL)bytes*80L, tmp_buf, bytes)!=0)
{
farfree(tmp_buf);
close(tmp_handle);
return 5;
}
farfree(tmp_buf);
close(tmp_handle);
return 0;
}
/* =========================== unload_hzk() ============================= */
void unload_hzk(void)
{
if ( EMB_HZ_handle!=0xFFFF )
EMB_free(EMB_HZ_handle);
}
/* =============================== hz_24 ================================ */
/*
void hz_24(UC hz_No,UI pox,UI poy,UC color)
{
UC i,k;
UC dot_byte,count;
UC far *dot_here;
static UC bit_map[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
dot_here = hz24k_buf+hz_No*72;
set_dot_mode(color);
count=3;
for (i=0;i<72;i++)
{
dot_byte = *(dot_here++);
for (k=0;k<8;k++)
{
if ( (dot_byte & bit_map[k]) )
pixel(pox,poy);
poy++;
}
if (--count==0)
{
pox++;
poy-=24;
count=3;
}
}
reset_dot_mode();
}
*/
/*************************************************************
* hz_enlarge(...) handle a 32-pots chinese *
* UC hz_enlarge(UC *hz_dot,UC *hz_dot0,UC loop0) *
* CALLS : none *
* CALLED BY : hz_16(...) *
* AUTHOR : LI CHENG *
* DATE : 20/09/94 *
*************************************************************/
void hz_enlarge(UC *hz_dot, UC *hz_dot0, UC loop0)
{
UC dot0, dot1;
UC loop1, loop2;
memset(hz_dot,0,32);
for(loop2=0;loop2<8;loop2++)
{
for(loop1=0;loop1<4;loop1++)
{
switch(loop0)
{
case 0:
dot0=(( hz_dot0[loop2*2]>>(loop1+4))& 0x01)<<loop1*2;
dot1=(( hz_dot0[loop2*2]>> loop1) & 0x01)<<loop1*2;
break;
case 1:
dot0=(( hz_dot0[16+loop2*2]>>(loop1+4))& 0x01)<<loop1*2;
dot1=(( hz_dot0[16+loop2*2]>> loop1) & 0x01)<<loop1*2;
break;
case 2:
dot0=(( hz_dot0[loop2*2+1]>>(loop1+4))& 0x01)<<loop1*2;
dot1=(( hz_dot0[loop2*2+1]>> loop1) & 0x01)<<loop1*2;
break;
case 3:
dot0=(( hz_dot0[16+loop2*2+1]>>(loop1+4))& 0x01)<<loop1*2;
dot1=(( hz_dot0[16+loop2*2+1]>> loop1) & 0x01)<<loop1*2;
break;
default :
break;
}
dot0 *= 0x03;
hz_dot[loop2*4] |= dot0;
dot1 *= 0x03;
hz_dot[loop2*4+1] |= dot1;
}
hz_dot[loop2*4+2] = hz_dot[loop2*4];
hz_dot[loop2*4+3] = hz_dot[loop2*4+1];
}
}
/*************************************************************
* str_enlarge(...) handle a 32-pots chinese *
* UC hz_enlarge(UC *str_dot,UC *str_dot0,UC loop0) *
* CALLS : none *
* CALLED BY : str_16(...) *
* AUTHOR : LI CHENG *
* DATE : 20/09/94 *
*************************************************************/
void str_enlarge(UC *str_dot, UC *str_dot0, UC loop0)
{
UC dot0;
UC loop1, loop2;
memset(str_dot,0,16);
for(loop2=0;loop2<8;loop2++)
{
for(loop1=0;loop1<4;loop1++)
{
switch(loop0)
{
case 0:
dot0=(( str_dot0[loop2]>>(loop1+4)) & 0x01) << loop1*2;
break;
case 1:
dot0=(( str_dot0[8+loop2]>>(loop1+4))& 0x01) << loop1*2;
break;
case 2:
dot0=(( str_dot0[loop2]>> loop1) & 0x01) << loop1*2;
break;
case 3:
dot0=(( str_dot0[8+loop2]>> loop1) & 0x01) << loop1*2;
break;
default :
break;
}
dot0 *= 0x03;
str_dot[loop2*2] |= dot0;
}
str_dot[loop2*2+1] = str_dot[loop2*2];
}
}
/*************************************************************
* hz_16 dsplay a 16-pots or 32-pots chinese. *
* UC hz_16(UC asc_code, UI pox, UI poy,UC color) *
* CALLS : hz_enlarge(UC*,UC*,UC) *
* CALLED BY : *
* AUTHOR : *
* DATE : *
* MODIFY : LI CHENG *
* DATE : 20/09/94 *
*************************************************************/
void hz_16 (UC qh, UC wz, UI pox, UI poy, UC color)
{
UC loop, loop0;
UI pox0,poy0;
UC inner_pos;
UC dot_byte[2];
UC hz_dot0[32],hz_dot[32];
if (qh==0 || wz==0) return;
if (qh>87 || wz>94) return;
if (qh>9 && qh<16) return;
if ( qh>15 ) qh -= 6;
EMB_read(hz_dot0, EMB_HZ_handle, (--qh)*94*32L+(--wz)*32L, 32);
set_dot_mode(color);
for ( loop0=0; loop0<4; loop0++)
{
if ( hz_str_type == 2)
hz_enlarge(hz_dot,hz_dot0,loop0);
else
memcpy(hz_dot,hz_dot0,32);
pox0 = pox + (loop0/2)*16;
poy0 = poy + (loop0%2)*16;
inner_pos = pox0 - ( (pox0 >> 3) << 3);
for (loop=0; loop<16; loop++)
{
dot_byte[0] = hz_dot[loop*2] >> inner_pos;
dot_byte[1] = hz_dot[loop*2] << (8-inner_pos);
if (win_prn_flag)
{
if ((pox0-left*8) >= winleft &&
(pox0-left*8) <= (WIN_RIGHT-8))
pixels(pox0-left*8, poy0+loop, dot_byte, 2);
else break;
}
else
pixels(pox0, poy0+loop, dot_byte, 2);
}
for (loop=0; loop<16; loop++)
{
dot_byte[0] = hz_dot[loop*2+1] >> inner_pos;
dot_byte[1] = hz_dot[loop*2+1] << (8-inner_pos);
if (win_prn_flag)
{
if ((pox0-left*8+8) >= winleft &&
(pox0-left*8+8) <= (WIN_RIGHT-8))
pixels(pox0-left*8+8, poy0+loop, dot_byte, 2);
else break;
}
else
pixels(pox0+8, poy0+loop, dot_byte, 2);
}
if ( hz_str_type == 1 )
break;
}
reset_dot_mode();
}
/*
void hz_16(UC qh, UC wz, UI pox, UI poy, UC color)
{
UC loop;
UC temp;
UI ttt;
UC inner_pos;
UC dot_byte[3];
UC hz_dot[32];
if (qh==0 || wz==0) return;
if (qh>87 || wz>94) return;
if (qh>9 && qh<16) return;
if ( qh>15 ) qh -= 6;
EMB_read(hz_dot, EMB_HZ_handle, (--qh)*94*32L+(--wz)*32L, 32);
set_dot_mode(color);
inner_pos = pox - ( (pox>>3)<<3);
for (loop=0; loop<16; loop++)
{
temp = loop<<1;
dot_byte[0] = hz_dot[temp]>>inner_pos;
ttt = (hz_dot[temp]<<8) | hz_dot[temp+1];
ttt <<= 8-inner_pos;
dot_byte[1] = ttt >> 8;
dot_byte[2] = ttt & 0x00FF;
pixels(pox, poy+loop, dot_byte, 3);
}
reset_dot_mode();
}
*/
/*************************************************************
* char_16 dsplay report and output printer *
* UC char_16(UC asc_code, UI pox, UI poy,UC color) *
* CALLS : none *
* CALLED BY : *
* AUTHOR : *
* DATE : *
* MODIFY : LI CHENG *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -