#include    <stdio.h>
#include    <ctype.h>
#include    "defs.h"
/* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
#include    <dos.h>
#include    <fmcfrb.h>
#include    <kkstr2.h>
extern char	*work;
#define NOERR   0
#define EGBERR  -1
#define MOSERR  -2
#define KANERR  -3

UCHAR modeW = 0x14;

/******
#include    "oaklib.h" 
******/
/* ---------------------------------------------------------- */

#define	MAX_MAC	512

extern char	*Act_vram();
extern void	wrtstr();
extern void	memcpy();
extern void	memset();
extern int	strlen();
extern void	locate();
extern void	Dsp_box_vram();
extern char	*SPCSTR;

short  ReWrt_flg=FALSE;

static struct _MACRO {
       int      mc_ch;
       unsigned mc_ec;
    } mac_key[MAX_MAC+1];
static int	mac_cnt=0;
static int	mac_max=0;
static int	mac_flg=0;

static int   	ch_bak;
static unsigned ec_bak;
static int   	hit_flg=FALSE;

/* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
/*******************
void	putmode(int md,int sf,char *str)
{
    wrtstr(str,71,MENU_Y,0x1F);
}
void	putsys(int len,char *str,char *att)
{
    int     n,Bak_X,Bak_Y;
    char    *vp;
    static int     Bak_len=0;
    static char    *Bak_vp=NULL;
    static char    Bak_vram[160];

    Bak_X = Cur_X; Bak_Y = Cur_Y;
    Cur_X = 0 ; Cur_Y = MENU_Y-OFF_Y;

    if ( Bak_len > 0 )
	memcpy(Bak_vp,Bak_vram,Bak_len * 2);

    Bak_vp = Act_vram();
    memcpy(Bak_vram,Bak_vp,len * 2);

    n = len;
    vp = Bak_vp;
    while ( n-- > 0 ) {
	*(vp++) = (*(att++) & 0x0F) | 0x38;
	if ( iskanji((UCHAR)*str) ) {
	    *(vp-1) |= 0x40;
	    *(vp++) = *(str++);
	    *(vp++) = (*(att++) & 0x0F) | 0x80;
	    *(vp++) = *(str++);
	    n--;
	} else
	    *(vp++) = *(str++);
    }

    Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);

    Bak_len = len;
    Cur_X = Bak_X; Cur_Y = Bak_Y;
}

void	putstr(int pos,int len,char *str,char *att)
{
    int     n;
    char    *vp;
    static int     Bak_len=0;
    static char    *Bak_vp=NULL;
    static char    Bak_vram[160];

    if ( Bak_len > 0 )
	memcpy(Bak_vp,Bak_vram,Bak_len * 2);

    Bak_vp = Act_vram();
    memcpy(Bak_vram,Bak_vp,len * 2 + 2);

    vp = Bak_vp;
    for ( n = 0 ; n < len ; n++ ) {
	*(vp++) = (*(att++) & 0x0F) | (n == pos ? 0x30 : 0x38);
	if ( iskanji((UCHAR)*str) ) {
	    *(vp-1) |= 0x40;
	    *(vp++) = *(str++);
	    *(vp++) = (*(att++) & 0x0F) | 0x80;
	    *(vp++) = *(str++);
	    n++;
	} else
	    *(vp++) = *(str++);
    }
    if ( len > 0 && n == pos ) {
	*vp |= 0x17;
	len++;
    }

    Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
    Bak_len = len;
}
void	Ent_sub(sw)
int	sw;
{
    char     bk,*vp;

    vp = (char *)Act_vram();
    if ( sw == FALSE ) {
	*vp &= 0xDF;
        Dsp_box_vram(1,0x07);
    } else {
	bk = *vp;
	*vp = (*vp & 0xC0) | 0x3C;
        Dsp_box_vram(1,0x07);
	*vp = bk;
    }
}
void	Ent_tango(arg)
char	*arg;
{
    int     i,j,ch,sc;
    unsigned ec;
    int     Ent_X,Ent_Y;
    int     Bak_X,Bak_Y;
    char    *vp,*Ent_vp,*End_vp;
    char    att[80];

    Bak_X = Cur_X; Bak_Y = Cur_Y;
    Ent_sub(TRUE);
    *arg = '\0';

    memset(att,0x00,10);
    memset(att + 10,0x01,53);
    putsys(63,
    	   "単語登録  登録位置にカ−ソルを移動して実行キ−を押してください ",
	   att);

    for ( ; ; ) {
	ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
	Ent_sub(FALSE);
	if ( sc == 0x4F ) {
	    if ( --Cur_X < 0 )
	        Cur_X = MAX_X - 1;
    	    vp = (char *)Act_vram();
	    if ( (*vp & 0x80) != 0 && Cur_X > 0 )
		Cur_X--; 
	} else if ( sc == 0x51 && ++Cur_X >= MAX_X )
	    Cur_X = 0;
	else if ( sc == 0x4D && --Cur_Y < 0 )
	    Cur_Y = MENU_Y - 3;
	else if ( sc == 0x50 && ++Cur_Y > (MENU_Y - 3) )
	    Cur_Y = 0;
	else if ( sc == 0x72 )
	    goto ENDOF;
	else if ( sc == 0x73 )
	    break;
    	vp = (char *)Act_vram();
	if ( (*vp & 0x80) != 0 && Cur_X < (MAX_X - 1) )
	    Cur_X++;
	Ent_sub(TRUE);
    }

    Ent_X = Cur_X; Ent_Y = Cur_Y; 
    Ent_vp = (char *)Act_vram();

    putsys(36,
    	   "単語登録  登録範囲を指定してください",
	   att);

    Cur_X = Ent_X ; Cur_Y = Ent_Y;

    for ( ; ; ) {
	ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
	if ( sc == 0x4F ) {
	    vp = (char *)Act_vram();
	    if ( vp > Ent_vp ) {
		if ( --Cur_X < 0 ) {
		    Cur_X = MAX_X - 1;
		    if ( Cur_Y > 0 )
			Cur_Y--;
		}
		vp = (char *)Act_vram();
		if ( Cur_X > 0 && (*vp & 0x80) != 0 )
		    Cur_X--;
		Ent_sub(FALSE);
	    }
	} else if ( sc == 0x51 ) {
	    Ent_sub(TRUE);
	    vp = (char *)Act_vram();
	    if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
		Cur_X += 2;
	    else
		Cur_X++;
	    if ( Cur_X >= MAX_X ) {
		Cur_X -= MAX_X;
		if ( ++Cur_Y > (MENU_Y - 3) )
		    Cur_Y = MENU_Y - 3;
	    }
	} else if ( sc == 0x72 )
	    goto CLROF;
	else if ( sc == 0x73 )
	    break;
    }
    End_vp = (char *)Act_vram();
    for ( vp = Ent_vp ; vp < End_vp ; vp+=2 ) {
	if ( (unsigned char)(*(arg++) = *(vp+1)) < ' ' )
	    *(arg-1) = ' ';
    }
    *arg = '\0';
CLROF:
    i = Cur_X; j = Cur_Y;
    Cur_X = Ent_X; Cur_Y = Ent_Y;
    for ( ; ; ) {
	Ent_sub(FALSE);
	vp = (char *)Act_vram();
	if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
	    Cur_X += 2;
	else
	    Cur_X++;
	if ( Cur_X >= MAX_X ) {
	    Cur_X -= MAX_X;
	    if ( ++Cur_Y > (MENU_Y - 3) )
		Cur_Y = MENU_Y - 3;
	}
	if ( Cur_Y >= j && Cur_X >= i )
	    break;
    }
ENDOF:
    Cur_X = Bak_X; Cur_Y = Bak_Y;
    locate();
}
void	Tango_Touroku()
{
    int     len;
    char    tmp[160];

    Ent_tango(tmp);
    if ( (len = strlen(tmp)) > 0 )
	KAN_touroku(len,tmp);
    putsys(0,"","");
}
*******/
/* ---------------------------------------------------------- */
/******************* Debug Code *******************
void	deb_dsp(ch,ec)
int	ch,ec;
{
    char tmp[40];

    sprintf(tmp,"CH=%04X EC=%04X",ch,ec);
    wrtstr(tmp,0,0,0x1F);
}
****************************************************/

