Diff for /np2/keystat.c between versions 1.6 and 1.18

version 1.6, 2004/03/28 10:50:16 version 1.18, 2005/03/18 09:23:10
Line 5 Line 5
 #include        "iocore.h"  #include        "iocore.h"
 #include        "keystat.h"  #include        "keystat.h"
 #include        "keystat.tbl"  #include        "keystat.tbl"
   #include        "softkbd.h"
   
   
 typedef struct {  typedef struct {
         UINT8   ref[NKEY_SYSTEM];          UINT8   ref[0x80];
         UINT8   extkey;          UINT8   extkey;
         UINT8   mouselast;          UINT8   mouselast;
         UINT8   padding;          UINT8   padding;
Line 18  typedef struct { Line 19  typedef struct {
         UINT8   d_rt;          UINT8   d_rt;
 } KEYSTAT;  } KEYSTAT;
   
   
                 NKEYTBL         nkeytbl;                  NKEYTBL         nkeytbl;
                   KEYCTRL         keyctrl;
 static  KEYSTAT         keystat;  static  KEYSTAT         keystat;
   
   
 void keystat_initialize(void) {  void keystat_initialize(void) {
   
         char    path[MAX_PATH];          OEMCHAR path[MAX_PATH];
   
           ZeroMemory(&keyctrl, sizeof(keyctrl));
           keyctrl.keyrep = 0x21;
           keyctrl.capsref = NKEYREF_NC;
           keyctrl.kanaref = NKEYREF_NC;
   
         ZeroMemory(&keystat, sizeof(keystat));          ZeroMemory(&keystat, sizeof(keystat));
         FillMemory(keystat.ref, sizeof(keystat.ref), NKEYREF_NC);          FillMemory(keystat.ref, sizeof(keystat.ref), NKEYREF_NC);
         keystat_tblreset();          keystat_tblreset();
         getbiospath(path, "key.txt", sizeof(path));          getbiospath(path, OEMTEXT("key.txt"), NELEMENTS(path));
         keystat_tblload(path);          keystat_tblload(path);
 }  }
   
Line 73  void keystat_tblset(REG8 ref, const UINT Line 79  void keystat_tblset(REG8 ref, const UINT
   
 // ---- config...  // ---- config...
   
 static const char str_userkey1[] = "userkey1";  static const OEMCHAR str_userkey1[] = OEMTEXT("userkey1");
 static const char str_userkey2[] = "userkey2";  static const OEMCHAR str_userkey2[] = OEMTEXT("userkey2");
   
 static REG8 searchkeynum(const char *str, BOOL user) {  static REG8 searchkeynum(const OEMCHAR *str, BOOL user) {
   
 const KEYNAME   *n;  const KEYNAME   *n;
 const KEYNAME   *nterm;  const KEYNAME   *nterm;
   
         n = keyname;          n = keyname;
         nterm = keyname + (sizeof(keyname) / sizeof(KEYNAME));          nterm = keyname + NELEMENTS(keyname);
         while(n < nterm) {          while(n < nterm) {
                 if (!milstr_cmp(n->str, str)) {                  if (!milstr_cmp(n->str, str)) {
                         return(n->num);                          return(n->num);
Line 100  const KEYNAME *nterm; Line 106  const KEYNAME *nterm;
         return(0xff);          return(0xff);
 }  }
   
 void keystat_tblload(const char *filename) {  void keystat_tblload(const OEMCHAR *filename) {
   
         TEXTFILEH       tfh;          TEXTFILEH       tfh;
         char            work[256];          OEMCHAR         work[256];
         char            *p;          OEMCHAR         *p;
         char            *q;          OEMCHAR         *q;
         char            *r;          OEMCHAR         *r;
         UINT8           ref;          UINT8           ref;
         UINT8           key[15];          UINT8           key[15];
         UINT            cnt;          UINT            cnt;
Line 115  void keystat_tblload(const char *filenam Line 121  void keystat_tblload(const char *filenam
         if (tfh == NULL) {          if (tfh == NULL) {
                 goto kstbl_err;                  goto kstbl_err;
         }          }
         while(textfile_read(tfh, work, sizeof(work)) == SUCCESS) {          while(textfile_read(tfh, work, NELEMENTS(work)) == SUCCESS) {
                 p = milstr_nextword(work);                  p = milstr_nextword(work);
                 q = milstr_chr(p, '\t');                  q = milstr_chr(p, '\t');
                 if (q == NULL) {                  if (q == NULL) {
Line 156  kstbl_err: Line 162  kstbl_err:
   
 // ----  // ----
   
   static REG8 getledstat(void) {
   
           REG8    ret;
   
           ret = 0;
           if (keyctrl.kanaref != NKEYREF_NC) {
                   ret |= 8;
           }
           if (keyctrl.capsref != NKEYREF_NC) {
                   ret |= 4;
           }
           return(ret);
   }
   
   static void reloadled(void) {
   
           keyctrl.kanaref = keystat.ref[0x72];
           keyctrl.capsref = keystat.ref[0x71];
   #if defined(SUPPORT_SOFTKBD)
           softkbd_led(getledstat());
   #endif
   }
   
   void keystat_ctrlreset(void) {
   
           keyctrl.reqparam = 0;
           keystat.ref[0x72] = keyctrl.kanaref;
           keystat.ref[0x71] = keyctrl.capsref;
   #if defined(SUPPORT_SOFTKBD)
           softkbd_led(getledstat());
   #endif
   }
   
   void keystat_ctrlsend(REG8 dat) {
   
           if (!keyctrl.reqparam) {
                   keyctrl.mode = dat;
                   switch(dat) {
   #if defined(SUPPORT_PC9801_119)
                           case 0x95:
   #endif
                           case 0x9c:
                           case 0x9d:
                                   keyctrl.reqparam = 1;
                                   keyboard_ctrl(0xfa);
                                   break;
   
   #if defined(SUPPORT_PC9801_119)
                           case 0x96:
                                   keyboard_ctrl(0xfa);
                                   keyboard_ctrl(0xa0);
                                   keyboard_ctrl(0x83);
                                   break;
   #endif
   
                           case 0x9f:
                                   keyboard_ctrl(0xfa);
                                   keyboard_ctrl(0xa0);
                                   keyboard_ctrl(0x80);
                                   break;
   
                           default:
                                   keyboard_ctrl(0xfc);
                                   break;
                   }
           }
           else {
                   switch(keyctrl.mode) {
   #if defined(SUPPORT_PC9801_119)
                           case 0x95:
                                   keyctrl.kbdtype = dat;
                                   keyboard_ctrl(0xfa);
                                   break;
   #endif
                           case 0x9c:
                                   keyboard_ctrl(0xfa);
                                   break;
   
                           case 0x9d:
                                   if (dat == 0x60) {
                                           keyboard_ctrl(0xfa);
                                           keyboard_ctrl((REG8)(0x70 + getledstat()));
                                   }
                                   else if ((dat & 0xf0) == 0x70) {
                                           keyboard_ctrl(0xfa);
                                           keystat.ref[0x72] = (dat & 8)?NKEYREF_uPD8255:NKEYREF_NC;
                                           keystat.ref[0x71] = (dat & 4)?NKEYREF_uPD8255:NKEYREF_NC;
                                           reloadled();
                                   }
                                   break;
                   }
                   keyctrl.reqparam = 0;
           }
   }
   
   
   // ----
   
 void keystat_down(const UINT8 *key, REG8 keys, REG8 ref) {  void keystat_down(const UINT8 *key, REG8 keys, REG8 ref) {
   
         UINT8   keydata;          UINT8   keydata;
Line 166  void keystat_down(const UINT8 *key, REG8 Line 270  void keystat_down(const UINT8 *key, REG8
                 keydata = *key++;                  keydata = *key++;
                 keycode = (keydata & 0x7f);                  keycode = (keydata & 0x7f);
                 if (keycode < 0x70) {                  if (keycode < 0x70) {
   #if 1                                                                                           // 05/02/04
                           if (keystat.ref[keycode] != NKEYREF_NC) {
                                   if (!(kbexflag[keycode] & KBEX_NONREP)) {
                                           keyboard_send((REG8)(keycode + 0x80));
                                           keystat.ref[keycode] = NKEYREF_NC;
                                   }
                           }
                           if (keystat.ref[keycode] == NKEYREF_NC) {
                                   keyboard_send(keycode);
                           }
   #else
                         if ((keystat.ref[keycode] == NKEYREF_NC) ||                          if ((keystat.ref[keycode] == NKEYREF_NC) ||
                                 (!(kbexflag[keycode] & KBEX_NONREP))) {                                  (!(kbexflag[keycode] & KBEX_NONREP))) {
                                 keyboard_send(keycode);                                  keyboard_send(keycode);
                         }                          }
   #endif
                         keystat.ref[keycode] = ref;                          keystat.ref[keycode] = ref;
                 }                  }
                 else {                  else {
   #if defined(SUPPORT_PC9801_119)
                           if (keyctrl.kbdtype != 0x03)
   #endif
                           {
                                   if (keycode == 0x7d) {
                                           keycode = 0x70;
                                   }
                                   else if (keycode >= 0x75) {
                                           continue;
                                   }
                           }
                         if ((np2cfg.XSHIFT) &&                          if ((np2cfg.XSHIFT) &&
                                 (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) ||                                  (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) ||
                                 ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) ||                                  ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) ||
Line 180  void keystat_down(const UINT8 *key, REG8 Line 307  void keystat_down(const UINT8 *key, REG8
                                 keydata |= 0x80;                                  keydata |= 0x80;
                         }                          }
                         if (!(keydata & 0x80)) {                        // シフト                          if (!(keydata & 0x80)) {                        // シフト
                                 if ((keystat.ref[keycode + 0x00] == NKEYREF_NC) &&                                  if (keystat.ref[keycode] == NKEYREF_NC) {
                                         (keystat.ref[keycode + 0x10] == NKEYREF_NC)) {  
                                         keyboard_send(keycode);  
                                 }  
                                 if (keystat.ref[keycode] > ref) {  
                                         keystat.ref[keycode] = ref;                                          keystat.ref[keycode] = ref;
                                           keyboard_send(keycode);
                                 }                                  }
                         }                          }
                         else {                                                          // シフトメカニカル処理                          else {                                                          // シフトメカニカル処理
                                 if (keystat.ref[keycode + 0x10] == NKEYREF_NC) {                                  if (keystat.ref[keycode] == NKEYREF_NC) {
                                         keystat.ref[keycode + 0x10] = ref;                                          keystat.ref[keycode] = ref;
                                         data = keycode;                                          data = keycode;
                                 }                                  }
                                 else {                                  else {
                                         keystat.ref[keycode + 0x10] = NKEYREF_NC;                                          keystat.ref[keycode] = NKEYREF_NC;
                                         data = (REG8)(keycode + 0x80);                                          data = (REG8)(keycode + 0x80);
                                 }                                  }
                                 if (keystat.ref[keycode] == NKEYREF_NC) {                                  keyboard_send(data);
                                         keyboard_send(data);                          }
                                 }                          if ((keycode == 0x71) || (keycode == 0x72)) {
                                   reloadled();
                         }                          }
                 }                  }
         }          }
Line 220  void keystat_up(const UINT8 *key, REG8 k Line 345  void keystat_up(const UINT8 *key, REG8 k
                         }                          }
                 }                  }
                 else {                  else {
   #if defined(SUPPORT_PC9801_119)
                           if (keyctrl.kbdtype != 0x03)
   #endif
                           {
                                   if (keycode == 0x7d) {
                                           keycode = 0x70;
                                   }
                                   else if (keycode >= 0x75) {
                                           continue;
                                   }
                           }
                         if ((np2cfg.XSHIFT) &&                          if ((np2cfg.XSHIFT) &&
                                 (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) ||                                  (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) ||
                                 ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) ||                                  ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) ||
Line 227  void keystat_up(const UINT8 *key, REG8 k Line 363  void keystat_up(const UINT8 *key, REG8 k
                                 keydata |= 0x80;                                  keydata |= 0x80;
                         }                          }
                         if (!(keydata & 0x80)) {                        // シフト                          if (!(keydata & 0x80)) {                        // シフト
                                 if (keystat.ref[keycode] == ref) {                                  if (keystat.ref[keycode] != NKEYREF_NC) {
                                         keystat.ref[keycode] = NKEYREF_NC;                                          keystat.ref[keycode] = NKEYREF_NC;
                                         if (keystat.ref[keycode + 0x10] == NKEYREF_NC) {                                          keyboard_send((REG8)(keycode + 0x80));
                                                 keyboard_send((REG8)(keycode + 0x80));                                          if ((keycode == 0x71) || (keycode == 0x72)) {
                                                   reloadled();
                                         }                                          }
                                 }                                  }
                         }                          }
Line 242  void keystat_resendstat(void) { Line 379  void keystat_resendstat(void) {
   
         REG8    i;          REG8    i;
   
         for (i=0; i<0x70; i++) {          for (i=0; i<0x80; i++) {
                 if (keystat.ref[i] != NKEYREF_NC) {                  if (keystat.ref[i] != NKEYREF_NC) {
                         keyboard_send(i);                          keyboard_send(i);
                 }                  }
         }          }
         for (i=0; i<0x10; i++) {  
                 if ((keystat.ref[0x70 + i] != NKEYREF_NC) ||  
                         (keystat.ref[0x80 + i] != NKEYREF_NC)) {  
                         keyboard_send((REG8)(i + 0x70));  
                 }  
         }  
 }  }
   
   
Line 306  void keystat_releaseref(REG8 ref) { Line 437  void keystat_releaseref(REG8 ref) {
   
         REG8    i;          REG8    i;
   
         for (i=0; i<0x70; i++) {          for (i=0; i<0x80; i++) {
                 if (keystat.ref[i] == ref) {                  if (keystat.ref[i] == ref) {
                         keystat.ref[i] = NKEYREF_NC;                          keystat.ref[i] = NKEYREF_NC;
                         keyboard_send((REG8)(i + 0x80));                          keyboard_send((REG8)(i + 0x80));
                 }                  }
         }          }
         for (i=0; i<0x10; i++) {  
                 if (keystat.ref[0x70 + i] == ref) {  
                         keystat.ref[0x70 + i] = NKEYREF_NC;  
                         if (keystat.ref[0x80 + i] == NKEYREF_NC) {  
                                 keyboard_send((REG8)(0xf0 + i));  
                         }  
                 }  
                 if (keystat.ref[0x80 + i] == ref) {  
                         keystat.ref[0x80 + i] = NKEYREF_NC;  
                         if (keystat.ref[0x70 + i] == NKEYREF_NC) {  
                                 keyboard_send((REG8)(0xf0 + i));  
                         }  
                 }  
         }  
 }  }
   
 void keystat_resetjoykey(void) {  void keystat_resetjoykey(void) {
Line 344  void keystat_resetjoykey(void) { Line 461  void keystat_resetjoykey(void) {
 void keystat_releasekey(REG8 key) {  void keystat_releasekey(REG8 key) {
   
         key &= 0x7f;          key &= 0x7f;
         if (key < 0x70) {          if ((key != 0x71) && (key != 0x72)) {
                 if (keystat.ref[key] != NKEYREF_NC) {                  if (keystat.ref[key] != NKEYREF_NC) {
                         keystat.ref[key] = NKEYREF_NC;                          keystat.ref[key] = NKEYREF_NC;
                         keyboard_send((REG8)(key + 0x80));                          keyboard_send((REG8)(key + 0x80));
                 }                  }
         }          }
         else {  
                 if ((keystat.ref[key + 0x00] != NKEYREF_NC) ||  
                         (keystat.ref[key + 0x10] != NKEYREF_NC)) {  
                         keystat.ref[key + 0x00] = NKEYREF_NC;  
                         keystat.ref[key + 0x10] = NKEYREF_NC;  
                         keyboard_send((REG8)(key + 0x80));  
                 }  
         }  
 }  }
   
 void keystat_allrelease(void) {  void keystat_allrelease(void) {

Removed from v.1.6  
changed lines
  Added in v.1.18


RetroPC.NET-CVS <cvs@retropc.net>