Previous 15994 Revisions Next

r14775 Tuesday 20th March, 2012 at 10:48:23 UTC by Robbbert
Created a generic ascii keyboard (includes serial interface). Connected to 'pcm' driver.
[src/mess]mess.mak
[src/mess/drivers]pcm.c
[src/mess/machine]keyboard.c* keyboard.h*

src/mess/machine/keyboard.c
r0r14775
1/***************************************************************************
2Generic ASCII Keyboard
3
4Use MCFG_SERIAL_KEYBOARD_ADD to attach this as a serial device to a terminal
5or computer.
6
7Use MCFG_ASCII_KEYBOARD_ADD to attach as a generic ascii input device in
8cases where either the driver isn't developed enough yet; or for testing;
9or for the rare case of a computer with an inbuilt (not serial) ascii
10keyboard.
11
12Example of usage in a driver.
13
14In MACHINE_CONFIG
15   MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf)
16
17In the code:
18
19WRITE8_MEMBER( xxx_state::kbd_put )
20{
21   (code to capture the key as it is pressed)
22}
23
24static 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
38generic_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
43generic_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
49UINT8 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
62UINT8 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
162void 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
175static MACHINE_CONFIG_FRAGMENT( generic_keyboard )
176MACHINE_CONFIG_END
177
178machine_config_constructor generic_keyboard_device::device_mconfig_additions() const
179{
180      return MACHINE_CONFIG_NAME(generic_keyboard);
181}
182
183void generic_keyboard_device::device_start()
184{
185   m_keyboard_func.resolve(m_keyboard_cb, *this);
186   m_timer = timer_alloc();
187}
188
189void 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
202void 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/*
210Char  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*/
246static 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))
329INPUT_PORTS_END
330
331ioport_constructor generic_keyboard_device::device_input_ports() const
332{
333   return INPUT_PORTS_NAME(generic_keyboard);
334}
335
336const device_type GENERIC_KEYBOARD = &device_creator<generic_keyboard_device>;
337
338static 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")
358INPUT_PORTS_END
359
360ioport_constructor serial_keyboard_device::device_input_ports() const
361{
362   return INPUT_PORTS_NAME(serial_keyboard);
363}
364
365serial_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
372void 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
386static int rates[] = {150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200};
387
388void 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
400INPUT_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
416void 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
426void 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
437void 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
446void 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
455READ_LINE_MEMBER(serial_keyboard_device::tx_r)
456{
457   return m_rbit;
458}
459
460const device_type SERIAL_KEYBOARD = &device_creator<serial_keyboard_device>;
src/mess/machine/keyboard.h
r0r14775
1#ifndef __KEYBOARD_H__
2#define __KEYBOARD_H__
3
4#include "emu.h"
5#include "machine/serial.h"
6
7/***************************************************************************
8    TYPE DEFINITIONS
9***************************************************************************/
10
11typedef struct _keyboard_interface keyboard_interface;
12struct _keyboard_interface
13{
14   devcb_write8 m_keyboard_cb;
15};
16
17#define ASCII_KEYBOARD_INTERFACE(name) const keyboard_interface (name) =
18
19struct serial_keyboard_interface
20{
21   devcb_write_line m_out_tx_cb;
22};
23
24/***************************************************************************
25    DEVICE CONFIGURATION MACROS
26***************************************************************************/
27#define KEYBOARD_TAG "keyboard"
28
29#define MCFG_ASCII_KEYBOARD_ADD(_tag, _intrf) \
30   MCFG_DEVICE_ADD(_tag, GENERIC_KEYBOARD, 0) \
31   MCFG_DEVICE_CONFIG(_intrf)
32
33#define MCFG_SERIAL_KEYBOARD_ADD(_tag, _intrf, _clock) \
34   MCFG_DEVICE_ADD(_tag, SERIAL_KEYBOARD, _clock) \
35   MCFG_DEVICE_CONFIG(_intrf)
36
37/***************************************************************************
38    FUNCTION PROTOTYPES
39***************************************************************************/
40
41class generic_keyboard_device :
42   public device_t,
43   public _keyboard_interface
44{
45public:
46   generic_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
47   generic_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
48
49   virtual ioport_constructor device_input_ports() const;
50   virtual machine_config_constructor device_mconfig_additions() const;
51protected:
52   virtual void device_start();
53   virtual void device_reset();
54   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
55   virtual void device_config_complete();
56   virtual void send_key(UINT8 code) { m_keyboard_func(0, code); }
57   emu_timer *m_timer;
58private:
59   UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line);
60   UINT8 row_number(UINT8 code);
61   UINT8 m_last_code;
62   UINT8 m_scan_line;
63
64   devcb_resolved_write8 m_keyboard_func;
65};
66
67extern const device_type GENERIC_KEYBOARD;
68
69class serial_keyboard_device :
70   public generic_keyboard_device,
71   public device_serial_interface,
72   public device_serial_port_interface,
73   public serial_keyboard_interface
74{
75public:
76   serial_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
77
78   DECLARE_WRITE_LINE_MEMBER(rx_w) { m_tbit = state; check_for_start(state); }
79   DECLARE_READ_LINE_MEMBER(tx_r);
80   virtual ioport_constructor device_input_ports() const;
81
82   DECLARE_INPUT_CHANGED_MEMBER(update_frame);
83protected:
84   virtual void device_start();
85   virtual void device_config_complete();
86   virtual void device_reset();
87   virtual void tra_callback();
88   virtual void tra_complete();
89   virtual void input_callback(UINT8 state) { m_input_state = state; }
90   virtual void send_key(UINT8 code);
91private:
92   serial_port_device *m_owner;
93   bool m_slot;
94   UINT8 m_curr_key;
95   bool m_key_valid;
96   devcb_resolved_write_line m_out_tx_func;
97};
98
99extern const device_type SERIAL_KEYBOARD;
100
101#endif /* __KEYBOARD_H__ */
src/mess/drivers/pcm.c
r14774r14775
6262#include "imagedev/cassette.h"
6363#include "sound/speaker.h"
6464#include "sound/wave.h"
65#include "machine/terminal.h"
65#include "machine/keyboard.h"
6666
6767#define MACHINE_RESET_MEMBER(name) void name::machine_reset()
6868#define VIDEO_START_MEMBER(name) void name::video_start()
r14774r14775
7474   pcm_state(const machine_config &mconfig, device_type type, const char *tag)
7575      : driver_device(mconfig, type, tag),
7676   m_maincpu(*this, "maincpu"),
77   m_terminal(*this, TERMINAL_TAG),
77   m_keyboard(*this, KEYBOARD_TAG),
7878   m_pio_s(*this, "z80pio_s"),
7979   m_pio_u(*this, "z80pio_u"),
8080   m_sio(*this, "z80sio"),
r14774r14775
8585   { }
8686
8787   required_device<cpu_device> m_maincpu;
88   required_device<device_t> m_terminal;
88   required_device<device_t> m_keyboard;
8989   required_device<device_t> m_pio_s;
9090   required_device<device_t> m_pio_u;
9191   required_device<device_t> m_sio;
r14774r14775
199199   m_step = 0;
200200}
201201
202static GENERIC_TERMINAL_INTERFACE( terminal_intf )
202static ASCII_KEYBOARD_INTERFACE( keyboard_intf )
203203{
204204   DEVCB_DRIVER_MEMBER(pcm_state, kbd_put)
205205};
r14774r14775
353353   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
354354
355355   /* Devices */
356   MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
357   MCFG_DEVICE_REMOVE(":terminal:terminal_screen")
356   MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf)
358357   MCFG_CASSETTE_ADD( CASSETTE_TAG, default_cassette_interface )
359358   MCFG_Z80PIO_ADD( "z80pio_u", XTAL_10MHz /4, pio_u_intf )
360359   MCFG_Z80PIO_ADD( "z80pio_s", XTAL_10MHz /4, pio_s_intf )
src/mess/mess.mak
r14774r14775
503503   $(MESS_MACHINE)/ieee488.o   \
504504   $(MESS_MACHINE)/isa.o      \
505505   $(MESS_MACHINE)/kb3600.o   \
506   $(MESS_MACHINE)/keyboard.o   \
506507   $(MESS_MACHINE)/kr2376.o   \
507508   $(MESS_MACHINE)/mc6843.o   \
508509   $(MESS_MACHINE)/mc6846.o   \

Previous 15994 Revisions Next


© 1998-2018 The MESS Team