void	mac_save()
{
    switch(mac_flg) {
    case 0: case 2:
	mac_flg = 1;
	mac_max = 0;
	wrtstr("只今キ−マクロを定義中です",30,1,0x15);
	break;
    case 1:
	mac_flg = 2;
	mac_cnt = 0;
	mac_max--;
	wrtstr(SPCSTR,30,1,0x1F);
	break;
    }
}
void	mac_go()
{
    if ( mac_flg == 2 ) {
	mac_flg = 3;
	mac_cnt = 0;
    }
}
int	kbhit()
{
    if ( hit_flg != FALSE )
	return 1;

    if ( mac_flg == 3 ) {
	if ( mac_cnt < mac_max ) {
	    hit_flg = TRUE;
	    ch_bak = mac_key[mac_cnt].mc_ch;
	    ec_bak = mac_key[mac_cnt].mc_ec;
	    mac_cnt++;
	    return 1;
	} else {
	    mac_flg = 2;
	    mac_cnt = 0;
	}
    }

    while ( (ch_bak = KAN_read(1,&ec_bak)) != 0xFFFF ) {
	if ( ch_bak & 0x8000 || (ec_bak & 0xFF00) > 0x5100 )
	    ch_bak = 0xFFFF;
	switch(ec_bak & 0xFF00) {
	case 0xFF00:
	    break;

/* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
/************
	case 0x6D00:
	    Tango_Touroku();
	    break;
**********/
/* ---------------------------------------------------------- */

	default:
	    hit_flg = TRUE;
	    if ( mac_flg == 1 && mac_max < MAX_MAC ) {
		mac_key[mac_max].mc_ch = ch_bak;
		mac_key[mac_max].mc_ec = ec_bak;
		mac_max++;
	    }
	    return 1;
	}
    }

    return 0;
}
int	Get_key(ec)
unsigned *ec;
{
    while ( kbhit() == 0 );
    hit_flg = FALSE;
    *ec = ec_bak & 0xFF14;
    return ch_bak;
}
int	getch()
{
    int       ch;
    unsigned  ec;

    while ( (ch = Get_key(&ec)) == 0xFFFF );
    return ch;
}

