home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
whisper
/
source
/
whisper.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
8KB
|
388 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <mos.h>
#include <time.h>
#include "defs.h"
#include "event.h"
#include "graphic.h"
#include "msg.h"
#include "oaklib.h"
#include "buff.h"
#include "coldef.h"
void CHK_snd(void);
void CHK_eup(void);
int MSG_init(char *env,char *usr);
void RSB_init(int port);
void WIN_init(void);
void WIN_open(int no);
int SEL_file(void);
void WIN_loop(void);
void MSG_end(void);
void RSB_end(void);
void KYB_clrbuf();
void TALK_init(char *file);
extern short int modeW;
int key_flg=FALSE;
int cur_x=0,cur_y=0;
int top_event=0;
int mos_lock=TRUE;
static int tm_flg=FALSE;
static int kb_flg=FALSE;
static int ch_bak=0;
static unsigned ec_bak=0;
void MAIN_event(EVENT *ep)
{
switch(ep->now) {
case EVT_CLIP_MOS:
if ( ep->no == 9 || ep->no == 10 )
tm_flg = TRUE;
EVT_clip_on(ep);
case EVT_ON_MOS:
DSP_mos(1);
break;
case EVT_SELECT_MOS:
if ( ep->no == 9 || ep->no == 10 )
tm_flg = FALSE;
top_event = ep->no;
case EVT_DOLACK_MOS:
ep->now = EVT_NON;
case EVT_MOVE_MOS:
EVT_clip_off(ep);
case EVT_OFF_MOS:
DSP_mos(0);
break;
}
}
void put_put(int x,int y,int len,int pos,char *str,char *att)
{
int i,col;
char tmp[4];
static int kan_col[]={ 0,1,14,3,4,5,2,8,9,10,11,12,13,6,15,7 };
for ( i = 0 ; i < len ; ) {
col = kan_col[*att];
if ( i == pos )
col = 15;
if ( iskanji(*str) && iskanji2(*str+1) ) {
tmp[0] = *(str++);
tmp[1] = *(str++);
tmp[2] = '\0';
if ( (x + 16) > 640 ) {
x = 0;
y += 16;
}
wrtstr(tmp,0,x/2+y*512,col_cnv[0],col_cnv[col],16);
x += 16;
att += 2;
i += 2;
} else {
tmp[0] = *(str++);
tmp[1] = '\0';
if ( (x + 8) > 640 ) {
x = 0;
y += 16;
}
wrtstr(tmp,0,x/2+y*512,col_cnv[0],col_cnv[col],16);
x += 8;
att++;
i++;
}
}
}
void putmode(int md,int sf,char *str)
{
MOS_disp(FALSE);
wrtstr(str,0,568/2+464*512,col_cnv[COL_CHR],col_cnv[COL_WHIS],16);
if ( mos_lock == FALSE )
MOS_disp(TRUE);
}
void putsys(int len,char *str,char *att)
{
static BLOCK *save=NULL;
if ( key_flg == FALSE )
return;
MOS_disp(FALSE);
if ( save != NULL ) {
DSP_pop_vram(save);
save = NULL;
}
if ( len > 0 ) {
save = DSP_push_vram(0,464,len*8,479);
put_put(0,464,len,256,str,att);
}
if ( mos_lock == FALSE )
MOS_disp(TRUE);
}
void putcnv(int pos,int len,char *str,char *att)
{
static BLOCK *save1=NULL;
static BLOCK *save2=NULL;
int n;
if ( key_flg == FALSE )
return;
MOS_disp(FALSE);
if ( save1 != NULL ) {
DSP_pop_vram(save1);
save1 = NULL;
}
if ( save2 != NULL ) {
DSP_pop_vram(save2);
save2 = NULL;
}
if ( len > 0 ) {
if ( (n = cur_x+len*8) > 640 ) {
n -= (624);
save1 = DSP_push_vram(cur_x,cur_y,639,cur_y+15);
save2 = DSP_push_vram(0,cur_y+16,n,cur_y+31);
} else
save1 = DSP_push_vram(cur_x,cur_y,n,cur_y+15);
put_put(cur_x,cur_y,len,pos,str,att);
}
if ( mos_lock == FALSE )
MOS_disp(TRUE);
}
void TIME_dsp(void)
{
static time_t old_t=0;
time_t t;
struct tm *ft;
char tmp[32];
time(&t);
if ( tm_flg == FALSE && t != old_t ) {
old_t = t;
ft = localtime(&t);
sprintf(tmp,"%02d/%02d/%02d",
ft->tm_year,ft->tm_mon+1,ft->tm_mday);
DSP_string(tmp,TIME_X+2,4,COL_WHIS2,COL_WHIS);
sprintf(tmp,"%02d:%02d:%02d",
ft->tm_hour,ft->tm_min,ft->tm_sec);
DSP_string(tmp,TIME_X+72+2,4,COL_WHIS2,COL_WHIS);
MSG_wind("interval_timer");
}
}
int main(int argc,char *argv[])
{
char *p;
char *work=NULL;
char *user=NULL;
char *tmp=NULL;
work = getenv("WHISPER");
tmp = getenv("TMP");
while ( --argc > 0 ) {
p = *(++argv);
if ( *p == '-' || *p == '/' ) {
switch(*(++p)) {
case 'R': case 'r':
modeW = (modeW & 0xFFF3) | 0x0008;
break;
case 'F': case 'f':
modeW = (modeW & 0xFFCF) | 0x0020;
break;
case 'K': case 'k':
modeW = (modeW & 0xFE3F) | 0x0080;
break;
case 'H': case 'h':
modeW = (modeW & 0xFE3F) | 0x0100;
break;
case 'T': case 't':
if ( *(++p) == '=' ) p++;
tmp = p;
break;
case 'W': case 'w':
if ( *(++p) == '=' ) p++;
work = p;
break;
}
} else
user = p;
}
DSP_init();
if ( MSG_init(work,user) ) {
wrtstr("うわぁ! WHISPER.CFG が読み込めな~い!",
0,160/2+220*512,col_cnv[8],col_cnv[0],16);
DSP_end();
return 1;
}
KAN_open(putcnv,putsys,putmode);
TALK_init("ONSEI.DIC");
BUF_init(tmp);
RSB_init(0);
MOS_disp(FALSE);
DSP_box(0,0,639,15,COL_LINE,COL_WHIS);
EVT_sw(WHIS_X,2,"WHISPER",COL_LOVE,COL_WHIS,100,MAIN_event,0);
EVT_sw(MIKE_X,2," ",COL_WHIS2,COL_WHIS,100,MAIN_event,1);
EVT_sw(JOHN_X,2," ",COL_WHIS2,COL_WHIS,100,MAIN_event,2);
EVT_sw(KENT_X,2," ",COL_WHIS2,COL_WHIS,100,MAIN_event,3);
EVT_sw(JACK_X,2,"JACK",COL_WHIS2,COL_WHIS,100,MAIN_event,4);
EVT_sw(HELP_X,2,"HELP",COL_DIA,COL_WHIS,100,MAIN_event,5);
EVT_sw(EXIT_X,2,"EXIT",COL_RED,COL_WHIS,100,MAIN_event,6);
/**************************
EVT_sw(CD_X,2,"CD",COL_WHIS2,COL_WHIS,100,MAIN_event,7);
***************************/
EVT_sw(AUX_X,2,"SETUP",COL_WHIS2,COL_WHIS,100,MAIN_event,8);
EVT_sw(TIME_X,2," ",COL_WHIS2,COL_WHIS,100,MAIN_event,9);
EVT_sw(TIME_X+72,2," ",COL_WHIS2,COL_WHIS,100,MAIN_event,10);
MOS_disp(TRUE);
WIN_init();
MSG_wind(START_MSG);
mos_lock = FALSE;
for ( top_event = ERR ; ; ) {
TIME_dsp();
EVT_loop(0);
if ( top_event == 0 ) {
MSG_wind(WHISPER_MSG);
} else if ( top_event == 1 ) {
WIN_open(0);
} else if ( top_event == 2 ) {
WIN_open(1);
} else if ( top_event == 3 ) {
WIN_open(2);
} else if ( top_event == 4 ) {
top_event = SEL_file();
continue;
} else if ( top_event == 5 ) {
MSG_wind(HELP_MSG);
} else if ( top_event == 6 ) {
if ( MSG_wind(END_OF_MSG) )
break;
/*******************************************
} else if ( top_event == 7 ) {
MSG_wind("cdplay");
*******************************************/
} else if ( top_event == 8 ) {
MSG_wind("setup");
} else if ( top_event == 9 ) {
MSG_wind("date_event");
} else if ( top_event == 10 ) {
MSG_wind("time_event");
}
top_event = ERR;
key_flg = TRUE;
WIN_loop();
key_flg = FALSE;
}
MSG_end();
BUF_end();
RSB_end();
KAN_close();
DSP_end();
return 0;
}
int kbhit(void)
{
CHK_snd();
CHK_eup();
if ( kb_flg != FALSE )
return TRUE;
ch_bak = KAN_read(1,&ec_bak);
if ( (ec_bak & 0xFF00) == 0xFF00 )
return FALSE;
kb_flg = TRUE;
return TRUE;
}
int getkey(unsigned *ec)
{
*ec = 0xFF00;
if ( kbhit() == FALSE )
return 0xFFFF;
kb_flg = FALSE;
if ( ch_bak != 0xFFFF ) {
if ( (ch_bak & 0x8000) != 0 || (ec_bak & 0xFF00) > 0x5100 )
ch_bak = 0xFFFF;
switch(ec_bak&0xFF00) {
case 0x7300: ch_bak = 0x000D; break;
case 0x7200: ch_bak = 0x001B; break;
}
}
*ec = ec_bak;
return ch_bak;
}
int getch(void)
{
unsigned ec;
return getkey(&ec);
}
void key_in(void)
{
key_flg = TRUE;
kb_flg = FALSE;
KYB_clrbuf();
}
void key_out(void)
{
key_flg = FALSE;
}
void KAN_KAN_open(void)
{
KYB_init();
KYB_clic(1);
KAN_open(putcnv,putsys,putmode);
}