home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 5 / FREESOFT.BIN / wink2 / src / oak2.c < prev    next >
Text File  |  1992-08-19  |  10KB  |  468 lines

  1. #include    <stdio.h>
  2. #include    <ctype.h>
  3. #include    "defs.h"
  4. /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
  5. #include    <dos.h>
  6. #include    <fmcfrb.h>
  7. #include    <kkstr2.h>
  8. extern char    *work;
  9. #define NOERR   0
  10. #define EGBERR  -1
  11. #define MOSERR  -2
  12. #define KANERR  -3
  13.  
  14. UCHAR modeW = 0x14;
  15.  
  16. /******
  17. #include    "oaklib.h" 
  18. ******/
  19. /* ---------------------------------------------------------- */
  20.  
  21. #define    MAX_MAC    512
  22.  
  23. extern char    *Act_vram();
  24. extern void    wrtstr();
  25. extern void    memcpy();
  26. extern void    memset();
  27. extern int    strlen();
  28. extern void    locate();
  29. extern void    Dsp_box_vram();
  30. extern char    *SPCSTR;
  31.  
  32. short  ReWrt_flg=FALSE;
  33.  
  34. static struct _MACRO {
  35.        int      mc_ch;
  36.        unsigned mc_ec;
  37.     } mac_key[MAX_MAC+1];
  38. static int    mac_cnt=0;
  39. static int    mac_max=0;
  40. static int    mac_flg=0;
  41.  
  42. static int       ch_bak;
  43. static unsigned ec_bak;
  44. static int       hit_flg=FALSE;
  45.  
  46. /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
  47. /*******************
  48. void    putmode(int md,int sf,char *str)
  49. {
  50.     wrtstr(str,71,MENU_Y,0x1F);
  51. }
  52. void    putsys(int len,char *str,char *att)
  53. {
  54.     int     n,Bak_X,Bak_Y;
  55.     char    *vp;
  56.     static int     Bak_len=0;
  57.     static char    *Bak_vp=NULL;
  58.     static char    Bak_vram[160];
  59.  
  60.     Bak_X = Cur_X; Bak_Y = Cur_Y;
  61.     Cur_X = 0 ; Cur_Y = MENU_Y-OFF_Y;
  62.  
  63.     if ( Bak_len > 0 )
  64.     memcpy(Bak_vp,Bak_vram,Bak_len * 2);
  65.  
  66.     Bak_vp = Act_vram();
  67.     memcpy(Bak_vram,Bak_vp,len * 2);
  68.  
  69.     n = len;
  70.     vp = Bak_vp;
  71.     while ( n-- > 0 ) {
  72.     *(vp++) = (*(att++) & 0x0F) | 0x38;
  73.     if ( iskanji((UCHAR)*str) ) {
  74.         *(vp-1) |= 0x40;
  75.         *(vp++) = *(str++);
  76.         *(vp++) = (*(att++) & 0x0F) | 0x80;
  77.         *(vp++) = *(str++);
  78.         n--;
  79.     } else
  80.         *(vp++) = *(str++);
  81.     }
  82.  
  83.     Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
  84.  
  85.     Bak_len = len;
  86.     Cur_X = Bak_X; Cur_Y = Bak_Y;
  87. }
  88.  
  89. void    putstr(int pos,int len,char *str,char *att)
  90. {
  91.     int     n;
  92.     char    *vp;
  93.     static int     Bak_len=0;
  94.     static char    *Bak_vp=NULL;
  95.     static char    Bak_vram[160];
  96.  
  97.     if ( Bak_len > 0 )
  98.     memcpy(Bak_vp,Bak_vram,Bak_len * 2);
  99.  
  100.     Bak_vp = Act_vram();
  101.     memcpy(Bak_vram,Bak_vp,len * 2 + 2);
  102.  
  103.     vp = Bak_vp;
  104.     for ( n = 0 ; n < len ; n++ ) {
  105.     *(vp++) = (*(att++) & 0x0F) | (n == pos ? 0x30 : 0x38);
  106.     if ( iskanji((UCHAR)*str) ) {
  107.         *(vp-1) |= 0x40;
  108.         *(vp++) = *(str++);
  109.         *(vp++) = (*(att++) & 0x0F) | 0x80;
  110.         *(vp++) = *(str++);
  111.         n++;
  112.     } else
  113.         *(vp++) = *(str++);
  114.     }
  115.     if ( len > 0 && n == pos ) {
  116.     *vp |= 0x17;
  117.     len++;
  118.     }
  119.  
  120.     Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
  121.     Bak_len = len;
  122. }
  123. void    Ent_sub(sw)
  124. int    sw;
  125. {
  126.     char     bk,*vp;
  127.  
  128.     vp = (char *)Act_vram();
  129.     if ( sw == FALSE ) {
  130.     *vp &= 0xDF;
  131.         Dsp_box_vram(1,0x07);
  132.     } else {
  133.     bk = *vp;
  134.     *vp = (*vp & 0xC0) | 0x3C;
  135.         Dsp_box_vram(1,0x07);
  136.     *vp = bk;
  137.     }
  138. }
  139. void    Ent_tango(arg)
  140. char    *arg;
  141. {
  142.     int     i,j,ch,sc;
  143.     unsigned ec;
  144.     int     Ent_X,Ent_Y;
  145.     int     Bak_X,Bak_Y;
  146.     char    *vp,*Ent_vp,*End_vp;
  147.     char    att[80];
  148.  
  149.     Bak_X = Cur_X; Bak_Y = Cur_Y;
  150.     Ent_sub(TRUE);
  151.     *arg = '\0';
  152.  
  153.     memset(att,0x00,10);
  154.     memset(att + 10,0x01,53);
  155.     putsys(63,
  156.            "単語登録  登録位置にカ-ソルを移動して実行キ-を押してください ",
  157.        att);
  158.  
  159.     for ( ; ; ) {
  160.     ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
  161.     Ent_sub(FALSE);
  162.     if ( sc == 0x4F ) {
  163.         if ( --Cur_X < 0 )
  164.             Cur_X = MAX_X - 1;
  165.             vp = (char *)Act_vram();
  166.         if ( (*vp & 0x80) != 0 && Cur_X > 0 )
  167.         Cur_X--; 
  168.     } else if ( sc == 0x51 && ++Cur_X >= MAX_X )
  169.         Cur_X = 0;
  170.     else if ( sc == 0x4D && --Cur_Y < 0 )
  171.         Cur_Y = MENU_Y - 3;
  172.     else if ( sc == 0x50 && ++Cur_Y > (MENU_Y - 3) )
  173.         Cur_Y = 0;
  174.     else if ( sc == 0x72 )
  175.         goto ENDOF;
  176.     else if ( sc == 0x73 )
  177.         break;
  178.         vp = (char *)Act_vram();
  179.     if ( (*vp & 0x80) != 0 && Cur_X < (MAX_X - 1) )
  180.         Cur_X++;
  181.     Ent_sub(TRUE);
  182.     }
  183.  
  184.     Ent_X = Cur_X; Ent_Y = Cur_Y; 
  185.     Ent_vp = (char *)Act_vram();
  186.  
  187.     putsys(36,
  188.            "単語登録  登録範囲を指定してください",
  189.        att);
  190.  
  191.     Cur_X = Ent_X ; Cur_Y = Ent_Y;
  192.  
  193.     for ( ; ; ) {
  194.     ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
  195.     if ( sc == 0x4F ) {
  196.         vp = (char *)Act_vram();
  197.         if ( vp > Ent_vp ) {
  198.         if ( --Cur_X < 0 ) {
  199.             Cur_X = MAX_X - 1;
  200.             if ( Cur_Y > 0 )
  201.             Cur_Y--;
  202.         }
  203.         vp = (char *)Act_vram();
  204.         if ( Cur_X > 0 && (*vp & 0x80) != 0 )
  205.             Cur_X--;
  206.         Ent_sub(FALSE);
  207.         }
  208.     } else if ( sc == 0x51 ) {
  209.         Ent_sub(TRUE);
  210.         vp = (char *)Act_vram();
  211.         if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
  212.         Cur_X += 2;
  213.         else
  214.         Cur_X++;
  215.         if ( Cur_X >= MAX_X ) {
  216.         Cur_X -= MAX_X;
  217.         if ( ++Cur_Y > (MENU_Y - 3) )
  218.             Cur_Y = MENU_Y - 3;
  219.         }
  220.     } else if ( sc == 0x72 )
  221.         goto CLROF;
  222.     else if ( sc == 0x73 )
  223.         break;
  224.     }
  225.     End_vp = (char *)Act_vram();
  226.     for ( vp = Ent_vp ; vp < End_vp ; vp+=2 ) {
  227.     if ( (unsigned char)(*(arg++) = *(vp+1)) < ' ' )
  228.         *(arg-1) = ' ';
  229.     }
  230.     *arg = '\0';
  231. CLROF:
  232.     i = Cur_X; j = Cur_Y;
  233.     Cur_X = Ent_X; Cur_Y = Ent_Y;
  234.     for ( ; ; ) {
  235.     Ent_sub(FALSE);
  236.     vp = (char *)Act_vram();
  237.     if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
  238.         Cur_X += 2;
  239.     else
  240.         Cur_X++;
  241.     if ( Cur_X >= MAX_X ) {
  242.         Cur_X -= MAX_X;
  243.         if ( ++Cur_Y > (MENU_Y - 3) )
  244.         Cur_Y = MENU_Y - 3;
  245.     }
  246.     if ( Cur_Y >= j && Cur_X >= i )
  247.         break;
  248.     }
  249. ENDOF:
  250.     Cur_X = Bak_X; Cur_Y = Bak_Y;
  251.     locate();
  252. }
  253. void    Tango_Touroku()
  254. {
  255.     int     len;
  256.     char    tmp[160];
  257.  
  258.     Ent_tango(tmp);
  259.     if ( (len = strlen(tmp)) > 0 )
  260.     KAN_touroku(len,tmp);
  261.     putsys(0,"","");
  262. }
  263. *******/
  264. /* ---------------------------------------------------------- */
  265. /******************* Debug Code *******************
  266. void    deb_dsp(ch,ec)
  267. int    ch,ec;
  268. {
  269.     char tmp[40];
  270.  
  271.     sprintf(tmp,"CH=%04X EC=%04X",ch,ec);
  272.     wrtstr(tmp,0,0,0x1F);
  273. }
  274. ****************************************************/
  275.  
  276. void    mac_save()
  277. {
  278.     switch(mac_flg) {
  279.     case 0: case 2:
  280.     mac_flg = 1;
  281.     mac_max = 0;
  282.     wrtstr("只今キ-マクロを定義中です",30,1,0x15);
  283.     break;
  284.     case 1:
  285.     mac_flg = 2;
  286.     mac_cnt = 0;
  287.     mac_max--;
  288.     wrtstr(SPCSTR,30,1,0x1F);
  289.     break;
  290.     }
  291. }
  292. void    mac_go()
  293. {
  294.     if ( mac_flg == 2 ) {
  295.     mac_flg = 3;
  296.     mac_cnt = 0;
  297.     }
  298. }
  299. int    kbhit()
  300. {
  301.     if ( hit_flg != FALSE )
  302.     return 1;
  303.  
  304.     if ( mac_flg == 3 ) {
  305.     if ( mac_cnt < mac_max ) {
  306.         hit_flg = TRUE;
  307.         ch_bak = mac_key[mac_cnt].mc_ch;
  308.         ec_bak = mac_key[mac_cnt].mc_ec;
  309.         mac_cnt++;
  310.         return 1;
  311.     } else {
  312.         mac_flg = 2;
  313.         mac_cnt = 0;
  314.     }
  315.     }
  316.  
  317.     while ( (ch_bak = KAN_read(1,&ec_bak)) != 0xFFFF ) {
  318.     if ( ch_bak & 0x8000 || (ec_bak & 0xFF00) > 0x5100 )
  319.         ch_bak = 0xFFFF;
  320.     switch(ec_bak & 0xFF00) {
  321.     case 0xFF00:
  322.         break;
  323.  
  324. /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
  325. /************
  326.     case 0x6D00:
  327.         Tango_Touroku();
  328.         break;
  329. **********/
  330. /* ---------------------------------------------------------- */
  331.  
  332.     default:
  333.         hit_flg = TRUE;
  334.         if ( mac_flg == 1 && mac_max < MAX_MAC ) {
  335.         mac_key[mac_max].mc_ch = ch_bak;
  336.         mac_key[mac_max].mc_ec = ec_bak;
  337.         mac_max++;
  338.         }
  339.         return 1;
  340.     }
  341.     }
  342.  
  343.     return 0;
  344. }
  345. int    Get_key(ec)
  346. unsigned *ec;
  347. {
  348.     while ( kbhit() == 0 );
  349.     hit_flg = FALSE;
  350.     *ec = ec_bak & 0xFF14;
  351.     return ch_bak;
  352. }
  353. int    getch()
  354. {
  355.     int       ch;
  356.     unsigned  ec;
  357.  
  358.     while ( (ch = Get_key(&ec)) == 0xFFFF );
  359.     return ch;
  360. }
  361.  
  362. /* ------------------ OAK4 91.12.28 Pumpkin ----------------- */
  363.  
  364. /*********************************
  365.   かな漢ライブラリの初期化
  366. *********************************/
  367. int kanainit( int sw)
  368. {
  369.     KANJ    kana;
  370.     union REGS    regs;
  371.     int     col[16];
  372.     extern  void GetString( char *);
  373.     extern  void GetDspPos( int *, int *);
  374.  
  375.     kana.scrn   = KAN_SCRN16;
  376.     kana.egbw   = work;
  377.     kana.wPage  = 0;
  378.     kana.mosAp  = KAN_MOSOFF;
  379.     kana.gets   = GetString;
  380.     kana.getPos = GetDspPos;
  381.     kana.maxX   = 639;
  382.     kana.maxY   = 479;
  383.  
  384.     if( KAN_prepare( &kana) != KAN_NOERR)
  385.         return KANERR;
  386.  
  387.     /*  従来のWINKライクなカラーテーブルの設定 */
  388.     col[ 0] = 0x0f;
  389.     col[ 1] = 0x01;
  390.     col[ 2] = 0x02;
  391.     col[ 3] = 0x03;
  392.     col[ 4] = 0x04;
  393.     col[ 5] = 0x05;
  394.     col[ 6] = 0x06;
  395.     col[ 7] = 0x07;
  396.     col[ 8] = 0x08;
  397.     col[ 9] = 0x09;
  398.     col[10] = 0x0a;
  399.     col[11] = 0x0b;
  400.     col[12] = 0x04;
  401.     col[13] = 0x06;
  402.     col[14] = 0x03;
  403.     col[15] = 0x01;
  404.     if( KAN_setClrTbl( col) != KAN_NOERR)
  405.         return KANERR;
  406.  
  407.     KAN_disp(KAN_DISPON);
  408.  
  409.     /* 入力モード設定 */
  410.  
  411.     if (sw != FALSE) {
  412.         regs.h.ah = 0x02;
  413.         regs.h.al = modeW;
  414.         int86(0xec,®s,®s);
  415.     }
  416.     return NOERR;
  417. }
  418. /*********************************
  419.   かな漢ライブラリの終了
  420. *********************************/
  421. void kanaend()
  422. {
  423.     KAN_disp( KAN_DISPOFF);
  424.     KAN_finish();
  425. }
  426. /*************************************
  427.   単語登録文字列取得ルーチン
  428. **************************************/
  429. void GetString( char *code)
  430. {
  431.  
  432.     int     len,i;
  433.     char    t[81],*vp;
  434.  
  435.     vp = Act_vram(); len = 0;
  436.     for ( i=0 ; i < 80 ; vp+=2,i++ ) {
  437.     if ( (unsigned char)(t[i] = *(vp+1)) < ' ' ) t[i] = ' ';
  438.     }
  439.     t[i] = '\0';
  440.  
  441.     /*   文字列の長さ分だけコピーし、残りは'\0'で埋める        */
  442.     strcpy( code, t);
  443.     len = strlen( t);
  444.     memset( &code[len], 80 - len, '\0');
  445.  
  446. }
  447.  
  448. /*************************************
  449.     未確定文字列表示開始位置の取得
  450. **************************************/
  451. void GetDspPos( int *x, int *y)
  452. {
  453.     *x =  Cur_X * 8;
  454.     *y = (Cur_Y+2) * 16;
  455. }
  456.  
  457. int     KAN_read(int sw, unsigned *enc)
  458. {
  459.     int    cnt=0,code;
  460.            for(;;){
  461.                code = KYB_read( sw, enc);
  462.                 if( KAN_inpchk() == KAN_MIUNSET)     break;
  463.     }
  464.  
  465.            return code;
  466. }
  467. /* ---------------------------------------------------------- */
  468.