/* ------------------ OAK4 91.12.28 Pumpkin ----------------- */

/*********************************
  かな漢ライブラリの初期化
*********************************/
int kanainit( int sw)
{
    KANJ    kana;
    union REGS	regs;
    int     col[16];
    extern  void GetString( char *);
    extern  void GetDspPos( int *, int *);

    kana.scrn   = KAN_SCRN16;
    kana.egbw   = work;
    kana.wPage  = 0;
    kana.mosAp  = KAN_MOSOFF;
    kana.gets   = GetString;
    kana.getPos = GetDspPos;
    kana.maxX   = 639;
    kana.maxY   = 479;

    if( KAN_prepare( &kana) != KAN_NOERR)
        return KANERR;

    /*  従来のＷＩＮＫライクなカラーテーブルの設定 */
    col[ 0] = 0x0f;
    col[ 1] = 0x01;
    col[ 2] = 0x02;
    col[ 3] = 0x03;
    col[ 4] = 0x04;
    col[ 5] = 0x05;
    col[ 6] = 0x06;
    col[ 7] = 0x07;
    col[ 8] = 0x08;
    col[ 9] = 0x09;
    col[10] = 0x0a;
    col[11] = 0x0b;
    col[12] = 0x04;
    col[13] = 0x06;
    col[14] = 0x03;
    col[15] = 0x01;
    if( KAN_setClrTbl( col) != KAN_NOERR)
        return KANERR;

    KAN_disp(KAN_DISPON);

    /* 入力モード設定 */

    if (sw != FALSE) {
    	regs.h.ah = 0x02;
    	regs.h.al = modeW;
    	int86(0xec,&regs,&regs);
    }
    return NOERR;
}
/*********************************
  かな漢ライブラリの終了
*********************************/
void kanaend()
{
    KAN_disp( KAN_DISPOFF);
    KAN_finish();
}
/*************************************
  単語登録文字列取得ルーチン
**************************************/
void GetString( char *code)
{

    int     len,i;
    char    t[81],*vp;

    vp = Act_vram(); len = 0;
    for ( i=0 ; i < 80 ; vp+=2,i++ ) {
	if ( (unsigned char)(t[i] = *(vp+1)) < ' ' ) t[i] = ' ';
    }
    t[i] = '\0';

    /*   文字列の長さ分だけｺﾋﾟｰし､残りは'\0'で埋める        */
    strcpy( code, t);
    len = strlen( t);
    memset( &code[len], 80 - len, '\0');

}

/*************************************
    未確定文字列表示開始位置の取得
**************************************/
void GetDspPos( int *x, int *y)
{
    *x =  Cur_X * 8;
    *y = (Cur_Y+2) * 16;
}

int     KAN_read(int sw, unsigned *enc)
{
	int	cnt=0,code;
       	for(;;){
       		code = KYB_read( sw, enc);
            	if( KAN_inpchk() == KAN_MIUNSET)     break;
	}

       	return code;
}
/* ---------------------------------------------------------- */
