src/mess/machine/keyboard.c
| r0 | r14775 | |
| 1 | /*************************************************************************** |
| 2 | Generic ASCII Keyboard |
| 3 | |
| 4 | Use MCFG_SERIAL_KEYBOARD_ADD to attach this as a serial device to a terminal |
| 5 | or computer. |
| 6 | |
| 7 | Use MCFG_ASCII_KEYBOARD_ADD to attach as a generic ascii input device in |
| 8 | cases where either the driver isn't developed enough yet; or for testing; |
| 9 | or for the rare case of a computer with an inbuilt (not serial) ascii |
| 10 | keyboard. |
| 11 | |
| 12 | Example of usage in a driver. |
| 13 | |
| 14 | In MACHINE_CONFIG |
| 15 | MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) |
| 16 | |
| 17 | In the code: |
| 18 | |
| 19 | WRITE8_MEMBER( xxx_state::kbd_put ) |
| 20 | { |
| 21 | (code to capture the key as it is pressed) |
| 22 | } |
| 23 | |
| 24 | static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) |
| 25 | { |
| 26 | DEVCB_DRIVER_MEMBER(xxx_state, kbd_put) |
| 27 | }; |
| 28 | |
| 29 | ***************************************************************************/ |
| 30 | |
| 31 | #include "machine/keyboard.h" |
| 32 | |
| 33 | /*************************************************************************** |
| 34 | IMPLEMENTATION |
| 35 | ***************************************************************************/ |
| 36 | |
| 37 | |
| 38 | generic_keyboard_device::generic_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) |
| 39 | : device_t(mconfig, type, name, tag, owner, clock) |
| 40 | { |
| 41 | } |
| 42 | |
| 43 | generic_keyboard_device::generic_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 44 | : device_t(mconfig, GENERIC_KEYBOARD, "Generic Keyboard", tag, owner, clock) |
| 45 | { |
| 46 | } |
| 47 | |
| 48 | |
| 49 | UINT8 generic_keyboard_device::row_number(UINT8 code) |
| 50 | { |
| 51 | if BIT(code,0) return 0; |
| 52 | if BIT(code,1) return 1; |
| 53 | if BIT(code,2) return 2; |
| 54 | if BIT(code,3) return 3; |
| 55 | if BIT(code,4) return 4; |
| 56 | if BIT(code,5) return 5; |
| 57 | if BIT(code,6) return 6; |
| 58 | if BIT(code,7) return 7; |
| 59 | return 0; |
| 60 | } |
| 61 | |
| 62 | UINT8 generic_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) |
| 63 | { |
| 64 | static const char *const keynames[] = { "TERM_LINE0", "TERM_LINE1", "TERM_LINE2", "TERM_LINE3", "TERM_LINE4", "TERM_LINE5", "TERM_LINE6", "TERM_LINE7" }; |
| 65 | int i; |
| 66 | UINT8 code; |
| 67 | UINT8 key_code = 0; |
| 68 | UINT8 retVal = 0; |
| 69 | UINT8 shift = BIT(input_port_read(*this, "TERM_LINEC"), 1); |
| 70 | UINT8 caps = BIT(input_port_read(*this, "TERM_LINEC"), 2); |
| 71 | UINT8 ctrl = BIT(input_port_read(*this, "TERM_LINEC"), 0); |
| 72 | i = *scan_line; |
| 73 | { |
| 74 | code = input_port_read(*this, keynames[i]); |
| 75 | if (code != 0) |
| 76 | { |
| 77 | if (i==0 && shift==0) { |
| 78 | key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs |
| 79 | } |
| 80 | if (i==0 && shift==1) { |
| 81 | key_code = 0x20 + row_number(code) + 8*i; // for shifted numbers |
| 82 | } |
| 83 | if (i==1 && shift==0) { |
| 84 | if (row_number(code) < 4) { |
| 85 | key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs |
| 86 | } else { |
| 87 | key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs |
| 88 | } |
| 89 | } |
| 90 | if (i==1 && shift==1) { |
| 91 | if (row_number(code) < 4) { |
| 92 | key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs |
| 93 | } else { |
| 94 | key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs |
| 95 | } |
| 96 | } |
| 97 | if (i>=2 && i<=4 && (shift ^ caps)==0 && ctrl==0) { |
| 98 | key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters |
| 99 | } |
| 100 | if (i>=2 && i<=4 && (shift ^ caps)==1 && ctrl==0) { |
| 101 | key_code = 0x40 + row_number(code) + (i-2)*8; // for big letters |
| 102 | } |
| 103 | if (i>=2 && i<=4 && ctrl==1) { |
| 104 | key_code = 0x00 + row_number(code) + (i-2)*8; // for CTRL + letters |
| 105 | } |
| 106 | if (i==5 && shift==1 && ctrl==0) { |
| 107 | if (row_number(code)<7) { |
| 108 | if (row_number(code)<3) { |
| 109 | key_code = (caps ? 0x60 : 0x40) + row_number(code) + (i-2)*8; // for big letters |
| 110 | } else { |
| 111 | key_code = 0x60 + row_number(code) + (i-2)*8; // for upper symbols letters |
| 112 | } |
| 113 | } else { |
| 114 | key_code = 0x40 + row_number(code) + (i-2)*8; // for DEL it is switched |
| 115 | } |
| 116 | } |
| 117 | if (i==5 && shift==0 && ctrl==0) { |
| 118 | if (row_number(code)<7) { |
| 119 | if (row_number(code)<3) { |
| 120 | key_code = (caps ? 0x40 : 0x60) + row_number(code) + (i-2)*8; // for small letters |
| 121 | } else { |
| 122 | key_code = 0x40 + row_number(code) + (i-2)*8; // for lower symbols letters |
| 123 | } |
| 124 | } else { |
| 125 | key_code = 0x60 + row_number(code) + (i-2)*8; // for DEL it is switched |
| 126 | } |
| 127 | } |
| 128 | if (i==5 && shift==1 && ctrl==1) { |
| 129 | key_code = 0x00 + row_number(code) + (i-2)*8; // for letters + ctrl |
| 130 | } |
| 131 | if (i==6) { |
| 132 | switch(row_number(code)) |
| 133 | { |
| 134 | /* case 0: key_code = 0x11; break; |
| 135 | case 1: key_code = 0x12; break; |
| 136 | case 2: key_code = 0x13; break; |
| 137 | case 3: key_code = 0x14; break;*/ |
| 138 | case 4: key_code = 0x20; break; // Space |
| 139 | case 5: key_code = 0x0A; break; // LineFeed |
| 140 | case 6: key_code = 0x09; break; // TAB |
| 141 | case 7: key_code = 0x0D; break; // Enter |
| 142 | } |
| 143 | } |
| 144 | if (i==7) |
| 145 | { |
| 146 | switch(row_number(code)) |
| 147 | { |
| 148 | case 0: key_code = 0x1B; break; // Escape |
| 149 | } |
| 150 | } |
| 151 | retVal = key_code; |
| 152 | } else { |
| 153 | *scan_line += 1; |
| 154 | if (*scan_line==8) { |
| 155 | *scan_line = 0; |
| 156 | } |
| 157 | } |
| 158 | } |
| 159 | return retVal; |
| 160 | } |
| 161 | |
| 162 | void generic_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 163 | { |
| 164 | UINT8 new_code; |
| 165 | new_code = keyboard_handler(m_last_code, &m_scan_line); |
| 166 | if(m_last_code != new_code) |
| 167 | send_key(new_code); |
| 168 | m_last_code = new_code; |
| 169 | } |
| 170 | |
| 171 | /*************************************************************************** |
| 172 | VIDEO HARDWARE |
| 173 | ***************************************************************************/ |
| 174 | |
| 175 | static MACHINE_CONFIG_FRAGMENT( generic_keyboard ) |
| 176 | MACHINE_CONFIG_END |
| 177 | |
| 178 | machine_config_constructor generic_keyboard_device::device_mconfig_additions() const |
| 179 | { |
| 180 | return MACHINE_CONFIG_NAME(generic_keyboard); |
| 181 | } |
| 182 | |
| 183 | void generic_keyboard_device::device_start() |
| 184 | { |
| 185 | m_keyboard_func.resolve(m_keyboard_cb, *this); |
| 186 | m_timer = timer_alloc(); |
| 187 | } |
| 188 | |
| 189 | void generic_keyboard_device::device_config_complete() |
| 190 | { |
| 191 | const _keyboard_interface *intf = reinterpret_cast<const _keyboard_interface *>(static_config()); |
| 192 | if(intf != NULL) |
| 193 | { |
| 194 | *static_cast<_keyboard_interface *>(this) = *intf; |
| 195 | } |
| 196 | else |
| 197 | { |
| 198 | memset(&m_keyboard_cb, 0, sizeof(m_keyboard_cb)); |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | void generic_keyboard_device::device_reset() |
| 203 | { |
| 204 | m_last_code = 0; |
| 205 | m_scan_line = 0; |
| 206 | m_timer->adjust(attotime::from_hz(2400), 0, attotime::from_hz(2400)); |
| 207 | } |
| 208 | |
| 209 | /* |
| 210 | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex |
| 211 | ------------------------------------------------------------------------------------- |
| 212 | (nul) 0 0000 0x00 | (sp) 32 0040 0x20 | @ 64 0100 0x40 | ` 96 0140 0x60 |
| 213 | (soh) 1 0001 0x01 | ! 33 0041 0x21 | A 65 0101 0x41 | a 97 0141 0x61 |
| 214 | (stx) 2 0002 0x02 | " 34 0042 0x22 | B 66 0102 0x42 | b 98 0142 0x62 |
| 215 | (etx) 3 0003 0x03 | # 35 0043 0x23 | C 67 0103 0x43 | c 99 0143 0x63 |
| 216 | (eot) 4 0004 0x04 | $ 36 0044 0x24 | D 68 0104 0x44 | d 100 0144 0x64 |
| 217 | (enq) 5 0005 0x05 | % 37 0045 0x25 | E 69 0105 0x45 | e 101 0145 0x65 |
| 218 | (ack) 6 0006 0x06 | & 38 0046 0x26 | F 70 0106 0x46 | f 102 0146 0x66 |
| 219 | (bel) 7 0007 0x07 | ' 39 0047 0x27 | G 71 0107 0x47 | g 103 0147 0x67 |
| 220 | (bs) 8 0010 0x08 | ( 40 0050 0x28 | H 72 0110 0x48 | h 104 0150 0x68 |
| 221 | (ht) 9 0011 0x09 | ) 41 0051 0x29 | I 73 0111 0x49 | i 105 0151 0x69 |
| 222 | (nl) 10 0012 0x0a | * 42 0052 0x2a | J 74 0112 0x4a | j 106 0152 0x6a |
| 223 | (vt) 11 0013 0x0b | + 43 0053 0x2b | K 75 0113 0x4b | k 107 0153 0x6b |
| 224 | (np) 12 0014 0x0c | , 44 0054 0x2c | L 76 0114 0x4c | l 108 0154 0x6c |
| 225 | (cr) 13 0015 0x0d | - 45 0055 0x2d | M 77 0115 0x4d | m 109 0155 0x6d |
| 226 | (so) 14 0016 0x0e | . 46 0056 0x2e | N 78 0116 0x4e | n 110 0156 0x6e |
| 227 | (si) 15 0017 0x0f | / 47 0057 0x2f | O 79 0117 0x4f | o 111 0157 0x6f |
| 228 | (dle) 16 0020 0x10 | 0 48 0060 0x30 | P 80 0120 0x50 | p 112 0160 0x70 |
| 229 | (dc1) 17 0021 0x11 | 1 49 0061 0x31 | Q 81 0121 0x51 | q 113 0161 0x71 |
| 230 | (dc2) 18 0022 0x12 | 2 50 0062 0x32 | R 82 0122 0x52 | r 114 0162 0x72 |
| 231 | (dc3) 19 0023 0x13 | 3 51 0063 0x33 | S 83 0123 0x53 | s 115 0163 0x73 |
| 232 | (dc4) 20 0024 0x14 | 4 52 0064 0x34 | T 84 0124 0x54 | t 116 0164 0x74 |
| 233 | (nak) 21 0025 0x15 | 5 53 0065 0x35 | U 85 0125 0x55 | u 117 0165 0x75 |
| 234 | (syn) 22 0026 0x16 | 6 54 0066 0x36 | V 86 0126 0x56 | v 118 0166 0x76 |
| 235 | (etb) 23 0027 0x17 | 7 55 0067 0x37 | W 87 0127 0x57 | w 119 0167 0x77 |
| 236 | (can) 24 0030 0x18 | 8 56 0070 0x38 | X 88 0130 0x58 | x 120 0170 0x78 |
| 237 | (em) 25 0031 0x19 | 9 57 0071 0x39 | Y 89 0131 0x59 | y 121 0171 0x79 |
| 238 | (sub) 26 0032 0x1a | : 58 0072 0x3a | Z 90 0132 0x5a | z 122 0172 0x7a |
| 239 | (esc) 27 0033 0x1b | ; 59 0073 0x3b | [ 91 0133 0x5b | { 123 0173 0x7b |
| 240 | (fs) 28 0034 0x1c | < 60 0074 0x3c | \ 92 0134 0x5c | | 124 0174 0x7c |
| 241 | (gs) 29 0035 0x1d | = 61 0075 0x3d | ] 93 0135 0x5d | } 125 0175 0x7d |
| 242 | (rs) 30 0036 0x1e | > 62 0076 0x3e | ^ 94 0136 0x5e | ~ 126 0176 0x7e |
| 243 | (us) 31 0037 0x1f | ? 63 0077 0x3f | _ 95 0137 0x5f | (del) 127 0177 0x7f |
| 244 | |
| 245 | */ |
| 246 | static INPUT_PORTS_START( generic_keyboard ) |
| 247 | PORT_START("TERM_LINEC") |
| 248 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) |
| 249 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 250 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE |
| 251 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 252 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 253 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 254 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 255 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) |
| 256 | |
| 257 | PORT_START("TERM_LINE0") |
| 258 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 259 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 260 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 261 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 262 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 263 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 264 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') |
| 265 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') |
| 266 | |
| 267 | PORT_START("TERM_LINE1") |
| 268 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 269 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
| 270 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') |
| 271 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') |
| 272 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 273 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') |
| 274 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 275 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 276 | |
| 277 | PORT_START("TERM_LINE2") |
| 278 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_CHAR('`') PORT_CHAR('@') |
| 279 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 280 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') |
| 281 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| 282 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| 283 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| 284 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') |
| 285 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') |
| 286 | |
| 287 | PORT_START("TERM_LINE3") |
| 288 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') |
| 289 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') |
| 290 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') |
| 291 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') |
| 292 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') |
| 293 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') |
| 294 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') |
| 295 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') |
| 296 | |
| 297 | PORT_START("TERM_LINE4") |
| 298 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') |
| 299 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') |
| 300 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') |
| 301 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') |
| 302 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') |
| 303 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') |
| 304 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') |
| 305 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') |
| 306 | |
| 307 | PORT_START("TERM_LINE5") |
| 308 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 309 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') |
| 310 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 311 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') |
| 312 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') |
| 313 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') |
| 314 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^') PORT_CHAR('~') |
| 315 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL")PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 316 | |
| 317 | PORT_START("TERM_LINE6") |
| 318 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) |
| 319 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) |
| 320 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) |
| 321 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) |
| 322 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 323 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LF") PORT_CODE(KEYCODE_RALT) PORT_CHAR(10) |
| 324 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) |
| 325 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 326 | |
| 327 | PORT_START("TERM_LINE7") |
| 328 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) |
| 329 | INPUT_PORTS_END |
| 330 | |
| 331 | ioport_constructor generic_keyboard_device::device_input_ports() const |
| 332 | { |
| 333 | return INPUT_PORTS_NAME(generic_keyboard); |
| 334 | } |
| 335 | |
| 336 | const device_type GENERIC_KEYBOARD = &device_creator<generic_keyboard_device>; |
| 337 | |
| 338 | static INPUT_PORTS_START(serial_keyboard) |
| 339 | PORT_INCLUDE(generic_keyboard) |
| 340 | PORT_START("TERM_FRAME") |
| 341 | PORT_CONFNAME(0x0f, 0x06, "Baud") PORT_CHANGED_MEMBER(DEVICE_SELF, serial_keyboard_device, update_frame, 0) |
| 342 | PORT_CONFSETTING( 0x00, "150") |
| 343 | PORT_CONFSETTING( 0x01, "300") |
| 344 | PORT_CONFSETTING( 0x02, "600") |
| 345 | PORT_CONFSETTING( 0x03, "1200") |
| 346 | PORT_CONFSETTING( 0x04, "2400") |
| 347 | PORT_CONFSETTING( 0x05, "4800") |
| 348 | PORT_CONFSETTING( 0x06, "9600") |
| 349 | PORT_CONFSETTING( 0x07, "14400") |
| 350 | PORT_CONFSETTING( 0x08, "19200") |
| 351 | PORT_CONFSETTING( 0x09, "28800") |
| 352 | PORT_CONFSETTING( 0x0a, "38400") |
| 353 | PORT_CONFSETTING( 0x0b, "57600") |
| 354 | PORT_CONFSETTING( 0x0c, "115200") |
| 355 | PORT_CONFNAME(0x30, 0x00, "Format") PORT_CHANGED_MEMBER(DEVICE_SELF, serial_keyboard_device, update_frame, 0) |
| 356 | PORT_CONFSETTING( 0x00, "8N1") |
| 357 | PORT_CONFSETTING( 0x10, "7E1") |
| 358 | INPUT_PORTS_END |
| 359 | |
| 360 | ioport_constructor serial_keyboard_device::device_input_ports() const |
| 361 | { |
| 362 | return INPUT_PORTS_NAME(serial_keyboard); |
| 363 | } |
| 364 | |
| 365 | serial_keyboard_device::serial_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 366 | : generic_keyboard_device(mconfig, SERIAL_KEYBOARD, "Serial Keyboard", tag, owner, clock), |
| 367 | device_serial_interface(mconfig, *this), |
| 368 | device_serial_port_interface(mconfig, *this) |
| 369 | { |
| 370 | } |
| 371 | |
| 372 | void serial_keyboard_device::device_config_complete() |
| 373 | { |
| 374 | const serial_keyboard_interface *intf = reinterpret_cast<const serial_keyboard_interface *>(static_config()); |
| 375 | if(intf != NULL) |
| 376 | { |
| 377 | *static_cast<serial_keyboard_interface *>(this) = *intf; |
| 378 | } |
| 379 | else |
| 380 | { |
| 381 | memset(&m_out_tx_cb, 0, sizeof(m_out_tx_cb)); |
| 382 | } |
| 383 | m_shortname = "serial_keyboard"; |
| 384 | } |
| 385 | |
| 386 | static int rates[] = {150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200}; |
| 387 | |
| 388 | void serial_keyboard_device::device_start() |
| 389 | { |
| 390 | int baud = clock(); |
| 391 | if(!baud) baud = 9600; |
| 392 | m_owner = dynamic_cast<serial_port_device *>(owner()); |
| 393 | m_out_tx_func.resolve(m_out_tx_cb, *this); |
| 394 | m_slot = m_owner && 1; |
| 395 | m_timer = timer_alloc(); |
| 396 | set_tra_rate(baud); |
| 397 | set_data_frame(8, 1, SERIAL_PARITY_NONE); |
| 398 | } |
| 399 | |
| 400 | INPUT_CHANGED_MEMBER(serial_keyboard_device::update_frame) |
| 401 | { |
| 402 | set_tra_rate(rates[newval & 0x0f]); |
| 403 | |
| 404 | switch(newval & 0x30) |
| 405 | { |
| 406 | case 0x10: |
| 407 | set_data_frame(7, 1, SERIAL_PARITY_EVEN); |
| 408 | break; |
| 409 | case 0x00: |
| 410 | default: |
| 411 | set_data_frame(8, 1, SERIAL_PARITY_NONE); |
| 412 | break; |
| 413 | } |
| 414 | } |
| 415 | |
| 416 | void serial_keyboard_device::device_reset() |
| 417 | { |
| 418 | generic_keyboard_device::device_reset(); |
| 419 | m_rbit = 1; |
| 420 | if(m_slot) |
| 421 | m_owner->out_rx(m_rbit); |
| 422 | else |
| 423 | m_out_tx_func(m_rbit); |
| 424 | } |
| 425 | |
| 426 | void serial_keyboard_device::send_key(UINT8 code) |
| 427 | { |
| 428 | if(is_transmit_register_empty()) |
| 429 | { |
| 430 | transmit_register_setup(code); |
| 431 | return; |
| 432 | } |
| 433 | m_key_valid = true; |
| 434 | m_curr_key = code; |
| 435 | } |
| 436 | |
| 437 | void serial_keyboard_device::tra_callback() |
| 438 | { |
| 439 | m_rbit = transmit_register_get_data_bit(); |
| 440 | if(m_slot) |
| 441 | m_owner->out_rx(m_rbit); |
| 442 | else |
| 443 | m_out_tx_func(m_rbit); |
| 444 | } |
| 445 | |
| 446 | void serial_keyboard_device::tra_complete() |
| 447 | { |
| 448 | if(m_key_valid) |
| 449 | { |
| 450 | transmit_register_setup(m_curr_key); |
| 451 | m_key_valid = false; |
| 452 | } |
| 453 | } |
| 454 | |
| 455 | READ_LINE_MEMBER(serial_keyboard_device::tx_r) |
| 456 | { |
| 457 | return m_rbit; |
| 458 | } |
| 459 | |
| 460 | const device_type SERIAL_KEYBOARD = &device_creator<serial_keyboard_device>; |