|
|
| version 1.12, 2004/02/18 03:24:48 | version 1.18, 2004/03/31 11:59:18 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "cpucore.h" | |
| #include "commng.h" | #include "commng.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| Line 9 | Line 10 |
| static void keyboard_int(BOOL absolute) { | static void keyboard_int(BOOL absolute) { |
| if (keybrd.buffers) { | if ((keybrd.ctrls) || (keybrd.buffers)) { |
| if (!(keybrd.status & 2)) { | if (!(keybrd.status & 2)) { |
| keybrd.status |= 2; | keybrd.status |= 2; |
| keybrd.data = keybrd.buf[keybrd.pos]; | if (keybrd.ctrls) { |
| keybrd.pos = (keybrd.pos + 1) & KB_BUFMASK; | keybrd.ctrls--; |
| keybrd.buffers--; | keybrd.data = keybrd.ctr[keybrd.ctrpos]; |
| keybrd.ctrpos = (keybrd.ctrpos + 1) & KB_CTRMASK; | |
| } | |
| else if (keybrd.buffers) { | |
| keybrd.buffers--; | |
| keybrd.data = keybrd.buf[keybrd.bufpos]; | |
| keybrd.bufpos = (keybrd.bufpos + 1) & KB_BUFMASK; | |
| } | |
| TRACEOUT(("recv -> %02x", keybrd.data)); | |
| } | } |
| pic_setirq(1); | pic_setirq(1); |
| nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, | nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, |
| Line 31 void keyboard_callback(NEVENTITEM item) | Line 40 void keyboard_callback(NEVENTITEM item) |
| static void IOOUTCALL keyboard_o41(UINT port, REG8 dat) { | static void IOOUTCALL keyboard_o41(UINT port, REG8 dat) { |
| keybrd.mode = dat; | if (keybrd.cmd & 1) { |
| TRACEOUT(("send -> %02x", dat)); | |
| keystat_ctrlsend(dat); | |
| } | |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL keyboard_o43(UINT port, REG8 dat) { | static void IOOUTCALL keyboard_o43(UINT port, REG8 dat) { |
| TRACEOUT(("out43 -> %02x %.4x:%.8x", dat, CPU_CS, CPU_EIP)); | |
| if ((!(dat & 0x08)) && (keybrd.cmd & 0x08)) { | if ((!(dat & 0x08)) && (keybrd.cmd & 0x08)) { |
| keyboard_resetsignal(); | keyboard_resetsignal(); |
| } | } |
| Line 51 static REG8 IOINPCALL keyboard_i41(UINT | Line 64 static REG8 IOINPCALL keyboard_i41(UINT |
| (void)port; | (void)port; |
| keybrd.status &= ~2; | keybrd.status &= ~2; |
| TRACEOUT(("in41 -> %02x %.4x:%.8x", keybrd.data, CPU_CS, CPU_EIP)); | |
| return(keybrd.data); | return(keybrd.data); |
| } | } |
| static REG8 IOINPCALL keyboard_i43(UINT port) { | static REG8 IOINPCALL keyboard_i43(UINT port) { |
| (void)port; | (void)port; |
| return(keybrd.status); | TRACEOUT(("in43 -> %02x %.4x:%.8x", keybrd.status, CPU_CS, CPU_EIP)); |
| return(keybrd.status | 0x85); | |
| } | } |
| Line 74 void keyboard_reset(void) { | Line 89 void keyboard_reset(void) { |
| ZeroMemory(&keybrd, sizeof(keybrd)); | ZeroMemory(&keybrd, sizeof(keybrd)); |
| keybrd.data = 0xff; | keybrd.data = 0xff; |
| keybrd.mode = 0x5e; | |
| } | } |
| void keyboard_bind(void) { | void keyboard_bind(void) { |
| Line 86 void keyboard_bind(void) { | Line 100 void keyboard_bind(void) { |
| void keyboard_resetsignal(void) { | void keyboard_resetsignal(void) { |
| keybrd.mode = 0x5e; | |
| keybrd.cmd = 0; | keybrd.cmd = 0; |
| keybrd.status = 0; | keybrd.status = 0; |
| keybrd.ctrls = 0; | |
| keybrd.buffers = 0; | keybrd.buffers = 0; |
| keybrd.pos = 0; | keystat_ctrlreset(); |
| keystat_resendstat(); | keystat_resendstat(); |
| } | } |
| void keyboard_ctrl(REG8 data) { | |
| if ((data == 0xfa) || (data == 0xfc)) { | |
| keybrd.ctrls = 0; | |
| } | |
| if (keybrd.ctrls < KB_CTR) { | |
| keybrd.ctr[(keybrd.ctrpos + keybrd.ctrls) & KB_CTRMASK] = data; | |
| keybrd.ctrls++; | |
| if (!nevent_iswork(NEVENT_KEYBOARD)) { | |
| keyboard_int(NEVENT_ABSOLUTE); | |
| } | |
| } | |
| } | |
| void keyboard_send(REG8 data) { | void keyboard_send(REG8 data) { |
| if (keybrd.buffers < KB_BUF) { | if (keybrd.buffers < KB_BUF) { |
| keybrd.buf[(keybrd.pos + keybrd.buffers) & KB_BUFMASK] = data; | keybrd.buf[(keybrd.bufpos + keybrd.buffers) & KB_BUFMASK] = data; |
| keybrd.buffers++; | keybrd.buffers++; |
| if (!nevent_iswork(NEVENT_KEYBOARD)) { | if (!nevent_iswork(NEVENT_KEYBOARD)) { |
| keyboard_int(NEVENT_ABSOLUTE); | keyboard_int(NEVENT_ABSOLUTE); |
| Line 242 static void IOOUTCALL rs232c_o32(UINT po | Line 270 static void IOOUTCALL rs232c_o32(UINT po |
| break; | break; |
| case 0x02: // cmd | case 0x02: // cmd |
| sysport.c &= ~7; | |
| sysport.c |= (dat & 7); | |
| rs232c.pos++; | rs232c.pos++; |
| break; | break; |
| } | } |