--- np2/io/serial.c 2003/10/16 17:57:57 1.1 +++ np2/io/serial.c 2004/01/13 05:30:58 1.8 @@ -1,12 +1,10 @@ #include "compiler.h" -#include "dosio.h" #include "commng.h" -#include "memory.h" #include "pccore.h" #include "iocore.h" -static const BYTE joykeytable[12] = { +static const UINT8 joykeytable[12] = { 0x2a, 0x34, 0x29, 0x1c, 0x3c, 0x48, @@ -14,7 +12,7 @@ static const BYTE joykeytable[12] = { 0x3d, 0x4b, 0x3a, 0x43}; -static const BYTE kbexflag[0x80] = { +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 @@ -59,7 +57,7 @@ static void keyb_int(BOOL absolute) { keyb.buffers--; pic_setirq(1); } - nevent_set(NEVENT_KEYBOARD, pc.keyboardclock, + nevent_set(NEVENT_KEYBOARD, pccore.keyboardclock, keyb_callback, absolute); } else { @@ -74,7 +72,7 @@ void keyb_callback(NEVENTITEM item) { } } -static void keyb_out(BYTE data) { +static void keyb_out(REG8 data) { if (keyb.buffers < KB_BUF) { keyb.buf[(keyb.pos + keyb.buffers) & KB_BUFMASK] = data; @@ -91,18 +89,23 @@ static void keyb_out(BYTE data) { // ---- - BYTE keystat[0x80]; + UINT8 keystat[0x80]; void keystat_reset(void) { ZeroMemory(keystat, sizeof(keystat)); } -void keystat_senddata(BYTE data) { - BYTE key = data & 0x7f; - BOOL keynochange = FALSE; +void keystat_senddata(REG8 data) { + REG8 key; + BOOL keynochange; + + key = data & 0x7f; + keynochange = FALSE; + + // CTRL:カナ 0x71,0x72 bit7==0でトグル処理 (標準処理) if ((key == 0x71) || (key == 0x72)) { if (data & 0x80) { return; @@ -112,9 +115,9 @@ void keystat_senddata(BYTE data) { } else { if ((np2cfg.XSHIFT) && - ((key == 0x70) && (np2cfg.XSHIFT & 1)) || + (((key == 0x70) && (np2cfg.XSHIFT & 1)) || ((key == 0x74) && (np2cfg.XSHIFT & 2)) || - ((key == 0x73) && (np2cfg.XSHIFT & 4))) { + ((key == 0x73) && (np2cfg.XSHIFT & 4)))) { if (data & 0x80) { return; } @@ -122,6 +125,12 @@ void keystat_senddata(BYTE data) { keystat[key] ^= 0x80; } else { + // CTRL:カナ 0x79,0x7a bit7をそのまま通知 + // (ハードウェアでメカニカル処理してる場合) + if ((key == 0x79) || (key == 0x7a)) { + key -= 0x08; + data -= 0x08; + } if (!((keystat[key] ^ data) & 0x80)) { keystat[key] ^= 0x80; } @@ -138,7 +147,7 @@ void keystat_senddata(BYTE data) { if (data & 0x80) { // ver0.30 return; } - keyb_out((BYTE)(data ^ 0x80)); + keyb_out((REG8)(data ^ 0x80)); } keyb_out(data); } @@ -146,62 +155,171 @@ void keystat_senddata(BYTE data) { void keystat_resetcopyhelp(void) { - BYTE i; + REG8 i; for (i=0x60; i<0x62; i++) { if (keystat[i] & 0x80) { keystat[i] &= 0x7f; - keyb_out((BYTE)(i | 0x80)); + keyb_out((REG8)(i | 0x80)); + } + } +} + +void keystat_allrelease(void) { + + REG8 i; + + for (i=0; i<0x80; i++) { + if (keystat[i] & 0x80) { + keystat[i] &= ~0x80; + keyb_out((REG8)(i | 0x80)); } } } -void keystat_forcerelease(BYTE value) { +void keystat_forcerelease(REG8 value) { if (keystat[value & 0x7f] & 0x80) { keystat[value & 0x7f] &= ~0x80; - keyb_out((BYTE)(value | 0x80)); + keyb_out((REG8)(value | 0x80)); } } void keystat_resetjoykey(void) { int i; - BYTE key; + REG8 key; for (i=0; i<12; i++) { key = joykeytable[i]; if (keystat[key] & 0x80) { keystat[key] &= 0x7f; - keyb_out((BYTE)(key | 0x80)); + keyb_out((REG8)(key | 0x80)); } } } -BYTE keystat_getjoy(void) { - BYTE ret = 0xff; - BYTE *p = (BYTE *)joykeytable; +// ---- + +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 keyext_flash(void) { + + keyext.joysync = 0; +} + +BYTE keyext_getjoy(void) { + + BYTE flg; +const BYTE *p; BYTE bit; - for (bit=0x20; bit; bit>>=1, p+=2) { - if ((keystat[*p] & 0x80) || (keystat[*(p+1)] & 0x80)) { - ret &= ~bit; + if (!keyext.joysync) { + keyext.joysync = 1; + flg = 0xff; + p = joykeytable; + for (bit=0x20; bit; bit>>=1) { + if ((keystat[p[0]] & 0x80) || (keystat[p[1]] & 0x80)) { + flg ^= bit; + } + p += 2; + } + keyext.joylast = flg; + } + return(keyext.joylast); +} + +BYTE keyext_getmouse(SINT16 *x, SINT16 *y) { + + BYTE btn; + BYTE acc; + SINT16 tmp; + BYTE ret; + + btn = keyext_getjoy(); + acc = btn | keyext.mouselast; + keyext.mouselast = btn; + tmp = 0; + if (!(btn & 1)) { + tmp -= mousedelta[keyext.d_up]; + } + if (!(acc & 1)) { + if (keyext.d_up < MOUSESTEPMAX) { + keyext.d_up++; + } + } + else { + keyext.d_up = 0; + } + if (!(btn & 2)) { + tmp += mousedelta[keyext.d_dn]; + } + if (!(acc & 2)) { + if (keyext.d_dn < MOUSESTEPMAX) { + keyext.d_dn++; + } + } + else { + keyext.d_dn = 0; + } + *y += tmp; + + tmp = 0; + if (!(btn & 4)) { + tmp -= mousedelta[keyext.d_lt]; + } + if (!(acc & 4)) { + if (keyext.d_lt < MOUSESTEPMAX) { + keyext.d_lt++; } } + else { + keyext.d_lt = 0; + } + if (!(btn & 8)) { + tmp += mousedelta[keyext.d_rt]; + } + if (!(acc & 8)) { + if (keyext.d_rt < MOUSESTEPMAX) { + keyext.d_rt++; + } + } + else { + keyext.d_rt = 0; + } + *x += tmp; + + ret = 0x5f; + ret += (btn & 0x10) << 3; + ret += (btn & 0x20); return(ret); } // ---- -static void IOOUTCALL keyb_o41(UINT port, BYTE dat) { +static void IOOUTCALL keyb_o41(UINT port, REG8 dat) { keyb.mode = dat; (void)port; } -static void IOOUTCALL keyb_o43(UINT port, BYTE dat) { +static void IOOUTCALL keyb_o43(UINT port, REG8 dat) { if ((!(dat & 0x08)) && (keyb.cmd & 0x08)) { keyboard_resetsignal(); @@ -213,13 +331,13 @@ static void IOOUTCALL keyb_o43(UINT port (void)port; } -static BYTE IOINPCALL keyb_i41(UINT port) { +static REG8 IOINPCALL keyb_i41(UINT port) { (void)port; return(keyb.data); } -static BYTE IOINPCALL keyb_i43(UINT port) { +static REG8 IOINPCALL keyb_i43(UINT port) { (void)port; return(keyb.status); @@ -255,7 +373,7 @@ void keyboard_resetsignal(void) { keyboard_reset(); for (i=0; i<0x80; i++) { if (keystat[i]) { - keyb_out((BYTE)i); + keyb_out((REG8)i); } } } @@ -288,6 +406,7 @@ void rs232c_callback(void) { BOOL interrupt; + interrupt = FALSE; if ((cm_rs232c) && (cm_rs232c->read(cm_rs232c, &rs232c.data))) { rs232c.result |= 2; if (sysport.c & 1) { @@ -326,10 +445,10 @@ void rs232c_midipanic(void) { // ---- -static void IOOUTCALL rs232c_o30(UINT port, BYTE dat) { +static void IOOUTCALL rs232c_o30(UINT port, REG8 dat) { if (cm_rs232c) { - cm_rs232c->write(cm_rs232c, dat); + cm_rs232c->write(cm_rs232c, (UINT8)dat); } if (sysport.c & 4) { rs232c.send = 0; @@ -341,7 +460,7 @@ static void IOOUTCALL rs232c_o30(UINT po (void)port; } -static void IOOUTCALL rs232c_o32(UINT port, BYTE dat) { +static void IOOUTCALL rs232c_o32(UINT port, REG8 dat) { if (!(dat & 0xfd)) { rs232c.dummyinst++; @@ -399,13 +518,13 @@ static void IOOUTCALL rs232c_o32(UINT po (void)port; } -static BYTE IOINPCALL rs232c_i30(UINT port) { +static REG8 IOINPCALL rs232c_i30(UINT port) { (void)port; return(rs232c.data); } -static BYTE IOINPCALL rs232c_i32(UINT port) { +static REG8 IOINPCALL rs232c_i32(UINT port) { if (!(rs232c_stat() & 0x20)) { return(rs232c.result | 0x80);