--- np2/keystat.c 2004/02/19 11:32:11 1.4 +++ np2/keystat.c 2004/03/28 10:50:16 1.6 @@ -1,4 +1,5 @@ #include "compiler.h" +#include "dosio.h" #include "textfile.h" #include "pccore.h" #include "iocore.h" @@ -7,7 +8,7 @@ typedef struct { - UINT8 ref[0x80]; + UINT8 ref[NKEY_SYSTEM]; UINT8 extkey; UINT8 mouselast; UINT8 padding; @@ -24,9 +25,13 @@ static KEYSTAT keystat; void keystat_initialize(void) { + char path[MAX_PATH]; + ZeroMemory(&keystat, sizeof(keystat)); FillMemory(keystat.ref, sizeof(keystat.ref), NKEYREF_NC); keystat_tblreset(); + getbiospath(path, "key.txt", sizeof(path)); + keystat_tblload(path); } void keystat_tblreset(void) { @@ -38,12 +43,40 @@ void keystat_tblreset(void) { nkeytbl.key[i].keys = 1; nkeytbl.key[i].key[0] = (UINT8)i; } + for (i=0; i<0x10; i++) { + nkeytbl.key[i+0x80].keys = 1; + nkeytbl.key[i+0x80].key[0] = (UINT8)(i + 0xf0); + } +} + +void keystat_tblset(REG8 ref, const UINT8 *key, UINT cnt) { + + NKEYM *nkey; + + if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { + nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); + cnt = min(cnt, 15); + } + else if (ref < NKEY_SYSTEM) { + nkey = (NKEYM *)(nkeytbl.key + ref); + cnt = min(cnt, 3); + } + else { + return; + } + nkey->keys = (UINT8)cnt; + if (cnt) { + CopyMemory(nkey->key, key, cnt); + } } // ---- config... -static REG8 searchkeynum(const char *str) { +static const char str_userkey1[] = "userkey1"; +static const char str_userkey2[] = "userkey2"; + +static REG8 searchkeynum(const char *str, BOOL user) { const KEYNAME *n; const KEYNAME *nterm; @@ -56,17 +89,27 @@ const KEYNAME *nterm; } n++; } + if (user) { + if (!milstr_cmp(str_userkey1, str)) { + return(NKEY_USER + 0); + } + if (!milstr_cmp(str_userkey2, str)) { + return(NKEY_USER + 1); + } + } return(0xff); } void keystat_tblload(const char *filename) { TEXTFILEH tfh; - char work[128]; + char work[256]; char *p; char *q; char *r; - REG8 key; + UINT8 ref; + UINT8 key[15]; + UINT cnt; tfh = textfile_open(filename, 0x800); if (tfh == NULL) { @@ -82,21 +125,27 @@ void keystat_tblload(const char *filenam continue; } *q++ = '\0'; - r = (char *)milstr_chr(p, ' '); + r = milstr_chr(p, ' '); if (r != NULL) { *r = '\0'; } - key = searchkeynum(p); - - while(q) { + ref = searchkeynum(p, TRUE); + if (ref == 0xff) { + continue; + } + cnt = 0; + while((q) && (cnt < 16)) { p = milstr_nextword(q); q = milstr_chr(p, ' '); if (q != NULL) { *q++ = '\0'; } - key = searchkeynum(p); - + key[cnt] = searchkeynum(p, FALSE); + if (key[cnt] != 0xff) { + cnt++; + } } + keystat_tblset(ref, key, cnt); } textfile_close(tfh); @@ -109,13 +158,13 @@ kstbl_err: void keystat_down(const UINT8 *key, REG8 keys, REG8 ref) { + UINT8 keydata; UINT8 keycode; - UINT8 shift; REG8 data; while(keys--) { - keycode = *key++; - keycode = (keycode & 0x7f); + keydata = *key++; + keycode = (keydata & 0x7f); if (keycode < 0x70) { if ((keystat.ref[keycode] == NKEYREF_NC) || (!(kbexflag[keycode] & KBEX_NONREP))) { @@ -128,28 +177,27 @@ void keystat_down(const UINT8 *key, REG8 (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) || ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) || ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { - keycode |= 8; + keydata |= 0x80; } - shift = keycode & 0x07; - if (!(keycode & 8)) { // シフト - if ((keystat.ref[0x70 + shift] == NKEYREF_NC) && - (keystat.ref[0x78 + shift] == NKEYREF_NC)) { - keyboard_send((REG8)(0x70 + shift)); + if (!(keydata & 0x80)) { // シフト + if ((keystat.ref[keycode + 0x00] == NKEYREF_NC) && + (keystat.ref[keycode + 0x10] == NKEYREF_NC)) { + keyboard_send(keycode); } - if (keystat.ref[0x70 + shift] > ref) { - keystat.ref[0x70 + shift] = ref; + if (keystat.ref[keycode] > ref) { + keystat.ref[keycode] = ref; } } else { // シフトメカニカル処理 - if (keystat.ref[0x78 + shift] == NKEYREF_NC) { - keystat.ref[0x78 + shift] = ref; - data = (REG8)(0x70 + shift); + if (keystat.ref[keycode + 0x10] == NKEYREF_NC) { + keystat.ref[keycode + 0x10] = ref; + data = keycode; } else { - keystat.ref[0x78 + shift] = NKEYREF_NC; - data = (REG8)(0xf0 + shift); + keystat.ref[keycode + 0x10] = NKEYREF_NC; + data = (REG8)(keycode + 0x80); } - if (keystat.ref[0x70 + shift] == NKEYREF_NC) { + if (keystat.ref[keycode] == NKEYREF_NC) { keyboard_send(data); } } @@ -159,12 +207,12 @@ void keystat_down(const UINT8 *key, REG8 void keystat_up(const UINT8 *key, REG8 keys, REG8 ref) { + UINT8 keydata; UINT8 keycode; - UINT8 shift; while(keys--) { - keycode = *key++; - keycode = (keycode & 0x7f); + keydata = *key++; + keycode = (keydata & 0x7f); if (keycode < 0x70) { if (keystat.ref[keycode] == ref) { keystat.ref[keycode] = NKEYREF_NC; @@ -176,14 +224,13 @@ void keystat_up(const UINT8 *key, REG8 k (((keycode == 0x70) && (np2cfg.XSHIFT & 1)) || ((keycode == 0x74) && (np2cfg.XSHIFT & 2)) || ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { - keycode |= 8; + keydata |= 0x80; } - shift = keycode & 0x07; - if (!(keycode & 8)) { // シフト - if (keystat.ref[0x70 + shift] == ref) { - keystat.ref[0x70 + shift] = NKEYREF_NC; - if (keystat.ref[0x78 + shift] == NKEYREF_NC) { - keyboard_send((REG8)(shift + 0xf0)); + if (!(keydata & 0x80)) { // シフト + if (keystat.ref[keycode] == ref) { + keystat.ref[keycode] = NKEYREF_NC; + if (keystat.ref[keycode + 0x10] == NKEYREF_NC) { + keyboard_send((REG8)(keycode + 0x80)); } } } @@ -200,9 +247,9 @@ void keystat_resendstat(void) { keyboard_send(i); } } - for (i=0; i<8; i++) { + for (i=0; i<0x10; i++) { if ((keystat.ref[0x70 + i] != NKEYREF_NC) || - (keystat.ref[0x78 + i] != NKEYREF_NC)) { + (keystat.ref[0x80 + i] != NKEYREF_NC)) { keyboard_send((REG8)(i + 0x70)); } } @@ -213,59 +260,45 @@ void keystat_resendstat(void) { void keystat_keydown(REG8 ref) { - UINT8 keycode; - UINT8 shift; -const NKEYM3 *nkey3; -const NKEYM15 *nkey15; - - keycode = ref & 0x7f; - if (np2cfg.KEY_MODE) { - shift = kbexflag[keycode]; - if (shift & KBEX_JOYKEY) { - keystat.extkey |= (1 << (shift & 7)); - return; - } - } - if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { - nkey3 = nkeytbl.key + keycode; - keystat_down(nkey3->key, nkey3->keys, keycode); - } - else { -#if 0 - nkey15 = nkeytbl.user + (keycode - NKEY_USER1); -#else - nkey15 = (NKEYM15 *)(np2cfg.userkey + (keycode - NKEY_USER1)); -#endif - keystat_down(nkey15->key, nkey15->keys, NKEYREF_USER); + UINT8 shift; +const NKEYM *nkey; + + if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { + nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); + keystat_down(nkey->key, nkey->keys, NKEYREF_USER); + } + else if (ref < NKEY_SYSTEM) { + if (np2cfg.KEY_MODE) { + shift = kbexflag[ref]; + if (shift & KBEX_JOYKEY) { + keystat.extkey |= (1 << (shift & 7)); + return; + } + } + nkey = (NKEYM *)(nkeytbl.key + ref); + keystat_down(nkey->key, nkey->keys, ref); } } void keystat_keyup(REG8 ref) { - UINT8 keycode; - UINT8 shift; -const NKEYM3 *nkey3; -const NKEYM15 *nkey15; - - keycode = ref & 0x7f; - if (np2cfg.KEY_MODE) { - shift = kbexflag[keycode]; - if (shift & KBEX_JOYKEY) { - keystat.extkey &= ~(1 << (shift & 7)); - return; - } - } - if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { - nkey3 = nkeytbl.key + keycode; - keystat_up(nkey3->key, nkey3->keys, keycode); - } - else { -#if 0 - nkey15 = nkeytbl.user + (keycode - NKEY_USER1); -#else - nkey15 = (NKEYM15 *)(np2cfg.userkey + (keycode - NKEY_USER1)); -#endif - keystat_up(nkey15->key, nkey15->keys, NKEYREF_USER); + UINT8 shift; +const NKEYM *nkey; + + if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { + nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); + keystat_up(nkey->key, nkey->keys, NKEYREF_USER); + } + else if (ref < NKEY_SYSTEM) { + if (np2cfg.KEY_MODE) { + shift = kbexflag[ref]; + if (shift & KBEX_JOYKEY) { + keystat.extkey &= ~(1 << (shift & 7)); + return; + } + } + nkey = (NKEYM *)(nkeytbl.key + ref); + keystat_up(nkey->key, nkey->keys, ref); } } @@ -282,8 +315,14 @@ void keystat_releaseref(REG8 ref) { for (i=0; i<0x10; i++) { if (keystat.ref[0x70 + i] == ref) { keystat.ref[0x70 + i] = NKEYREF_NC; - if (keystat.ref[0x78 ^ i] == NKEYREF_NC) { - keyboard_send((REG8)((i & 7) + 0xe0)); + 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)); } } } @@ -312,12 +351,11 @@ void keystat_releasekey(REG8 key) { } } else { - key &= 0x07; - if ((keystat.ref[0x70 + key] != NKEYREF_NC) || - (keystat.ref[0x78 + key] != NKEYREF_NC)) { - keystat.ref[0x70 + key] = NKEYREF_NC; - keystat.ref[0x78 + key] = NKEYREF_NC; - keyboard_send((REG8)(key + 0xf0)); + 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)); } } } @@ -326,7 +364,7 @@ void keystat_allrelease(void) { REG8 i; - for (i=0; i<0x78; i++) { + for (i=0; i<0x80; i++) { keystat_releasekey(i); } } @@ -406,15 +444,39 @@ REG8 keystat_getmouse(SINT16 *x, SINT16 // ---- -void keystat_senddata(REG8 data) { +// キーコード変更 - UINT8 keycode; +static REG8 cnvnewcode(REG8 oldcode) { + + switch(oldcode) { + case 0x71: // 通常caps + return(0x81); - keycode = data & 0x7f; - if ((keycode == 0x71) || (keycode == 0x72) || - (keycode == 0x79) || (keycode == 0x7a)) { - keycode ^= 8; + case 0x72: // 通常カナ + return(0x82); + + case 0x79: // メカニカルロックcaps + return(0x71); + + case 0x7a: // メカニカルロックcaps + return(0x72); + + case 0x76: + return(0x90); // NKEY_USER + 0 + + case 0x77: + return(0x91); // NKEY_USER + 1 + + default: + return(oldcode); } +} + +void keystat_senddata(REG8 data) { + + REG8 keycode; + + keycode = cnvnewcode((REG8)(data & 0x7f)); if (!(data & 0x80)) { keystat_keydown(keycode); } @@ -423,3 +485,11 @@ void keystat_senddata(REG8 data) { } } +void keystat_forcerelease(REG8 data) { + + REG8 keycode; + + keycode = cnvnewcode((REG8)(data & 0x7f)); + keystat_releasekey(keycode); +} +