home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 5
/
FREESOFT.BIN
/
wink2
/
src
/
oak2.c
< prev
next >
Wrap
Text File
|
1992-08-19
|
10KB
|
468 lines
#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;
/* 従来のWINKライクなカラーテーブルの設定 */
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,®s,®s);
}
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;
}
/* ---------------------------------------------------------- */