|
|
| version 1.5, 2004/02/21 04:48:35 | version 1.11, 2004/03/31 11:59:17 |
|---|---|
| Line 20 typedef struct { | Line 20 typedef struct { |
| NKEYTBL nkeytbl; | NKEYTBL nkeytbl; |
| KEYCTRL keyctrl; | |
| static KEYSTAT keystat; | static KEYSTAT keystat; |
| Line 43 void keystat_tblreset(void) { | Line 44 void keystat_tblreset(void) { |
| nkeytbl.key[i].keys = 1; | nkeytbl.key[i].keys = 1; |
| nkeytbl.key[i].key[0] = (UINT8)i; | 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) { | void keystat_tblset(REG8 ref, const UINT8 *key, UINT cnt) { |
| UINT8 keycode; | |
| NKEYM *nkey; | NKEYM *nkey; |
| keycode = ref & 0x7f; | if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { |
| if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { | nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); |
| nkey = (NKEYM *)(nkeytbl.key + keycode); | cnt = min(cnt, 15); |
| } | |
| else if (ref < NKEY_SYSTEM) { | |
| nkey = (NKEYM *)(nkeytbl.key + ref); | |
| cnt = min(cnt, 3); | |
| } | } |
| else { | else { |
| nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); | return; |
| cnt = min(cnt, 15); | |
| } | } |
| cnt = min(cnt, 3); | |
| nkey->keys = (UINT8)cnt; | nkey->keys = (UINT8)cnt; |
| if (cnt) { | if (cnt) { |
| CopyMemory(nkey->key, key, cnt); | CopyMemory(nkey->key, key, cnt); |
| Line 86 const KEYNAME *nterm; | Line 92 const KEYNAME *nterm; |
| } | } |
| if (user) { | if (user) { |
| if (!milstr_cmp(str_userkey1, str)) { | if (!milstr_cmp(str_userkey1, str)) { |
| return(NKEY_USER1); | return(NKEY_USER + 0); |
| } | } |
| if (!milstr_cmp(str_userkey2, str)) { | if (!milstr_cmp(str_userkey2, str)) { |
| return(NKEY_USER2); | return(NKEY_USER + 1); |
| } | } |
| } | } |
| return(0xff); | return(0xff); |
| Line 151 kstbl_err: | Line 157 kstbl_err: |
| // ---- | // ---- |
| void keystat_ctrlinit(void) { | |
| ZeroMemory(&keyctrl, sizeof(keyctrl)); | |
| } | |
| void keystat_ctrlreset(void) { | |
| keyctrl.reqparam = 0; | |
| } | |
| void keystat_ctrlsend(REG8 dat) { | |
| // return; // まだテスト | |
| 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; | |
| } | |
| 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 keycode; | UINT8 keycode; |
| UINT8 shift; | |
| REG8 data; | REG8 data; |
| while(keys--) { | while(keys--) { |
| keycode = *key++; | keydata = *key++; |
| keycode = (keycode & 0x7f); | keycode = (keydata & 0x7f); |
| if (keycode < 0x70) { | if (keycode < 0x70) { |
| if ((keystat.ref[keycode] == NKEYREF_NC) || | if ((keystat.ref[keycode] == NKEYREF_NC) || |
| (!(kbexflag[keycode] & KBEX_NONREP))) { | (!(kbexflag[keycode] & KBEX_NONREP))) { |
| Line 168 void keystat_down(const UINT8 *key, REG8 | Line 238 void keystat_down(const UINT8 *key, REG8 |
| 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)) || |
| ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { | ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { |
| keycode |= 8; | keydata |= 0x80; |
| } | } |
| shift = keycode & 0x07; | if (!(keydata & 0x80)) { // シフト |
| if (!(keycode & 8)) { // シフト | if (keystat.ref[keycode] == NKEYREF_NC) { |
| if ((keystat.ref[0x70 + shift] == NKEYREF_NC) && | keystat.ref[keycode] = ref; |
| (keystat.ref[0x78 + shift] == NKEYREF_NC)) { | keyboard_send(keycode); |
| keyboard_send((REG8)(0x70 + shift)); | |
| } | |
| if (keystat.ref[0x70 + shift] > ref) { | |
| keystat.ref[0x70 + shift] = ref; | |
| } | } |
| } | } |
| else { // シフトメカニカル処理 | else { // シフトメカニカル処理 |
| if (keystat.ref[0x78 + shift] == NKEYREF_NC) { | if (keystat.ref[keycode] == NKEYREF_NC) { |
| keystat.ref[0x78 + shift] = ref; | keystat.ref[keycode] = ref; |
| data = (REG8)(0x70 + shift); | data = keycode; |
| } | } |
| else { | else { |
| keystat.ref[0x78 + shift] = NKEYREF_NC; | keystat.ref[keycode] = NKEYREF_NC; |
| data = (REG8)(0xf0 + shift); | data = (REG8)(keycode + 0x80); |
| } | |
| if (keystat.ref[0x70 + shift] == NKEYREF_NC) { | |
| keyboard_send(data); | |
| } | } |
| keyboard_send(data); | |
| } | } |
| } | } |
| } | } |
| Line 203 void keystat_down(const UINT8 *key, REG8 | Line 278 void keystat_down(const UINT8 *key, REG8 |
| void keystat_up(const UINT8 *key, REG8 keys, REG8 ref) { | void keystat_up(const UINT8 *key, REG8 keys, REG8 ref) { |
| UINT8 keydata; | |
| UINT8 keycode; | UINT8 keycode; |
| UINT8 shift; | |
| while(keys--) { | while(keys--) { |
| keycode = *key++; | keydata = *key++; |
| keycode = (keycode & 0x7f); | keycode = (keydata & 0x7f); |
| if (keycode < 0x70) { | if (keycode < 0x70) { |
| if (keystat.ref[keycode] == ref) { | if (keystat.ref[keycode] == ref) { |
| keystat.ref[keycode] = NKEYREF_NC; | keystat.ref[keycode] = NKEYREF_NC; |
| Line 216 void keystat_up(const UINT8 *key, REG8 k | Line 291 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)) || |
| ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { | ((keycode == 0x73) && (np2cfg.XSHIFT & 4)))) { |
| keycode |= 8; | keydata |= 0x80; |
| } | } |
| shift = keycode & 0x07; | if (!(keydata & 0x80)) { // シフト |
| if (!(keycode & 8)) { // シフト | if (keystat.ref[keycode] != NKEYREF_NC) { |
| if (keystat.ref[0x70 + shift] == ref) { | keystat.ref[keycode] = NKEYREF_NC; |
| keystat.ref[0x70 + shift] = NKEYREF_NC; | keyboard_send((REG8)(keycode + 0x80)); |
| if (keystat.ref[0x78 + shift] == NKEYREF_NC) { | |
| keyboard_send((REG8)(shift + 0xf0)); | |
| } | |
| } | } |
| } | } |
| } | } |
| Line 239 void keystat_resendstat(void) { | Line 322 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<8; i++) { | |
| if ((keystat.ref[0x70 + i] != NKEYREF_NC) || | |
| (keystat.ref[0x78 + i] != NKEYREF_NC)) { | |
| keyboard_send((REG8)(i + 0x70)); | |
| } | |
| } | |
| } | } |
| Line 257 void keystat_resendstat(void) { | Line 334 void keystat_resendstat(void) { |
| void keystat_keydown(REG8 ref) { | void keystat_keydown(REG8 ref) { |
| UINT8 keycode; | |
| UINT8 shift; | UINT8 shift; |
| const NKEYM *nkey; | const NKEYM *nkey; |
| keycode = ref & 0x7f; | if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { |
| if (np2cfg.KEY_MODE) { | nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); |
| shift = kbexflag[keycode]; | |
| if (shift & KBEX_JOYKEY) { | |
| keystat.extkey |= (1 << (shift & 7)); | |
| return; | |
| } | |
| } | |
| if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { | |
| nkey = (NKEYM *)(nkeytbl.key + keycode); | |
| keystat_down(nkey->key, nkey->keys, keycode); | |
| } | |
| else { | |
| nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); | |
| keystat_down(nkey->key, nkey->keys, NKEYREF_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) { | void keystat_keyup(REG8 ref) { |
| UINT8 keycode; | |
| UINT8 shift; | UINT8 shift; |
| const NKEYM *nkey; | const NKEYM *nkey; |
| keycode = ref & 0x7f; | if ((ref >= NKEY_USER) && (ref < (NKEY_USER + NKEY_USERKEYS))) { |
| if (np2cfg.KEY_MODE) { | nkey = (NKEYM *)(nkeytbl.user + (ref - NKEY_USER)); |
| shift = kbexflag[keycode]; | |
| if (shift & KBEX_JOYKEY) { | |
| keystat.extkey &= ~(1 << (shift & 7)); | |
| return; | |
| } | |
| } | |
| if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { | |
| nkey = (NKEYM *)(nkeytbl.key + keycode); | |
| keystat_up(nkey->key, nkey->keys, keycode); | |
| } | |
| else { | |
| nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); | |
| keystat_up(nkey->key, nkey->keys, NKEYREF_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); | |
| } | |
| } | } |
| void keystat_releaseref(REG8 ref) { | 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[0x78 ^ i] == NKEYREF_NC) { | |
| keyboard_send((REG8)((i & 7) + 0xe0)); | |
| } | |
| } | |
| } | |
| } | } |
| void keystat_resetjoykey(void) { | void keystat_resetjoykey(void) { |
| Line 339 void keystat_resetjoykey(void) { | Line 404 void keystat_resetjoykey(void) { |
| void keystat_releasekey(REG8 key) { | void keystat_releasekey(REG8 key) { |
| key &= 0x7f; | key &= 0x7f; |
| if (key < 0x70) { | 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 { | |
| 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)); | |
| } | |
| } | } |
| } | } |
| Line 360 void keystat_allrelease(void) { | Line 414 void keystat_allrelease(void) { |
| REG8 i; | REG8 i; |
| for (i=0; i<0x78; i++) { | for (i=0; i<0x80; i++) { |
| keystat_releasekey(i); | keystat_releasekey(i); |
| } | } |
| } | } |
| Line 440 REG8 keystat_getmouse(SINT16 *x, SINT16 | Line 494 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); | |
| case 0x72: // 通常カナ | |
| return(0x82); | |
| case 0x79: // メカニカルロックcaps | |
| return(0x71); | |
| case 0x7a: // メカニカルロックcaps | |
| return(0x72); | |
| case 0x76: | |
| return(0x90); // NKEY_USER + 0 | |
| keycode = data & 0x7f; | case 0x77: |
| if ((keycode == 0x71) || (keycode == 0x72) || | return(0x91); // NKEY_USER + 1 |
| (keycode == 0x79) || (keycode == 0x7a)) { | |
| keycode ^= 8; | default: |
| return(oldcode); | |
| } | } |
| } | |
| void keystat_senddata(REG8 data) { | |
| REG8 keycode; | |
| keycode = cnvnewcode((REG8)(data & 0x7f)); | |
| if (!(data & 0x80)) { | if (!(data & 0x80)) { |
| keystat_keydown(keycode); | keystat_keydown(keycode); |
| } | } |
| Line 457 void keystat_senddata(REG8 data) { | Line 535 void keystat_senddata(REG8 data) { |
| } | } |
| } | } |
| void keystat_forcerelease(REG8 data) { | |
| REG8 keycode; | |
| keycode = cnvnewcode((REG8)(data & 0x7f)); | |
| keystat_releasekey(keycode); | |
| } | |