home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / whisper / source / whisper.c < prev    next >
Text File  |  1980-01-02  |  8KB  |  388 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    <ctype.h>
  5. #include    <mos.h>
  6. #include    <time.h>
  7. #include    "defs.h"
  8. #include    "event.h"
  9. #include    "graphic.h"
  10. #include    "msg.h"
  11. #include    "oaklib.h"
  12. #include    "buff.h"
  13. #include    "coldef.h"
  14.  
  15. void    CHK_snd(void);
  16. void    CHK_eup(void);
  17. int    MSG_init(char *env,char *usr);
  18. void    RSB_init(int port);
  19. void    WIN_init(void);
  20. void    WIN_open(int no);
  21. int    SEL_file(void);
  22. void    WIN_loop(void);
  23. void    MSG_end(void);
  24. void    RSB_end(void);
  25. void    KYB_clrbuf();
  26. void    TALK_init(char *file);
  27.  
  28. extern short int modeW;
  29.  
  30. int    key_flg=FALSE;
  31. int    cur_x=0,cur_y=0;
  32. int    top_event=0;
  33. int     mos_lock=TRUE;
  34.  
  35. static int    tm_flg=FALSE;
  36. static int     kb_flg=FALSE;
  37. static int     ch_bak=0;
  38. static unsigned ec_bak=0;
  39.  
  40. void    MAIN_event(EVENT *ep)
  41. {
  42.     switch(ep->now) {
  43.  
  44.     case EVT_CLIP_MOS:
  45.     if ( ep->no == 9 || ep->no == 10 )
  46.         tm_flg = TRUE;
  47.     EVT_clip_on(ep);
  48.     case EVT_ON_MOS:
  49.     DSP_mos(1);
  50.     break;
  51.  
  52.     case EVT_SELECT_MOS:
  53.     if ( ep->no == 9 || ep->no == 10 )
  54.         tm_flg = FALSE;
  55.     top_event = ep->no;
  56.     case EVT_DOLACK_MOS:
  57.     ep->now = EVT_NON;
  58.     case EVT_MOVE_MOS:
  59.     EVT_clip_off(ep);
  60.     case EVT_OFF_MOS:
  61.     DSP_mos(0);
  62.     break;
  63.     }
  64. }
  65.  
  66. void    put_put(int x,int y,int len,int pos,char *str,char *att)
  67. {
  68.     int     i,col;
  69.     char    tmp[4];
  70.     static int kan_col[]={ 0,1,14,3,4,5,2,8,9,10,11,12,13,6,15,7 };
  71.  
  72.     for ( i = 0 ; i < len ; ) {
  73.     col = kan_col[*att];
  74.     if ( i == pos )
  75.         col = 15;
  76.  
  77.     if ( iskanji(*str) && iskanji2(*str+1) ) {
  78.         tmp[0] = *(str++);
  79.         tmp[1] = *(str++);
  80.         tmp[2] = '\0';
  81.         if ( (x + 16) > 640 ) {
  82.         x = 0;
  83.         y += 16;
  84.         }
  85.         wrtstr(tmp,0,x/2+y*512,col_cnv[0],col_cnv[col],16);
  86.         x += 16;
  87.         att += 2;
  88.         i += 2;
  89.     } else {
  90.         tmp[0] = *(str++);
  91.         tmp[1] = '\0';
  92.         if ( (x + 8) > 640 ) {
  93.         x = 0;
  94.         y += 16;
  95.         }
  96.         wrtstr(tmp,0,x/2+y*512,col_cnv[0],col_cnv[col],16);
  97.         x += 8;
  98.         att++;
  99.         i++;
  100.     }
  101.     }
  102. }
  103.  
  104. void    putmode(int md,int sf,char *str)
  105. {
  106.     MOS_disp(FALSE);
  107.     wrtstr(str,0,568/2+464*512,col_cnv[COL_CHR],col_cnv[COL_WHIS],16);
  108.     if ( mos_lock == FALSE )
  109.     MOS_disp(TRUE);
  110. }
  111.  
  112. void    putsys(int len,char *str,char *att)
  113. {
  114.     static BLOCK *save=NULL;
  115.  
  116.     if ( key_flg == FALSE )
  117.     return;
  118.  
  119.     MOS_disp(FALSE);
  120.  
  121.     if ( save != NULL ) {
  122.     DSP_pop_vram(save);
  123.     save = NULL;
  124.     }
  125.  
  126.     if ( len > 0 ) {
  127.         save = DSP_push_vram(0,464,len*8,479);
  128.     put_put(0,464,len,256,str,att);
  129.     }
  130.  
  131.     if ( mos_lock == FALSE )
  132.     MOS_disp(TRUE);
  133. }
  134.  
  135. void    putcnv(int pos,int len,char *str,char *att)
  136. {
  137.     static BLOCK *save1=NULL;
  138.     static BLOCK *save2=NULL;
  139.     int     n;
  140.  
  141.     if ( key_flg == FALSE )
  142.     return;
  143.  
  144.     MOS_disp(FALSE);
  145.  
  146.     if ( save1 != NULL ) {
  147.     DSP_pop_vram(save1);
  148.     save1 = NULL;
  149.     }
  150.     if ( save2 != NULL ) {
  151.     DSP_pop_vram(save2);
  152.     save2 = NULL;
  153.     }
  154.  
  155.     if ( len > 0 ) {
  156.     if ( (n = cur_x+len*8) > 640 ) {
  157.         n -= (624);
  158.         save1 = DSP_push_vram(cur_x,cur_y,639,cur_y+15);
  159.         save2 = DSP_push_vram(0,cur_y+16,n,cur_y+31);
  160.     } else
  161.         save1 = DSP_push_vram(cur_x,cur_y,n,cur_y+15);
  162.     put_put(cur_x,cur_y,len,pos,str,att);
  163.     }
  164.  
  165.     if ( mos_lock == FALSE )
  166.     MOS_disp(TRUE);
  167. }
  168. void    TIME_dsp(void)
  169. {
  170.     static time_t old_t=0;
  171.     time_t    t;
  172.     struct tm *ft;
  173.     char      tmp[32];
  174.  
  175.     time(&t);
  176.     if ( tm_flg == FALSE && t != old_t ) {
  177.     old_t = t;
  178.     ft = localtime(&t);
  179.     sprintf(tmp,"%02d/%02d/%02d",
  180.         ft->tm_year,ft->tm_mon+1,ft->tm_mday);
  181.     DSP_string(tmp,TIME_X+2,4,COL_WHIS2,COL_WHIS);
  182.  
  183.     sprintf(tmp,"%02d:%02d:%02d",
  184.         ft->tm_hour,ft->tm_min,ft->tm_sec);
  185.     DSP_string(tmp,TIME_X+72+2,4,COL_WHIS2,COL_WHIS);
  186.  
  187.     MSG_wind("interval_timer");
  188.     }
  189. }
  190. int    main(int argc,char *argv[])
  191. {
  192.     char    *p;
  193.     char    *work=NULL;
  194.     char    *user=NULL;
  195.     char    *tmp=NULL;
  196.  
  197.     work = getenv("WHISPER");
  198.     tmp = getenv("TMP");
  199.  
  200.     while ( --argc > 0 ) {
  201.     p = *(++argv);
  202.     if ( *p == '-' || *p == '/' ) {
  203.         switch(*(++p)) {
  204.         case 'R': case 'r':
  205.         modeW = (modeW & 0xFFF3) | 0x0008;
  206.         break;
  207.         case 'F': case 'f':
  208.         modeW = (modeW & 0xFFCF) | 0x0020;
  209.         break;
  210.         case 'K': case 'k':
  211.         modeW = (modeW & 0xFE3F) | 0x0080;
  212.         break;
  213.         case 'H': case 'h':
  214.         modeW = (modeW & 0xFE3F) | 0x0100;
  215.         break;
  216.         case 'T': case 't':
  217.         if ( *(++p) == '=' ) p++;
  218.         tmp = p;
  219.         break;
  220.         case 'W': case 'w':
  221.         if ( *(++p) == '=' ) p++;
  222.         work = p;
  223.         break;
  224.         }
  225.     } else
  226.         user = p;
  227.     }
  228.  
  229.     DSP_init();
  230.     if ( MSG_init(work,user) ) {
  231.     wrtstr("うわぁ! WHISPER.CFG が読み込めな~い!",
  232.         0,160/2+220*512,col_cnv[8],col_cnv[0],16);
  233.     DSP_end();
  234.     return 1;
  235.     }
  236.  
  237.     KAN_open(putcnv,putsys,putmode);
  238.     TALK_init("ONSEI.DIC");
  239.     BUF_init(tmp);
  240.     RSB_init(0);
  241.  
  242.     MOS_disp(FALSE);
  243.  
  244.     DSP_box(0,0,639,15,COL_LINE,COL_WHIS);
  245.  
  246.     EVT_sw(WHIS_X,2,"WHISPER",COL_LOVE,COL_WHIS,100,MAIN_event,0);
  247.  
  248.     EVT_sw(MIKE_X,2,"    ",COL_WHIS2,COL_WHIS,100,MAIN_event,1);
  249.     EVT_sw(JOHN_X,2,"    ",COL_WHIS2,COL_WHIS,100,MAIN_event,2);
  250.     EVT_sw(KENT_X,2,"    ",COL_WHIS2,COL_WHIS,100,MAIN_event,3);
  251.     EVT_sw(JACK_X,2,"JACK",COL_WHIS2,COL_WHIS,100,MAIN_event,4);
  252.  
  253.     EVT_sw(HELP_X,2,"HELP",COL_DIA,COL_WHIS,100,MAIN_event,5);
  254.     EVT_sw(EXIT_X,2,"EXIT",COL_RED,COL_WHIS,100,MAIN_event,6);
  255.  
  256. /**************************
  257.     EVT_sw(CD_X,2,"CD",COL_WHIS2,COL_WHIS,100,MAIN_event,7);
  258. ***************************/
  259.     EVT_sw(AUX_X,2,"SETUP",COL_WHIS2,COL_WHIS,100,MAIN_event,8);
  260.  
  261.     EVT_sw(TIME_X,2,"        ",COL_WHIS2,COL_WHIS,100,MAIN_event,9);
  262.     EVT_sw(TIME_X+72,2,"        ",COL_WHIS2,COL_WHIS,100,MAIN_event,10);
  263.  
  264.     MOS_disp(TRUE);
  265.  
  266.     WIN_init();
  267.  
  268.     MSG_wind(START_MSG);
  269.     mos_lock = FALSE;
  270.  
  271.     for ( top_event = ERR ; ; ) {
  272.  
  273.     TIME_dsp();
  274.     EVT_loop(0);
  275.  
  276.     if ( top_event == 0 ) {
  277.         MSG_wind(WHISPER_MSG);
  278.  
  279.     } else if ( top_event == 1 ) {
  280.         WIN_open(0);
  281.  
  282.     } else if ( top_event == 2 ) {
  283.         WIN_open(1);
  284.  
  285.     } else if ( top_event == 3 ) {
  286.         WIN_open(2);
  287.  
  288.     } else if ( top_event == 4 ) {
  289.         top_event = SEL_file();
  290.         continue;
  291.  
  292.     } else if ( top_event == 5 ) {
  293.         MSG_wind(HELP_MSG);
  294.  
  295.     } else if ( top_event == 6 ) {
  296.         if ( MSG_wind(END_OF_MSG) )
  297.             break;
  298.  
  299. /*******************************************
  300.     } else if ( top_event == 7 ) {
  301.         MSG_wind("cdplay");
  302. *******************************************/
  303.  
  304.     } else if ( top_event == 8 ) {
  305.         MSG_wind("setup");
  306.  
  307.     } else if ( top_event == 9 ) {
  308.         MSG_wind("date_event");
  309.  
  310.     } else if ( top_event == 10 ) {
  311.         MSG_wind("time_event");
  312.  
  313.     }
  314.  
  315.     top_event = ERR;
  316.     key_flg = TRUE;
  317.     WIN_loop();
  318.     key_flg = FALSE;
  319.     }
  320.  
  321.     MSG_end();
  322.     BUF_end();
  323.     RSB_end();
  324.     KAN_close();
  325.     DSP_end();
  326.     return 0;
  327. }
  328.  
  329. int    kbhit(void)
  330. {
  331.     CHK_snd();
  332.     CHK_eup();
  333.  
  334.     if ( kb_flg != FALSE )
  335.     return TRUE;
  336.  
  337.     ch_bak = KAN_read(1,&ec_bak);
  338.  
  339.     if ( (ec_bak & 0xFF00) == 0xFF00 )
  340.     return FALSE;
  341.  
  342.     kb_flg = TRUE;
  343.     return TRUE;
  344. }
  345.  
  346. int    getkey(unsigned *ec)
  347. {
  348.     *ec = 0xFF00;
  349.     if ( kbhit() == FALSE )
  350.     return 0xFFFF;
  351.  
  352.     kb_flg = FALSE;
  353.     if ( ch_bak  != 0xFFFF ) {
  354.     if ( (ch_bak & 0x8000) != 0 || (ec_bak & 0xFF00) > 0x5100 )
  355.         ch_bak = 0xFFFF;
  356.     switch(ec_bak&0xFF00) {
  357.     case 0x7300: ch_bak = 0x000D; break;
  358.     case 0x7200: ch_bak = 0x001B; break;
  359.     }
  360.     }
  361.     *ec = ec_bak;
  362.     return ch_bak;
  363. }
  364.  
  365. int    getch(void)
  366. {
  367.     unsigned ec;
  368.  
  369.     return getkey(&ec);
  370. }
  371.  
  372. void    key_in(void)
  373. {
  374.     key_flg = TRUE;
  375.     kb_flg = FALSE;
  376.     KYB_clrbuf();
  377. }
  378. void    key_out(void)
  379. {
  380.     key_flg = FALSE;
  381. }
  382. void    KAN_KAN_open(void)
  383. {
  384.     KYB_init();
  385.     KYB_clic(1);
  386.     KAN_open(putcnv,putsys,putmode);
  387. }
  388.