--- np2/keystat.c 2004/02/21 04:48:35 1.5 +++ np2/keystat.c 2004/03/31 19:23:37 1.12 @@ -18,8 +18,8 @@ typedef struct { UINT8 d_rt; } KEYSTAT; - NKEYTBL nkeytbl; + KEYCTRL keyctrl; static KEYSTAT keystat; @@ -27,6 +27,11 @@ void keystat_initialize(void) { char path[MAX_PATH]; + ZeroMemory(&keyctrl, sizeof(keyctrl)); + keyctrl.keyrep = 0x21; + keyctrl.capsref = NKEYREF_NC; + keyctrl.kanaref = NKEYREF_NC; + ZeroMemory(&keystat, sizeof(keystat)); FillMemory(keystat.ref, sizeof(keystat.ref), NKEYREF_NC); keystat_tblreset(); @@ -43,22 +48,27 @@ 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) { - UINT8 keycode; NKEYM *nkey; - keycode = ref & 0x7f; - if ((keycode != NKEY_USER1) && (keycode != NKEY_USER2)) { - nkey = (NKEYM *)(nkeytbl.key + keycode); + 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 { - nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); - cnt = min(cnt, 15); + return; } - cnt = min(cnt, 3); nkey->keys = (UINT8)cnt; if (cnt) { CopyMemory(nkey->key, key, cnt); @@ -86,10 +96,10 @@ const KEYNAME *nterm; } if (user) { if (!milstr_cmp(str_userkey1, str)) { - return(NKEY_USER1); + return(NKEY_USER + 0); } if (!milstr_cmp(str_userkey2, str)) { - return(NKEY_USER2); + return(NKEY_USER + 1); } } return(0xff); @@ -151,15 +161,107 @@ 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]; +} + +void keystat_ctrlreset(void) { + + keyctrl.reqparam = 0; + keystat.ref[0x72] = keyctrl.kanaref; + keystat.ref[0x71] = keyctrl.capsref; +} + +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) { + 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))) { @@ -168,34 +270,42 @@ void keystat_down(const UINT8 *key, REG8 keystat.ref[keycode] = ref; } else { +#if defined(SUPPORT_PC9801_119) + if (keyctrl.kbdtype != 0x03) +#endif + { + if (keycode == 0x7d) { + keycode = 0x70; + } + else if (keycode >= 0x75) { + continue; + } + } if ((np2cfg.XSHIFT) && (((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 (keystat.ref[0x70 + shift] > ref) { - keystat.ref[0x70 + shift] = ref; + if (!(keydata & 0x80)) { // シフト + if (keystat.ref[keycode] == NKEYREF_NC) { + keystat.ref[keycode] = ref; + keyboard_send(keycode); } } else { // シフトメカニカル処理 - if (keystat.ref[0x78 + shift] == NKEYREF_NC) { - keystat.ref[0x78 + shift] = ref; - data = (REG8)(0x70 + shift); + if (keystat.ref[keycode] == NKEYREF_NC) { + keystat.ref[keycode] = ref; + data = keycode; } else { - keystat.ref[0x78 + shift] = NKEYREF_NC; - data = (REG8)(0xf0 + shift); - } - if (keystat.ref[0x70 + shift] == NKEYREF_NC) { - keyboard_send(data); + keystat.ref[keycode] = NKEYREF_NC; + data = (REG8)(keycode + 0x80); } + keyboard_send(data); + } + if ((keycode == 0x71) || (keycode == 0x72)) { + reloadled(); } } } @@ -203,12 +313,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; @@ -216,18 +326,29 @@ void keystat_up(const UINT8 *key, REG8 k } } else { +#if defined(SUPPORT_PC9801_119) + if (keyctrl.kbdtype != 0x03) +#endif + { + if (keycode == 0x7d) { + keycode = 0x70; + } + else if (keycode >= 0x75) { + continue; + } + } if ((np2cfg.XSHIFT) && (((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] != NKEYREF_NC) { + keystat.ref[keycode] = NKEYREF_NC; + keyboard_send((REG8)(keycode + 0x80)); + if ((keycode == 0x71) || (keycode == 0x72)) { + reloadled(); } } } @@ -239,17 +360,11 @@ void keystat_resendstat(void) { REG8 i; - for (i=0; i<0x70; i++) { + for (i=0; i<0x80; i++) { if (keystat.ref[i] != NKEYREF_NC) { 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)); - } - } } @@ -257,70 +372,58 @@ void keystat_resendstat(void) { void keystat_keydown(REG8 ref) { - UINT8 keycode; UINT8 shift; const NKEYM *nkey; - 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)) { - nkey = (NKEYM *)(nkeytbl.key + keycode); - keystat_down(nkey->key, nkey->keys, keycode); - } - else { - nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); + 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 NKEYM *nkey; - 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)) { - nkey = (NKEYM *)(nkeytbl.key + keycode); - keystat_up(nkey->key, nkey->keys, keycode); - } - else { - nkey = (NKEYM *)(nkeytbl.user + (keycode - NKEY_USER1)); + 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); + } } void keystat_releaseref(REG8 ref) { REG8 i; - for (i=0; i<0x70; i++) { + for (i=0; i<0x80; i++) { if (keystat.ref[i] == ref) { keystat.ref[i] = NKEYREF_NC; 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) { @@ -339,28 +442,19 @@ void keystat_resetjoykey(void) { void keystat_releasekey(REG8 key) { key &= 0x7f; - if (key < 0x70) { + if ((key != 0x71) && (key != 0x72)) { if (keystat.ref[key] != NKEYREF_NC) { keystat.ref[key] = NKEYREF_NC; 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)); - } - } } void keystat_allrelease(void) { REG8 i; - for (i=0; i<0x78; i++) { + for (i=0; i<0x80; i++) { keystat_releasekey(i); } } @@ -440,15 +534,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); + + case 0x72: // 通常カナ + return(0x82); + + case 0x79: // メカニカルロックcaps + return(0x71); + + case 0x7a: // メカニカルロックcaps + return(0x72); - keycode = data & 0x7f; - if ((keycode == 0x71) || (keycode == 0x72) || - (keycode == 0x79) || (keycode == 0x7a)) { - keycode ^= 8; + 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); } @@ -457,3 +575,11 @@ void keystat_senddata(REG8 data) { } } +void keystat_forcerelease(REG8 data) { + + REG8 keycode; + + keycode = cnvnewcode((REG8)(data & 0x7f)); + keystat_releasekey(keycode); +} +