|
|
| version 1.1, 2004/02/18 03:24:48 | version 1.2, 2004/02/18 18:29:29 |
|---|---|
| Line 2 | Line 2 |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "keystat.h" | #include "keystat.h" |
| #include "keystat.tbl" | |
| static UINT8 keystat[0x80]; | typedef struct { |
| UINT8 refer[0x80]; | |
| UINT8 joysync; | |
| UINT8 joylast; | |
| UINT8 mouselast; | |
| UINT8 padding; | |
| UINT8 d_up; | |
| UINT8 d_dn; | |
| UINT8 d_lt; | |
| UINT8 d_rt; | |
| } KEYSTAT; | |
| static const UINT8 joykeytable[12] = { | static KEYSTAT keystat; |
| 0x2a, 0x34, | |
| 0x29, 0x1c, | |
| 0x3c, 0x48, | |
| 0x3b, 0x46, | |
| 0x3d, 0x4b, | |
| 0x3a, 0x43}; | |
| static const UINT8 kbexflag[0x80] = { | |
| // ESC, 1, 2, 3, 4, 5, 6, 7 ; 00h | |
| 0, 0, 0, 0, 0, 0, 0, 0, | |
| // 8, 9, 0, −, ^, ¥, BS, TAB ; 08h | |
| 0, 0, 0, 0, 0, 0, 0, 0, | |
| // Q, W, E, R, T, Y, U, I ; 10h | |
| 0, 0, 0, 0, 0, 0, 0, 0, | |
| // O, P, @, [, Ret, A, S, D ; 18h | |
| 0, 0, 0, 0, 1, 0, 0, 0, | |
| // F, G, H, J, K, L, ;, : ; 20h | |
| 0, 0, 0, 0, 0, 0, 0, 0, | |
| // ], Z, X, C, V, B, N, M ; 28h | |
| 0, 1, 1, 0, 0, 0, 0, 0, | |
| // ,, ., /, _, SPC,XFER,RLUP,RLDN ; 30h | |
| 0, 0, 0, 0, 1, 0, 0, 0, | |
| // INS, DEL, ↑, ←, →, ↓,HMCR,HELP ; 38h | |
| 2, 0, 1, 1, 1, 1, 0, 0, | |
| // <−>,</>,<7>,<8>,<9>,<*>,<4>,<5> ; 40h | |
| 0, 0, 0, 1, 0, 0, 1, 0, | |
| // <6>,<+>,<1>,<2>,<3>,<=>,<0>,<,> ; 48h | |
| 1, 0, 0, 1, 0, 0, 0, 0, | |
| // <.>,NFER,vf.1,vf.2,vf.3,vf.4,vf.5, ; 50h | |
| 0, 0, 2, 2, 2, 2, 2, 0, | |
| // , , , , , ,HOME, ; 58h | |
| 0, 0, 0, 0, 0, 0, 0, 0, | |
| // STOP,COPY, f.1, f.2, f.3, f.4, f.5, f.6 ; 60h | |
| 0, 0, 2, 2, 2, 2, 2, 2, | |
| // f.7, f.8, f.9, f10, , , , ; 68h | |
| 2, 2, 2, 2, 0, 0, 0, 0, | |
| // SFT,CAPS,KANA,GRPH,CTRL, , , ; 70h | |
| 2, 2, 2, 2, 2, 0, 0, 0, | |
| // , , , , , , , ; 78h | |
| 0, 0, 0, 0, 0, 0, 0, 0}; | |
| // ---- | // ---- |
| void keystat_reset(void) { | void keystat_reset(void) { |
| ZeroMemory(keystat, sizeof(keystat)); | ZeroMemory(keystat.refer, sizeof(keystat.refer)); |
| } | } |
| void keystat_senddata(REG8 data) { | void keystat_senddata(REG8 data) { |
| Line 72 const _NKEYM *user; | Line 42 const _NKEYM *user; |
| if (data & 0x80) { | if (data & 0x80) { |
| return; | return; |
| } | } |
| data = key | (keystat[key] & 0x80); | data = key | (keystat.refer[key] & 0x80); |
| keystat[key] ^= 0x80; | keystat.refer[key] ^= 0x80; |
| } | } |
| else if ((key == 0x76) || (key == 0x77)) { // user key | else if ((key == 0x76) || (key == 0x77)) { // user key |
| user = np2cfg.userkey + (key - 0x76); | user = np2cfg.userkey + (key - 0x76); |
| for (i=0; i<user->keys; i++) { | for (i=0; i<user->keys; i++) { |
| key = user->key[i] & 0x7f; | key = user->key[i] & 0x7f; |
| if (!((keystat[key] ^ data) & 0x80)) { | if (!((keystat.refer[key] ^ data) & 0x80)) { |
| keystat[key] ^= 0x80; | keystat.refer[key] ^= 0x80; |
| keyboard_send((REG8)(key | (data & 0x80))); | keyboard_send((REG8)(key | (data & 0x80))); |
| } | } |
| } | } |
| Line 94 const _NKEYM *user; | Line 64 const _NKEYM *user; |
| if (data & 0x80) { | if (data & 0x80) { |
| return; | return; |
| } | } |
| data = key | (keystat[key] & 0x80); | data = key | (keystat.refer[key] & 0x80); |
| keystat[key] ^= 0x80; | keystat.refer[key] ^= 0x80; |
| } | } |
| else { | else { |
| // CTRL:カナ 0x79,0x7a bit7をそのまま通知 | // CTRL:カナ 0x79,0x7a bit7をそのまま通知 |
| Line 104 const _NKEYM *user; | Line 74 const _NKEYM *user; |
| key -= 0x08; | key -= 0x08; |
| data -= 0x08; | data -= 0x08; |
| } | } |
| if (!((keystat[key] ^ data) & 0x80)) { | if (!((keystat.refer[key] ^ data) & 0x80)) { |
| keystat[key] ^= 0x80; | keystat.refer[key] ^= 0x80; |
| } | } |
| else { | else { |
| keynochange = TRUE; | keynochange = TRUE; |
| Line 134 const _NKEYM *user; | Line 104 const _NKEYM *user; |
| key = value & 0x7f; | key = value & 0x7f; |
| if ((key != 0x76) && (key != 0x77)) { | if ((key != 0x76) && (key != 0x77)) { |
| if (keystat[key] & 0x80) { | if (keystat.refer[key] & 0x80) { |
| keystat[key] &= ~0x80; | keystat.refer[key] &= ~0x80; |
| keyboard_send((REG8)(key | 0x80)); | keyboard_send((REG8)(key | 0x80)); |
| } | } |
| } | } |
| Line 143 const _NKEYM *user; | Line 113 const _NKEYM *user; |
| user = np2cfg.userkey + (key - 0x76); | user = np2cfg.userkey + (key - 0x76); |
| for (i=0; i<user->keys; i++) { | for (i=0; i<user->keys; i++) { |
| key = user->key[i] & 0x7f; | key = user->key[i] & 0x7f; |
| if (keystat[key] & 0x80) { | if (keystat.refer[key] & 0x80) { |
| keystat[key] &= ~0x80; | keystat.refer[key] &= ~0x80; |
| keyboard_send((REG8)(key | 0x80)); | keyboard_send((REG8)(key | 0x80)); |
| } | } |
| } | } |
| } | } |
| } | } |
| void keystat_resetcopyhelp(void) { | |
| REG8 i; | |
| for (i=0x60; i<0x62; i++) { | |
| if (keystat[i] & 0x80) { | |
| keystat[i] &= 0x7f; | |
| keyboard_send((REG8)(i | 0x80)); | |
| } | |
| } | |
| } | |
| void keystat_allrelease(void) { | void keystat_allrelease(void) { |
| REG8 i; | REG8 i; |
| for (i=0; i<0x80; i++) { | for (i=0; i<0x80; i++) { |
| if (keystat[i] & 0x80) { | if (keystat.refer[i] & 0x80) { |
| keystat[i] &= ~0x80; | keystat.refer[i] &= ~0x80; |
| keyboard_send((REG8)(i | 0x80)); | keyboard_send((REG8)(i | 0x80)); |
| } | } |
| } | } |
| Line 182 void keystat_resetjoykey(void) { | Line 140 void keystat_resetjoykey(void) { |
| for (i=0; i<12; i++) { | for (i=0; i<12; i++) { |
| key = joykeytable[i]; | key = joykeytable[i]; |
| if (keystat[key] & 0x80) { | if (keystat.refer[key] & 0x80) { |
| keystat[key] &= 0x7f; | keystat.refer[key] &= 0x7f; |
| keyboard_send((REG8)(key | 0x80)); | keyboard_send((REG8)(key | 0x80)); |
| } | } |
| } | } |
| Line 194 void keystat_resendstat(void) { | Line 152 void keystat_resendstat(void) { |
| int i; | int i; |
| for (i=0; i<0x80; i++) { | for (i=0; i<0x80; i++) { |
| if (keystat[i]) { | if (keystat.refer[i]) { |
| keyboard_send((REG8)i); | keyboard_send((REG8)i); |
| } | } |
| } | } |
| Line 203 void keystat_resendstat(void) { | Line 161 void keystat_resendstat(void) { |
| // ---- | // ---- |
| typedef struct { | |
| UINT8 joysync; | |
| UINT8 joylast; | |
| UINT8 mouselast; | |
| UINT8 padding; | |
| UINT8 d_up; | |
| UINT8 d_dn; | |
| UINT8 d_lt; | |
| UINT8 d_rt; | |
| } KEYEXT; | |
| static KEYEXT keyext; | |
| static const UINT8 mousedelta[] = {1, 1, 1, 1, | |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4}; | |
| #define MOUSESTEPMAX ((sizeof(mousedelta) / sizeof(UINT8)) - 1) | |
| void keystat_sync(void) { | void keystat_sync(void) { |
| keyext.joysync = 0; | keystat.joysync = 0; |
| } | } |
| REG8 keystat_getjoy(void) { | REG8 keystat_getjoy(void) { |
| BYTE flg; | UINT8 flg; |
| const BYTE *p; | const BYTE *p; |
| BYTE bit; | UINT8 bit; |
| if (!keyext.joysync) { | if (!keystat.joysync) { |
| keyext.joysync = 1; | keystat.joysync = 1; |
| flg = 0xff; | flg = 0xff; |
| p = joykeytable; | p = joykeytable; |
| for (bit=0x20; bit; bit>>=1) { | for (bit=0x20; bit; bit>>=1) { |
| if ((keystat[p[0]] & 0x80) || (keystat[p[1]] & 0x80)) { | if ((keystat.refer[p[0]] & 0x80) || |
| (keystat.refer[p[1]] & 0x80)) { | |
| flg ^= bit; | flg ^= bit; |
| } | } |
| p += 2; | p += 2; |
| } | } |
| keyext.joylast = flg; | keystat.joylast = flg; |
| } | } |
| return(keyext.joylast); | return(keystat.joylast); |
| } | } |
| REG8 keystat_getmouse(SINT16 *x, SINT16 *y) { | REG8 keystat_getmouse(SINT16 *x, SINT16 *y) { |
| REG8 btn; | REG8 btn; |
| BYTE acc; | UINT8 acc; |
| SINT16 tmp; | SINT16 tmp; |
| BYTE ret; | REG8 ret; |
| btn = keystat_getjoy(); | btn = keystat_getjoy(); |
| acc = btn | keyext.mouselast; | acc = btn | keystat.mouselast; |
| keyext.mouselast = (UINT8)btn; | keystat.mouselast = (UINT8)btn; |
| tmp = 0; | tmp = 0; |
| if (!(btn & 1)) { | if (!(btn & 1)) { |
| tmp -= mousedelta[keyext.d_up]; | tmp -= mousedelta[keystat.d_up]; |
| } | } |
| if (!(acc & 1)) { | if (!(acc & 1)) { |
| if (keyext.d_up < MOUSESTEPMAX) { | if (keystat.d_up < MOUSESTEPMAX) { |
| keyext.d_up++; | keystat.d_up++; |
| } | } |
| } | } |
| else { | else { |
| keyext.d_up = 0; | keystat.d_up = 0; |
| } | } |
| if (!(btn & 2)) { | if (!(btn & 2)) { |
| tmp += mousedelta[keyext.d_dn]; | tmp += mousedelta[keystat.d_dn]; |
| } | } |
| if (!(acc & 2)) { | if (!(acc & 2)) { |
| if (keyext.d_dn < MOUSESTEPMAX) { | if (keystat.d_dn < MOUSESTEPMAX) { |
| keyext.d_dn++; | keystat.d_dn++; |
| } | } |
| } | } |
| else { | else { |
| keyext.d_dn = 0; | keystat.d_dn = 0; |
| } | } |
| *y += tmp; | *y += tmp; |
| tmp = 0; | tmp = 0; |
| if (!(btn & 4)) { | if (!(btn & 4)) { |
| tmp -= mousedelta[keyext.d_lt]; | tmp -= mousedelta[keystat.d_lt]; |
| } | } |
| if (!(acc & 4)) { | if (!(acc & 4)) { |
| if (keyext.d_lt < MOUSESTEPMAX) { | if (keystat.d_lt < MOUSESTEPMAX) { |
| keyext.d_lt++; | keystat.d_lt++; |
| } | } |
| } | } |
| else { | else { |
| keyext.d_lt = 0; | keystat.d_lt = 0; |
| } | } |
| if (!(btn & 8)) { | if (!(btn & 8)) { |
| tmp += mousedelta[keyext.d_rt]; | tmp += mousedelta[keystat.d_rt]; |
| } | } |
| if (!(acc & 8)) { | if (!(acc & 8)) { |
| if (keyext.d_rt < MOUSESTEPMAX) { | if (keystat.d_rt < MOUSESTEPMAX) { |
| keyext.d_rt++; | keystat.d_rt++; |
| } | } |
| } | } |
| else { | else { |
| keyext.d_rt = 0; | keystat.d_rt = 0; |
| } | } |
| *x += tmp; | *x += tmp; |