| version 1.16, 2004/03/30 08:48:46 | version 1.24, 2007/11/03 00:00:20 | 
| 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 7 | Line 8 | 
 |  |  | 
 | // ---- Keyboard | // ---- Keyboard | 
 |  |  | 
 | static void keyboard_int(BOOL absolute) { |  | 
 |  |  | 
 | if ((keybrd.ctrls) || (keybrd.buffers)) { |  | 
 | if (!(keybrd.status & 2)) { |  | 
 | keybrd.status |= 2; |  | 
 | if (keybrd.ctrls) { |  | 
 | keybrd.ctrls--; |  | 
 | 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); |  | 
 | nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, |  | 
 | keyboard_callback, absolute); |  | 
 | } |  | 
 | } |  | 
 |  |  | 
 | void keyboard_callback(NEVENTITEM item) { | void keyboard_callback(NEVENTITEM item) { | 
 |  |  | 
 | if (item->flag & NEVENT_SETEVENT) { | if (item->flag & NEVENT_SETEVENT) { | 
| keyboard_int(NEVENT_RELATIVE); | if ((keybrd.ctrls) || (keybrd.buffers)) { | 
|  | if (!(keybrd.status & 2)) { | 
|  | keybrd.status |= 2; | 
|  | if (keybrd.ctrls) { | 
|  | keybrd.ctrls--; | 
|  | 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); | 
|  | nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, | 
|  | keyboard_callback, NEVENT_RELATIVE); | 
|  | } | 
 | } | } | 
 | } | } | 
 |  |  | 
 | static void IOOUTCALL keyboard_o41(UINT port, REG8 dat) { | static void IOOUTCALL keyboard_o41(UINT port, REG8 dat) { | 
 |  |  | 
 | if (keybrd.cmd & 1) { | if (keybrd.cmd & 1) { | 
| TRACEOUT(("send -> %02x", dat)); | //              TRACEOUT(("send -> %02x", dat)); | 
| keystat_ctrl(dat); | keystat_ctrlsend(dat); | 
|  | } | 
|  | else { | 
|  | keybrd.mode = 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 62  static REG8 IOINPCALL keyboard_i41(UINT | Line 62  static REG8 IOINPCALL keyboard_i41(UINT | 
 |  |  | 
 | (void)port; | (void)port; | 
 | keybrd.status &= ~2; | keybrd.status &= ~2; | 
 |  | pic_resetirq(1); | 
 |  | //      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 81  static const IOINP keybrdi41[2] = { | Line 84  static const IOINP keybrdi41[2] = { | 
 | keyboard_i41,   keyboard_i43}; | keyboard_i41,   keyboard_i43}; | 
 |  |  | 
 |  |  | 
| void keyboard_reset(void) { | void keyboard_reset(const NP2CFG *pConfig) { | 
 |  |  | 
 | ZeroMemory(&keybrd, sizeof(keybrd)); | ZeroMemory(&keybrd, sizeof(keybrd)); | 
 | keybrd.data = 0xff; | keybrd.data = 0xff; | 
 |  | keybrd.mode = 0x5e; | 
 |  |  | 
 |  | (void)pConfig; | 
 | } | } | 
 |  |  | 
 | void keyboard_bind(void) { | void keyboard_bind(void) { | 
 |  |  | 
 |  | keystat_ctrlreset(); | 
 | keybrd.xferclock = pccore.realclock / 1920; | keybrd.xferclock = pccore.realclock / 1920; | 
 | iocore_attachsysoutex(0x0041, 0x0cf1, keybrdo41, 2); | iocore_attachsysoutex(0x0041, 0x0cf1, keybrdo41, 2); | 
 | iocore_attachsysinpex(0x0041, 0x0cf1, keybrdi41, 2); | iocore_attachsysinpex(0x0041, 0x0cf1, keybrdi41, 2); | 
| Line 96  void keyboard_bind(void) { | Line 103  void keyboard_bind(void) { | 
 |  |  | 
 | void keyboard_resetsignal(void) { | void keyboard_resetsignal(void) { | 
 |  |  | 
 |  | nevent_reset(NEVENT_KEYBOARD); | 
 | keybrd.cmd = 0; | keybrd.cmd = 0; | 
 | keybrd.status = 0; | keybrd.status = 0; | 
 | keybrd.ctrls = 0; | keybrd.ctrls = 0; | 
 | keybrd.buffers = 0; | keybrd.buffers = 0; | 
 |  | keystat_ctrlreset(); | 
 | keystat_resendstat(); | keystat_resendstat(); | 
 | } | } | 
 |  |  | 
| Line 112  void keyboard_ctrl(REG8 data) { | Line 121  void keyboard_ctrl(REG8 data) { | 
 | keybrd.ctr[(keybrd.ctrpos + keybrd.ctrls) & KB_CTRMASK] = data; | keybrd.ctr[(keybrd.ctrpos + keybrd.ctrls) & KB_CTRMASK] = data; | 
 | keybrd.ctrls++; | keybrd.ctrls++; | 
 | if (!nevent_iswork(NEVENT_KEYBOARD)) { | if (!nevent_iswork(NEVENT_KEYBOARD)) { | 
| keyboard_int(NEVENT_ABSOLUTE); | nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, | 
|  | keyboard_callback, NEVENT_ABSOLUTE); | 
 | } | } | 
 | } | } | 
 | } | } | 
| Line 123  void keyboard_send(REG8 data) { | Line 133  void keyboard_send(REG8 data) { | 
 | keybrd.buf[(keybrd.bufpos + 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); | nevent_set(NEVENT_KEYBOARD, keybrd.xferclock, | 
|  | keyboard_callback, NEVENT_ABSOLUTE); | 
 | } | } | 
 | } | } | 
 | else { | else { | 
| Line 167  void rs232c_callback(void) { | Line 178  void rs232c_callback(void) { | 
 | } | } | 
 | } | } | 
 | else { | else { | 
| rs232c.result &= (BYTE)~2; | rs232c.result &= (UINT8)~2; | 
 | } | } | 
 | if (sysport.c & 4) { | if (sysport.c & 4) { | 
 | if (rs232c.send) { | if (rs232c.send) { | 
| Line 180  void rs232c_callback(void) { | Line 191  void rs232c_callback(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| BYTE rs232c_stat(void) { | UINT8 rs232c_stat(void) { | 
 |  |  | 
 | if (cm_rs232c == NULL) { | if (cm_rs232c == NULL) { | 
 | cm_rs232c = commng_create(COMCREATE_SERIAL); | cm_rs232c = commng_create(COMCREATE_SERIAL); | 
| Line 299  static const IOOUT rs232co30[2] = { | Line 310  static const IOOUT rs232co30[2] = { | 
 | static const IOINP rs232ci30[2] = { | static const IOINP rs232ci30[2] = { | 
 | rs232c_i30,     rs232c_i32}; | rs232c_i30,     rs232c_i32}; | 
 |  |  | 
| void rs232c_reset(void) { | void rs232c_reset(const NP2CFG *pConfig) { | 
 |  |  | 
 | commng_destroy(cm_rs232c); | commng_destroy(cm_rs232c); | 
 | cm_rs232c = NULL; | cm_rs232c = NULL; | 
| Line 309  void rs232c_reset(void) { | Line 320  void rs232c_reset(void) { | 
 | rs232c.pos = 0; | rs232c.pos = 0; | 
 | rs232c.dummyinst = 0; | rs232c.dummyinst = 0; | 
 | rs232c.mul = 10 * 16; | rs232c.mul = 10 * 16; | 
 |  |  | 
 |  | (void)pConfig; | 
 | } | } | 
 |  |  | 
 | void rs232c_bind(void) { | void rs232c_bind(void) { |