Previous 199869 Revisions Next

r26792 Saturday 28th December, 2013 at 02:21:13 UTC by smf
Converted x68000 keyboard into a separate serial device. This allows the removal of the uart hle in the driver (which didn't work, it was always two characters behind). diserial cannot sync with the start bit properly when using an external clock, so for now I've added a hack that is only enabled when using the MC68901 (setting the flag ignores the extra spurious bit that was getting shifted in). [smf]
[src/emu]diserial.c diserial.h
[src/emu/machine]mc68901.c
[src/mess]mess.mak
[src/mess/drivers]x68k.c
[src/mess/includes]x68k.h
[src/mess/machine]x68k_kbd.c* x68k_kbd.h*
[src/mess/video]x68k.c

trunk/src/emu/machine/mc68901.c
r26791r26792
361361
362362void mc68901_device::device_start()
363363{
364   m_start_bit_hack_for_external_clocks = true;
365
364366   /* resolve callbacks */
365367   m_in_gpio_func.resolve(m_in_gpio_cb, *this);
366368   m_out_gpio_func.resolve(m_out_gpio_cb, *this);
trunk/src/emu/diserial.c
r26791r26792
5050   m_connection_state = 0;
5151   m_rcv_flags = 0;
5252   m_input_state = 0;
53   m_rcv_line = 0;
54   m_start_bit_hack_for_external_clocks = false;
5355}
5456
5557device_serial_interface::~device_serial_interface()
r26791r26792
178180      if(m_rcv_clock && !(m_rcv_rate.is_never()))
179181         // make start delay just a bit longer to make sure we are called after the sender
180182         m_rcv_clock->adjust(((m_rcv_rate*3)/2), 0, m_rcv_rate);
183      else if(m_start_bit_hack_for_external_clocks)
184         m_rcv_bit_count_received--;
181185   }
182186   return;
183187}
r26791r26792
199203   /* shift new bit in */
200204   m_rcv_register_data = (m_rcv_register_data & 0x7fff) | (bit<<15);
201205   /* update bit count received */
202   m_rcv_bit_count_received++;
203206
204207   /* asynchronous mode */
205208   if (m_rcv_flags & RECEIVE_REGISTER_WAITING_FOR_START_BIT)
r26791r26792
225228   else
226229   if (m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
227230   {
231      m_rcv_bit_count_received++;
232
228233      /* received all bits? */
229234      if (m_rcv_bit_count_received==m_rcv_bit_count)
230235      {
trunk/src/emu/diserial.h
r26791r26792
106106   // Must be called from device_timer in the underlying device
107107   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
108108
109   bool m_start_bit_hack_for_external_clocks;
110
109111private:
110112   enum { TRA_TIMER_ID = 10000, RCV_TIMER_ID };
111113
trunk/src/mess/machine/x68k_kbd.c
r0r26792
1#include "machine/x68k_kbd.h"
2
3x68k_keyboard_device::x68k_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) :
4   serial_keyboard_device(mconfig, X68K_KEYBOARD, "X68k Keyboard", tag, owner, 0, "x68k_keyboard", __FILE__),
5   m_io_kbd8(*this, "TERM_LINE8"),
6   m_io_kbd9(*this, "TERM_LINE9"),
7   m_io_kbda(*this, "TERM_LINEA"),
8   m_io_kbdb(*this, "TERM_LINEB"),
9   m_io_kbdd(*this, "TERM_LINED"),
10   m_io_kbde(*this, "TERM_LINEE")
11{
12}
13
14
15void x68k_keyboard_device::write(UINT8 data)
16{
17   /* Keyboard control commands:
18      00xxxxxx - TV Control
19                 Not of much use as yet
20
21      01000xxy - y = Mouse control signal
22
23      01001xxy - y = Keyboard enable
24
25      010100xy - y = Sharp X1 display compatibility mode
26
27      010101xx - xx = LED brightness (00 = bright, 11 = dark)
28
29      010110xy - y = Display control enable
30
31      010111xy - y = Display control via the Opt. 2 key enable
32
33      0110xxxx - xxxx = Key delay (default 500ms)
34                        100 * (delay time) + 200ms
35
36      0111xxxx - xxxx = Key repeat rate  (default 110ms)
37                        (repeat rate)^2*5 + 30ms
38
39      1xxxxxxx - xxxxxxx = keyboard LED status
40                 b6 = "full size"
41                 b5 = hiragana
42                 b4 = insert
43                 b3 = caps
44                 b2 = code input
45                 b1 = romaji input
46                 b0 = kana
47   */
48
49   if(data & 0x80)  // LED status
50   {
51      output_set_value("key_led_kana",(data & 0x01) ? 0 : 1);
52      output_set_value("key_led_romaji",(data & 0x02) ? 0 : 1);
53      output_set_value("key_led_code",(data & 0x04) ? 0 : 1);
54      output_set_value("key_led_caps",(data & 0x08) ? 0 : 1);
55      output_set_value("key_led_insert",(data & 0x10) ? 0 : 1);
56      output_set_value("key_led_hiragana",(data & 0x20) ? 0 : 1);
57      output_set_value("key_led_fullsize",(data & 0x40) ? 0 : 1);
58      logerror("KB: LED status set to %02x\n",data & 0x7f);
59   }
60
61   if((data & 0xc0) == 0)  // TV control
62   {
63      // nothing for now
64   }
65
66   if((data & 0xf8) == 0x48)  // Keyboard enable
67   {
68      m_enabled = data & 0x01;
69      logerror("KB: Keyboard enable bit = %i\n",m_enabled);
70   }
71
72   if((data & 0xf0) == 0x60)  // Key delay time
73   {
74      m_delay = data & 0x0f;
75      logerror("KB: Keypress delay time is now %ims\n",(data & 0x0f)*100+200);
76   }
77
78   if((data & 0xf0) == 0x70)  // Key repeat rate
79   {
80      m_repeat = data & 0x0f;
81      logerror("KB: Keypress repeat rate is now %ims\n",((data & 0x0f)^2)*5+30);
82   }
83}
84
85UINT8 x68k_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line)
86{
87   if (m_enabled)
88   {
89      for (int row = 0; row < 15; row++ )
90      {
91         UINT8 data = 0;
92
93         if (row == 0) data = m_io_kbd0->read();
94         else
95         if (row == 1) data = m_io_kbd1->read();
96         else
97         if (row == 2) data = m_io_kbd2->read();
98         else
99         if (row == 3) data = m_io_kbd3->read();
100         else
101         if (row == 4) data = m_io_kbd4->read();
102         else
103         if (row == 5) data = m_io_kbd5->read();
104         else
105         if (row == 6) data = m_io_kbd6->read();
106         else
107         if (row == 7) data = m_io_kbd7->read();
108         else
109         if (row == 8) data = m_io_kbd8->read();
110         else
111         if (row == 9) data = m_io_kbd9->read();
112         else
113         if (row == 10) data = m_io_kbda->read();
114         else
115         if (row == 11) data = m_io_kbdb->read();
116         else
117         if (row == 12) data = m_io_kbdc->read();
118         else
119         if (row == 13) data = m_io_kbdd->read();
120         else
121         if (row == 14) data = m_io_kbde->read();
122
123         for (int column = 0; column < 8; column++ )
124         {
125            int new_down = (data & (1 << column)) != 0;
126            int scan_code = (row * 8) + column;
127            int old_down = m_key_down[scan_code];
128            m_key_down[scan_code] = new_down;
129
130            if (new_down && !old_down)
131            {
132               m_repeat_code = scan_code;
133               m_until_repeat = m_delay * 240;
134
135               return scan_code;
136            }
137            else if(!new_down && old_down)
138            {
139               m_repeat_code = 0;
140               return scan_code + 0x80;
141            }
142         }
143      }
144
145      if (m_repeat_code > 0 && m_key_down[m_repeat_code])
146      {
147         m_until_repeat--;
148         if (m_until_repeat == 0)
149         {
150            m_until_repeat = m_repeat * 240;
151            return m_repeat_code;
152         }
153      }
154   }
155
156   return 0;
157}
158
159static INPUT_PORTS_START( x68k_keyboard )
160
161   PORT_START("TERM_LINE0")
162   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED) // unused
163   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)  /* ESC */
164   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("1  !  \xE3\x83\x8C") PORT_CODE(KEYCODE_1)  PORT_CHAR('1') PORT_CHAR('!') /* 1 ! */
165   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("2  \"  \xE3\x83\x95") PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"') /* 2 " */
166   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("3  #  \xE3\x82\xA2  \xE3\x82\xA1") PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#') /* 3 # */
167   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("4  $  \xE3\x82\xA6  \xE3\x82\xA5") PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$') /* 4 $ */
168   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("5  %  \xE3\x82\xA8  \xE3\x82\xA7") PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%') /* 5 % */
169   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("6  &  \xE3\x82\xAA  \xE3\x82\xA9") PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&') /* 6 & */
170
171   PORT_START("TERM_LINE1")
172   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("7  \'  \xE3\x83\xA4  \xE3\x83\xA3") PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'') /* 7 ' */
173   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("8  (  \xE3\x83\xA6  \xE3\x83\xA5") PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(') /* 8 ( */
174   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("9  )  \xE3\x83\xA8  \xE3\x83\xA7") PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')') /* 9 ) */
175   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("0  \xE3\x83\xAF  \xE3\x83\xB2") PORT_CODE(KEYCODE_0)  PORT_CHAR('0')                /* 0 */
176   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("-  =  \xE3\x83\x9B") PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('=') /* - = */
177   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("^  \xE3\x83\x98") PORT_CHAR('^') /* ^ */
178   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xC2\xA5  \xE3\x83\xBC  |") PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|') /* Yen | */
179   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_BACKSPACE)  PORT_CHAR(8) /* Backspace */
180
181   PORT_START("TERM_LINE2")
182   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_TAB)  PORT_CHAR(9)  /* Tab */
183   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Q  \xE3\x82\xBF") PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q')  /* Q */
184   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("W  \xE3\x83\x86") PORT_CODE(KEYCODE_W)  PORT_CHAR('W')  /* W */
185   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("E  \xE3\x82\xA4  \xE3\x82\xA3") PORT_CODE(KEYCODE_E)  PORT_CHAR('E')  /* E */
186   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("R  \xE3\x82\xB9") PORT_CODE(KEYCODE_R)  PORT_CHAR('R')  /* R */
187   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("T  \xE3\x82\xAB") PORT_CODE(KEYCODE_T)  PORT_CHAR('T')  /* T */
188   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Y  \xE3\x83\xB3") PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y')  /* Y */
189   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("U  \xE3\x83\x8A") PORT_CODE(KEYCODE_U)  PORT_CHAR('U')  /* U */
190
191   PORT_START("TERM_LINE3")
192   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("I  \xE3\x83\x8B") PORT_CODE(KEYCODE_I)  PORT_CHAR('I')  /* I */
193   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("O  \xE3\x83\xA9") PORT_CODE(KEYCODE_O)  PORT_CHAR('O')  /* O */
194   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("P  \xE3\x82\xBB") PORT_CODE(KEYCODE_P)  PORT_CHAR('P')  /* P */
195   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("@  `  \xE3\x82\x9B") PORT_CHAR('@') PORT_CHAR('`')  /* @ */
196   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("[  {  \xE3\x82\x9C \xE3\x80\x8C") PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')  /* [ { */
197   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_ENTER)  PORT_CHAR(13)  /* Return */
198   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("A  \xE3\x83\x81") PORT_CODE(KEYCODE_A)  PORT_CHAR('A')  /* A */
199   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("S  \xE3\x83\x88") PORT_CODE(KEYCODE_S)  PORT_CHAR('S')  /* S */
200
201   PORT_START("TERM_LINE4")
202   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("D  \xE3\x82\xB7") PORT_CODE(KEYCODE_D)  PORT_CHAR('D')  /* D */
203   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F  \xE3\x83\x8F") PORT_CODE(KEYCODE_F)  PORT_CHAR('F')  /* F */
204   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("G  \xE3\x82\xAD") PORT_CODE(KEYCODE_G)  PORT_CHAR('G')  /* G */
205   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("H  \xE3\x82\xAF") PORT_CODE(KEYCODE_H)  PORT_CHAR('H')  /* H */
206   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("J  \xE3\x83\x9E") PORT_CODE(KEYCODE_J)  PORT_CHAR('J')  /* J */
207   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("K  \xE3\x83\x8E") PORT_CODE(KEYCODE_K)  PORT_CHAR('K')  /* K */
208   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("L  \xE3\x83\xAA") PORT_CODE(KEYCODE_L)  PORT_CHAR('L')  /* L */
209   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(";  +  \xE3\x83\xAC") PORT_CODE(KEYCODE_COLON)  PORT_CHAR(';')  PORT_CHAR('+')  /* ; + */
210
211   PORT_START("TERM_LINE5")
212   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(":  *  \xE3\x82\xB1") PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR(':')  PORT_CHAR('*')  /* : * */
213   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("]  }  \xE3\x83\xA0  \xE3\x80\x8D") PORT_CODE(KEYCODE_CLOSEBRACE)  PORT_CHAR(']')  PORT_CHAR('}')  /* ] } */
214   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Z  \xE3\x83\x84  \xE3\x83\x83") PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z')  /* Z */
215   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("X  \xE3\x82\xB5") PORT_CODE(KEYCODE_X)  PORT_CHAR('X')  /* X */
216   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("C  \xE3\x82\xBD") PORT_CODE(KEYCODE_C)  PORT_CHAR('C')  /* C */
217   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("V  \xE3\x83\x92") PORT_CODE(KEYCODE_V)  PORT_CHAR('V')  /* V */
218   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("B  \xE3\x82\xB3") PORT_CODE(KEYCODE_B)  PORT_CHAR('B')  /* B */
219   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("N  \xE3\x83\x9F") PORT_CODE(KEYCODE_N)  PORT_CHAR('N')  /* N */
220
221   PORT_START("TERM_LINE6")
222   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("M  \xE3\x83\xA2") PORT_CODE(KEYCODE_M)  PORT_CHAR('M')  /* M */
223   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(",  <  \xE3\x83\x8D  \xE3\x80\x81") PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',')  PORT_CHAR('<')  /* , < */
224   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(".  >  \xE3\x83\xAB  \xE3\x80\x82") PORT_CODE(KEYCODE_STOP)  PORT_CHAR('.')  PORT_CHAR('>')  /* . > */
225   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("/  ?  \xE3\x83\xA1  \xE3\x83\xBB") PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/')  PORT_CHAR('?')  /* / ? */
226   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("_  \xE3\x83\xAD") PORT_CHAR('_')  /* Underscore (shifted only?) */
227   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Space")  PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')  /* Space */
228   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Home")  PORT_CODE(KEYCODE_HOME)  /* Home */
229   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Delete")  PORT_CODE(KEYCODE_DEL)  /* Del */
230
231   PORT_START("TERM_LINE7")
232   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Roll Up")  PORT_CODE(KEYCODE_PGUP)  /* Roll Up */
233   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Roll Down")  PORT_CODE(KEYCODE_PGDN)  /* Roll Down */
234   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Undo")  PORT_CODE(KEYCODE_END)  /* Undo */
235   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Left")  PORT_CODE(KEYCODE_LEFT)  /* Left */
236   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Up")  PORT_CODE(KEYCODE_UP)  /* Up */
237   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Right")  PORT_CODE(KEYCODE_RIGHT)  /* Right */
238   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Down")  PORT_CODE(KEYCODE_DOWN)  /* Down */
239   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey CLR")  PORT_CODE(KEYCODE_NUMLOCK)  /* CLR */
240
241   PORT_START("TERM_LINE8")
242   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey /")  PORT_CODE(KEYCODE_SLASH_PAD)  /* / (numpad) */
243   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey *")  PORT_CODE(KEYCODE_ASTERISK)  /* * (numpad) */
244   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey -")  PORT_CODE(KEYCODE_MINUS_PAD)  /* - (numpad) */
245   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 7")  PORT_CODE(KEYCODE_7_PAD)  /* 7 (numpad) */
246   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 8")  PORT_CODE(KEYCODE_8_PAD)  /* 8 (numpad) */
247   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 9")  PORT_CODE(KEYCODE_9_PAD)  /* 9 (numpad) */
248   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey +")  PORT_CODE(KEYCODE_PLUS_PAD)  /* + (numpad) */
249   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 4")  PORT_CODE(KEYCODE_4_PAD)  /* 4 (numpad) */
250
251   PORT_START("TERM_LINE9")
252   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 5")  PORT_CODE(KEYCODE_5_PAD)  /* 5 (numpad) */
253   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 6")  PORT_CODE(KEYCODE_6_PAD)  /* 6 (numpad) */
254   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey =")  /* = (numpad) */
255   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 1")  PORT_CODE(KEYCODE_1_PAD)  /* 1 (numpad) */
256   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 2")  PORT_CODE(KEYCODE_2_PAD)  /* 2 (numpad) */
257   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 3")  PORT_CODE(KEYCODE_3_PAD)  /* 3 (numpad) */
258   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey Enter")  PORT_CODE(KEYCODE_ENTER_PAD)  /* Enter (numpad) */
259   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 0")  PORT_CODE(KEYCODE_0_PAD)  /* 0 (numpad) */
260
261   PORT_START("TERM_LINEA")
262   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey ,")  /* , (numpad) */
263   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey .")  PORT_CODE(KEYCODE_DEL_PAD)  /* 2 (numpad) */
264   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE8\xA8\x98\xE5\x8F\xB7 (Symbolic input)")  /* Sign / Symbolic input (babelfish translation) */
265   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE7\x99\xBB\xE9\x8C\xB2 (Register)")  /* Register (babelfish translation) */
266   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Help")  /* Help */
267   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF1")  PORT_CODE(KEYCODE_F11)  /* XF1 */
268   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF2")  PORT_CODE(KEYCODE_F12)  /* XF2 */
269   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF3")  /* XF3 */
270
271   PORT_START("TERM_LINEB")
272   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF4")  /* XF4 */
273   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF5")  /* XF5 */
274   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xe3\x81\x8b\xe3\x81\xaa (Kana)")  /* Kana */
275   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x9e\xe5\xad\x97 (Romaji)")  /* Romaji */
276   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89 (Code input)")  /* Code input */
277   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Caps")  PORT_CODE(KEYCODE_CAPSLOCK)  /* Caps lock */
278   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Insert")  PORT_CODE(KEYCODE_INSERT)  /* Insert */
279   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE3\x81\xB2\xE3\x82\x89\xE3\x81\x8C\xE3\x81\xAA (Hiragana)")  /* Hiragana */
280
281   PORT_START("TERM_LINEC")
282   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE5\x85\xA8\xE8\xA7\x92 (Full size)")  /* Full size (babelfish translation) */
283   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Break")  /* Break */
284   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Copy")  /* Copy */
285   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F1")  PORT_CODE(KEYCODE_F1)  /* F1 */
286   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F2")  PORT_CODE(KEYCODE_F2)  /* F2 */
287   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F3")  PORT_CODE(KEYCODE_F3)  /* F3 */
288   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F4")  PORT_CODE(KEYCODE_F4)  /* F4 */
289   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F5")  PORT_CODE(KEYCODE_F5)  /* F5 */
290
291   PORT_START("TERM_LINED")
292   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F6")  PORT_CODE(KEYCODE_F6)  /* F6 */
293   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F7")  PORT_CODE(KEYCODE_F7)  /* F7 */
294   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F8")  PORT_CODE(KEYCODE_F8)  /* F8 */
295   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F9")  PORT_CODE(KEYCODE_F9)  /* F9 */
296   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F10")  PORT_CODE(KEYCODE_F10)  /* F10 */
297   // 0x6d reserved
298   // 0x6e reserved
299   // 0x6f reserved
300
301   PORT_START("TERM_LINEE")
302   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Shift")  PORT_CODE(KEYCODE_LSHIFT)  /* Shift */
303   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Ctrl")  PORT_CODE(KEYCODE_LCONTROL)  /* Ctrl */
304   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Opt. 1")  PORT_CODE(KEYCODE_PRTSCR) /* Opt1 */
305   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Opt. 2")  PORT_CODE(KEYCODE_PAUSE)  /* Opt2 */
306
307   PORT_START("TERM_FRAME")
308   PORT_CONFNAME(0x0f, 0x0a, "Baud") PORT_CHANGED_MEMBER(DEVICE_SELF, serial_keyboard_device, update_frame, 0)
309   PORT_CONFSETTING( 0x0a, "38400") // TODO: Should be 2400 but MC68901 doesn't support divide by 16
310   PORT_CONFNAME(0x30, 0x00, "Format") PORT_CHANGED_MEMBER(DEVICE_SELF, serial_keyboard_device, update_frame, 0)
311   PORT_CONFSETTING( 0x00, "8N1")
312INPUT_PORTS_END
313
314ioport_constructor x68k_keyboard_device::device_input_ports() const
315{
316   return INPUT_PORTS_NAME(x68k_keyboard);
317}
318
319void x68k_keyboard_device::device_start()
320{
321   serial_keyboard_device::device_start();
322   set_rcv_rate(38400); // TODO: Should be 2400 but MC68901 doesn't support divide by 16
323}
324
325void x68k_keyboard_device::device_reset()
326{
327   serial_keyboard_device::device_reset();
328
329   m_enabled = 0;
330   m_delay = 500;  // 3*100+200
331   m_repeat = 110;  // 4^2*5+30
332   m_repeat_code = 0;
333
334   memset(m_key_down, 0, sizeof(m_key_down));
335}
336
337void x68k_keyboard_device::rcv_complete()
338{
339   receive_register_extract();
340   write(get_received_char());
341}
342
343const device_type X68K_KEYBOARD = &device_creator<x68k_keyboard_device>;
344
345#if 0
346
347void x68k_state::x68k_keyboard_push_scancode(unsigned char code)
348{
349   m_keynum++;
350   if(m_keynum >= 1)
351   {
352      // keyboard buffer full
353      if(m_enabled != 0)
354      {
355         //m_mfp.rsr |= 0x80;  // Buffer full
356         //if(ioport("options")->read() & 0x01)
357         //{
358         //   m_current_vector[6] = 0x4c;
359         //   m_maincpu->set_input_line_and_vector(6,ASSERT_LINE,0x4c);
360         //   logerror("MFP: Receive buffer full IRQ sent\n");
361         //}
362      }
363   }
364   m_buffer[m_headpos++] = code;
365   if(m_headpos > 15)
366   {
367      m_headpos = 0;
368      m_current_vector[6] = 0x4b;
369   }
370}
371
372TIMER_CALLBACK_MEMBER(x68k_state::x68k_keyboard_poll)
373{
374   int x;
375   static const char *const keynames[] = { "key1", "key2", "key3", "key4" };
376
377   for(x=0;x<0x80;x++)
378   {
379      // adjust delay/repeat timers
380      if(m_keytime[x] > 0)
381      {
382         m_keytime[x] -= 5;
383      }
384      if(!(ioport(keynames[x / 32])->read() & (1 << (x % 32))))
385      {
386         if(m_keyon[x] != 0)
387         {
388            x68k_keyboard_push_scancode(0x80 + x);
389            m_keytime[x] = 0;
390            m_keyon[x] = 0;
391            m_last_pressed = 0;
392            logerror("KB: Released key 0x%02x\n",x);
393         }
394      }
395      // check to see if a key is being held
396      if(m_keyon[x] != 0 && m_keytime[x] == 0 && m_last_pressed == x)
397      {
398         if(ioport(keynames[m_last_pressed / 32])->read() & (1 << (m_last_pressed % 32)))
399         {
400            x68k_keyboard_push_scancode(m_last_pressed);
401            m_keytime[m_last_pressed] = (m_repeat^2)*5+30;
402            logerror("KB: Holding key 0x%02x\n",m_last_pressed);
403         }
404      }
405      if((ioport(keynames[x / 32])->read() & (1 << (x % 32))))
406      {
407         if(m_keyon[x] == 0)
408         {
409            x68k_keyboard_push_scancode(x);
410            m_keytime[x] = m_delay * 100 + 200;
411            m_keyon[x] = 1;
412            m_last_pressed = x;
413            logerror("KB: Pushed key 0x%02x\n",x);
414         }
415      }
416   }
417}
418
419   struct
420   {
421      unsigned char led_status;  // keyboard LED status
422      unsigned char buffer[16];
423      int headpos;  // scancodes are added here
424      int tailpos;  // scancodes are read from here
425      int keynum;  // number of scancodes in buffer
426      int keytime[0x80];  // time until next keypress
427      int keyon[0x80];  // is 1 if key is pressed, used to determine if the key state has changed from 1 to 0
428      int last_pressed;  // last key pressed, for repeat key handling
429   } m_keyboard;
430   TIMER_CALLBACK_MEMBER(x68k_led_callback);
431   TIMER_CALLBACK_MEMBER(x68k_keyboard_poll);
432   void x68k_keyboard_ctrl_w(int data);
433   int x68k_keyboard_pop_scancode();
434   void x68k_keyboard_push_scancode(unsigned char code);
435
436#endif
Property changes on: trunk/src/mess/machine/x68k_kbd.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/mess/machine/x68k_kbd.h
r0r26792
1#ifndef X68K_KBD_H_
2#define X68K_KBD_H_
3
4#include "emu.h"
5#include "machine/keyboard.h"
6
7#define MCFG_X68K_KEYBOARD_ADD(_tag, _intrf) \
8   MCFG_DEVICE_ADD(_tag, X68K_KEYBOARD, 1200) \
9   MCFG_DEVICE_CONFIG(_intrf)
10
11class x68k_keyboard_device : public serial_keyboard_device
12{
13public:
14   x68k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
15   virtual ioport_constructor device_input_ports() const;
16
17protected:
18   virtual void device_start();
19   virtual void device_reset();
20   virtual void rcv_complete();
21
22private:
23   virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line);
24   void write(UINT8 data);
25
26   required_ioport m_io_kbd8;
27   required_ioport m_io_kbd9;
28   required_ioport m_io_kbda;
29   required_ioport m_io_kbdb;
30   required_ioport m_io_kbdd;
31   required_ioport m_io_kbde;
32
33   int m_delay;  // keypress delay after initial press
34   int m_repeat; // keypress repeat rate
35   int m_enabled;  // keyboard enabled?
36
37   UINT8 m_key_down[15*8];
38   int m_repeat_code;
39   int m_until_repeat;
40};
41
42extern const device_type X68K_KEYBOARD;
43
44#endif /* X68KKBD_H_ */
Property changes on: trunk/src/mess/machine/x68k_kbd.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/mess/includes/x68k.h
r26791r26792
2727   enum
2828   {
2929      TIMER_X68K_LED,
30      TIMER_X68K_KEYBOARD_POLL,
3130      TIMER_X68K_SCC_ACK,
3231      TIMER_MD_6BUTTON_PORT1_TIMEOUT,
3332      TIMER_MD_6BUTTON_PORT2_TIMEOUT,
r26791r26792
6665   optional_shared_ptr<UINT32> m_gvram32;
6766   optional_shared_ptr<UINT32> m_tvram32;
6867
69   DECLARE_WRITE_LINE_MEMBER( mfp_tdo_w );
68   DECLARE_WRITE_LINE_MEMBER( mfp_tbo_w );
7069   DECLARE_READ8_MEMBER( mfp_gpio_r );
7170
7271   void fdc_irq(bool state);
r26791r26792
111110   } m_adpcm;
112111   struct
113112   {
114      int rsr;   // [21] Receiver status register
115      int tsr;   // [22] Transmitter status register
116      struct
117      {
118         unsigned char recv_buffer;
119         unsigned char send_buffer;
120         int recv_enable;
121         int send_enable;
122      } usart;
123113      unsigned char gpio;
124114   } m_mfp;  // MC68901 Multifunction Peripheral (4MHz)
125115   struct
r26791r26792
169159   } m_video;
170160   struct
171161   {
172      int delay;  // keypress delay after initial press
173      int repeat; // keypress repeat rate
174      int enabled;  // keyboard enabled?
175      unsigned char led_status;  // keyboard LED status
176      unsigned char buffer[16];
177      int headpos;  // scancodes are added here
178      int tailpos;  // scancodes are read from here
179      int keynum;  // number of scancodes in buffer
180      int keytime[0x80];  // time until next keypress
181      int keyon[0x80];  // is 1 if key is pressed, used to determine if the key state has changed from 1 to 0
182      int last_pressed;  // last key pressed, for repeat key handling
183   } m_keyboard;
184   struct
185   {
186162      int irqstatus;
187163      int fdcvector;
188164      int fddvector;
r26791r26792
214190   UINT8 m_current_irq_line;
215191   unsigned int m_scanline;
216192   int m_led_state;
217   emu_timer* m_kb_timer;
218193   emu_timer* m_mouse_timer;
219194   emu_timer* m_led_timer;
220195   emu_timer* m_net_timer;
r26791r26792
248223   DECLARE_PALETTE_INIT(x68000);
249224   UINT32 screen_update_x68000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
250225   TIMER_CALLBACK_MEMBER(x68k_led_callback);
251   TIMER_CALLBACK_MEMBER(x68k_keyboard_poll);
252226   TIMER_CALLBACK_MEMBER(x68k_scc_ack);
253227   TIMER_CALLBACK_MEMBER(md_6button_port1_timeout);
254228   TIMER_CALLBACK_MEMBER(md_6button_port2_timeout);
r26791r26792
272246   DECLARE_WRITE_LINE_MEMBER(x68k_scsi_irq);
273247   DECLARE_WRITE_LINE_MEMBER(x68k_scsi_drq);
274248
275   void x68k_keyboard_ctrl_w(int data);
276   int x68k_keyboard_pop_scancode();
277   void x68k_keyboard_push_scancode(unsigned char code);
278249   int x68k_read_mouse();
279250   void x68k_set_adpcm();
280251   UINT8 md_3button_r(int port);
r26791r26792
296267   DECLARE_READ16_MEMBER(x68k_ioc_r);
297268   DECLARE_WRITE16_MEMBER(x68k_sysport_w);
298269   DECLARE_READ16_MEMBER(x68k_sysport_r);
299   DECLARE_READ16_MEMBER(x68k_mfp_r);
300   DECLARE_WRITE16_MEMBER(x68k_mfp_w);
301270   DECLARE_WRITE16_MEMBER(x68k_ppi_w);
302271   DECLARE_READ16_MEMBER(x68k_ppi_r);
303272   DECLARE_WRITE16_MEMBER(x68k_sram_w);
trunk/src/mess/video/x68k.c
r26791r26792
12491249//  popmessage("CRTC/BG compare H-TOTAL %i/%i H-DISP %i/%i V-DISP %i/%i BG Res %02x",m_crtc.reg[0],m_spritereg[0x405],m_crtc.reg[2],m_spritereg[0x406],
12501250//      m_crtc.reg[6],m_spritereg[0x407],m_spritereg[0x408]);
12511251//  popmessage("BG Scroll - BG0 X %i Y %i  BG1 X %i Y %i",m_spriteram[0x400],m_spriteram[0x401],m_spriteram[0x402],m_spriteram[0x403]);
1252//  popmessage("Keyboard buffer position = %i",m_keyboard.headpos);
12531252//  popmessage("uPD72065 status = %02x",upd765_status_r(machine(), space, 0));
12541253//  popmessage("Layer enable - 0x%02x",m_video.reg[2] & 0xff);
12551254//  popmessage("Graphic layer scroll - %i, %i - %i, %i - %i, %i - %i, %i",
trunk/src/mess/drivers/x68k.c
r26791r26792
128128#include "formats/xdf_dsk.h"
129129#include "formats/dim_dsk.h"
130130#include "machine/x68k_hdc.h"
131#include "machine/x68k_kbd.h"
131132#include "includes/x68k.h"
132133#include "machine/ram.h"
133134#include "machine/nvram.h"
r26791r26792
147148   case TIMER_X68K_LED:
148149      x68k_led_callback(ptr, param);
149150      break;
150   case TIMER_X68K_KEYBOARD_POLL:
151      x68k_keyboard_poll(ptr, param);
152      break;
153151   case TIMER_X68K_SCC_ACK:
154152      x68k_scc_ack(ptr, param);
155153      break;
r26791r26792
223221   return hd63450_r(device, space, offset, mem_mask);
224222}
225223
226void x68k_state::x68k_keyboard_ctrl_w(int data)
227{
228   /* Keyboard control commands:
229      00xxxxxx - TV Control
230                 Not of much use as yet
231224
232      01000xxy - y = Mouse control signal
233
234      01001xxy - y = Keyboard enable
235
236      010100xy - y = Sharp X1 display compatibility mode
237
238      010101xx - xx = LED brightness (00 = bright, 11 = dark)
239
240      010110xy - y = Display control enable
241
242      010111xy - y = Display control via the Opt. 2 key enable
243
244      0110xxxx - xxxx = Key delay (default 500ms)
245                        100 * (delay time) + 200ms
246
247      0111xxxx - xxxx = Key repeat rate  (default 110ms)
248                        (repeat rate)^2*5 + 30ms
249
250      1xxxxxxx - xxxxxxx = keyboard LED status
251                 b6 = "full size"
252                 b5 = hiragana
253                 b4 = insert
254                 b3 = caps
255                 b2 = code input
256                 b1 = romaji input
257                 b0 = kana
258   */
259
260   if(data & 0x80)  // LED status
261   {
262      output_set_value("key_led_kana",(data & 0x01) ? 0 : 1);
263      output_set_value("key_led_romaji",(data & 0x02) ? 0 : 1);
264      output_set_value("key_led_code",(data & 0x04) ? 0 : 1);
265      output_set_value("key_led_caps",(data & 0x08) ? 0 : 1);
266      output_set_value("key_led_insert",(data & 0x10) ? 0 : 1);
267      output_set_value("key_led_hiragana",(data & 0x20) ? 0 : 1);
268      output_set_value("key_led_fullsize",(data & 0x40) ? 0 : 1);
269      logerror("KB: LED status set to %02x\n",data & 0x7f);
270   }
271
272   if((data & 0xc0) == 0)  // TV control
273   {
274      // nothing for now
275   }
276
277   if((data & 0xf8) == 0x48)  // Keyboard enable
278   {
279      m_keyboard.enabled = data & 0x01;
280      logerror("KB: Keyboard enable bit = %i\n",m_keyboard.enabled);
281   }
282
283   if((data & 0xf0) == 0x60)  // Key delay time
284   {
285      m_keyboard.delay = data & 0x0f;
286      logerror("KB: Keypress delay time is now %ims\n",(data & 0x0f)*100+200);
287   }
288
289   if((data & 0xf0) == 0x70)  // Key repeat rate
290   {
291      m_keyboard.repeat = data & 0x0f;
292      logerror("KB: Keypress repeat rate is now %ims\n",((data & 0x0f)^2)*5+30);
293   }
294
295}
296
297int x68k_state::x68k_keyboard_pop_scancode()
298{
299   int ret;
300   if(m_keyboard.keynum == 0)  // no scancodes in USART buffer
301      return 0x00;
302
303   m_keyboard.keynum--;
304   ret = m_keyboard.buffer[m_keyboard.tailpos++];
305   if(m_keyboard.tailpos > 15)
306      m_keyboard.tailpos = 0;
307
308   logerror("MFP: Keyboard buffer pop 0x%02x\n",ret);
309   return ret;
310}
311
312void x68k_state::x68k_keyboard_push_scancode(unsigned char code)
313{
314   m_keyboard.keynum++;
315   if(m_keyboard.keynum >= 1)
316   { // keyboard buffer full
317      if(m_keyboard.enabled != 0)
318      {
319         m_mfp.rsr |= 0x80;  // Buffer full
320         if(ioport("options")->read() & 0x01)
321         {
322            m_current_vector[6] = 0x4c;
323            m_maincpu->set_input_line_and_vector(6,ASSERT_LINE,0x4c);
324            logerror("MFP: Receive buffer full IRQ sent\n");
325         }
326      }
327   }
328   m_keyboard.buffer[m_keyboard.headpos++] = code;
329   if(m_keyboard.headpos > 15)
330   {
331      m_keyboard.headpos = 0;
332      m_current_vector[6] = 0x4b;
333   }
334}
335
336TIMER_CALLBACK_MEMBER(x68k_state::x68k_keyboard_poll)
337{
338   int x;
339   static const char *const keynames[] = { "key1", "key2", "key3", "key4" };
340
341   for(x=0;x<0x80;x++)
342   {
343      // adjust delay/repeat timers
344      if(m_keyboard.keytime[x] > 0)
345      {
346         m_keyboard.keytime[x] -= 5;
347      }
348      if(!(ioport(keynames[x / 32])->read() & (1 << (x % 32))))
349      {
350         if(m_keyboard.keyon[x] != 0)
351         {
352            x68k_keyboard_push_scancode(0x80 + x);
353            m_keyboard.keytime[x] = 0;
354            m_keyboard.keyon[x] = 0;
355            m_keyboard.last_pressed = 0;
356            logerror("KB: Released key 0x%02x\n",x);
357         }
358      }
359      // check to see if a key is being held
360      if(m_keyboard.keyon[x] != 0 && m_keyboard.keytime[x] == 0 && m_keyboard.last_pressed == x)
361      {
362         if(ioport(keynames[m_keyboard.last_pressed / 32])->read() & (1 << (m_keyboard.last_pressed % 32)))
363         {
364            x68k_keyboard_push_scancode(m_keyboard.last_pressed);
365            m_keyboard.keytime[m_keyboard.last_pressed] = (m_keyboard.repeat^2)*5+30;
366            logerror("KB: Holding key 0x%02x\n",m_keyboard.last_pressed);
367         }
368      }
369      if((ioport(keynames[x / 32])->read() & (1 << (x % 32))))
370      {
371         if(m_keyboard.keyon[x] == 0)
372         {
373            x68k_keyboard_push_scancode(x);
374            m_keyboard.keytime[x] = m_keyboard.delay * 100 + 200;
375            m_keyboard.keyon[x] = 1;
376            m_keyboard.last_pressed = x;
377            logerror("KB: Pushed key 0x%02x\n",x);
378         }
379      }
380   }
381}
382
383
384225// mouse input
385226// port B of the Z8530 SCC
386227// typically read from the SCC data port on receive buffer full interrupt per byte
r26791r26792
1076917   }
1077918}
1078919
1079READ16_MEMBER(x68k_state::x68k_mfp_r)
1080{
1081   // Initial settings indicate that IRQs are generated for FM (YM2151), Receive buffer error or full,
1082   // MFP Timer C, and the power switch
1083//  logerror("MFP: [%08x] Reading offset %i\n",space.device().safe_pc(),offset);
1084   switch(offset)
1085   {
1086   case 21:  // RSR
1087      return m_mfp.rsr;
1088   case 22:  // TSR
1089      return m_mfp.tsr | 0x80;  // buffer is typically empty?
1090   case 23:
1091      return x68k_keyboard_pop_scancode();
1092   default:
1093      if (ACCESSING_BITS_0_7) return m_mfpdev->read(space, offset);
1094   }
1095   return 0xffff;
1096}
1097
1098WRITE16_MEMBER(x68k_state::x68k_mfp_w)
1099{
1100   /* For the Interrupt registers, the bits are set out as such:
1101      Reg A - bit 7: GPIP7 (HSync)
1102              bit 6: GPIP6 (CRTC CIRQ)
1103              bit 5: Timer A
1104              bit 4: Receive buffer full
1105              bit 3: Receive error
1106              bit 2: Transmit buffer empty
1107              bit 1: Transmit error
1108              bit 0: Timer B
1109      Reg B - bit 7: GPIP5 (Unused, always 1)
1110              bit 6: GPIP4 (VSync)
1111              bit 5: Timer C
1112              bit 4: Timer D
1113              bit 3: GPIP3 (FM IRQ)
1114              bit 2: GPIP2 (Power switch)
1115              bit 1: GPIP1 (EXPON)
1116              bit 0: GPIP0 (Alarm)
1117   */
1118   switch(offset)
1119   {
1120   case 21:
1121      if(data & 0x01)
1122         m_mfp.usart.recv_enable = 1;
1123      else
1124         m_mfp.usart.recv_enable = 0;
1125      break;
1126   case 22:
1127      if(data & 0x01)
1128         m_mfp.usart.send_enable = 1;
1129      else
1130         m_mfp.usart.send_enable = 0;
1131      break;
1132   case 23:
1133      if(m_mfp.usart.send_enable != 0)
1134      {
1135         // Keyboard control command.
1136         m_mfp.usart.send_buffer = data;
1137         x68k_keyboard_ctrl_w(data);
1138//          logerror("MFP: [%08x] USART Sent data %04x\n",space.device().safe_pc(),data);
1139      }
1140      break;
1141   default:
1142      if (ACCESSING_BITS_0_7) m_mfpdev->write(space, offset, data & 0xff);
1143      return;
1144   }
1145}
1146
1147
1148920WRITE16_MEMBER(x68k_state::x68k_ppi_w)
1149921{
1150922   i8255_device *ppi = machine().device<i8255_device>("ppi8255");
r26791r26792
15401312   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w)
15411313   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w)
15421314   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w)
1543   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE(x68k_mfp_r, x68k_mfp_w)
1544   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff)
1315   AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff)
1316   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(RP5C15_TAG, rp5c15_device, read, write, 0x00ff)
15451317//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
15461318   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w)
15471319   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w)
r26791r26792
15781350   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w)
15791351   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w)
15801352   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w)
1581   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE(x68k_mfp_r, x68k_mfp_w)
1582   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff)
1353   AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff)
1354   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(RP5C15_TAG, rp5c15_device, read, write, 0x00ff)
15831355//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
15841356   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w)
15851357   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w)
r26791r26792
16181390   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE16(x68k_vid_r, x68k_vid_w,0xffffffff)
16191391   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE16(x68k_dmac_r, x68k_dmac_w,0xffffffff)
16201392   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE16(x68k_areaset_r, x68k_areaset_w,0xffffffff)
1621   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE16(x68k_mfp_r, x68k_mfp_w,0xffffffff)
1622   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff00ff)
1393   AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff00ff)
1394   AM_RANGE(0xe8a000, 0xe8bfff) AM_DEVREADWRITE8(RP5C15_TAG, rp5c15_device, read, write, 0x00ff00ff)
16231395//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
16241396   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE16(x68k_sysport_r, x68k_sysport_w,0xffffffff)
16251397   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE16(x68k_fm_r, x68k_fm_w,0xffffffff)
r26791r26792
16451417   AM_RANGE(0xfe0000, 0xffffff) AM_ROM
16461418ADDRESS_MAP_END
16471419
1648WRITE_LINE_MEMBER( x68k_state::mfp_tdo_w )
1420WRITE_LINE_MEMBER( x68k_state::mfp_tbo_w )
16491421{
16501422   m_mfpdev->clock_w(state);
16511423}
r26791r26792
16591431   DEVCB_DRIVER_MEMBER(x68k_state, mfp_gpio_r),        /* GPIO read */
16601432   DEVCB_NULL,                                         /* GPIO write */
16611433   DEVCB_NULL,                                         /* TAO */
1662   DEVCB_NULL,                                         /* TBO */
1434   DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tbo_w),    /* TBO */
16631435   DEVCB_NULL,                                         /* TCO */
1664   DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tdo_w),    /* TDO */
1665   DEVCB_NULL,                                         /* serial output */
1436   DEVCB_NULL,                                         /* TDO */
1437   DEVCB_DEVICE_LINE_MEMBER("keyboard", serial_keyboard_device, rx_w), /* serial output */
16661438   DEVCB_NULL,
16671439   DEVCB_NULL
16681440};
16691441
1442static struct serial_keyboard_interface x68k_keyboard_interface =
1443{
1444   DEVCB_DEVICE_LINE_MEMBER(MC68901_TAG, mc68901_device, write_rx)
1445};
1446
16701447static I8255A_INTERFACE( ppi_interface )
16711448{
16721449   DEVCB_DRIVER_MEMBER(x68k_state,ppi_port_a_r),
r26791r26792
17371514   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(JOYCODE_BUTTON2)  PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
17381515   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00)
17391516
1740   PORT_START( "key1" )
1741   PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_UNUSED) // unused
1742   PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)  /* ESC */
1743   PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("1  !  \xE3\x83\x8C") PORT_CODE(KEYCODE_1)  PORT_CHAR('1') PORT_CHAR('!') /* 1 ! */
1744   PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("2  \"  \xE3\x83\x95") PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"') /* 2 " */
1745   PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("3  #  \xE3\x82\xA2  \xE3\x82\xA1") PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#') /* 3 # */
1746   PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("4  $  \xE3\x82\xA6  \xE3\x82\xA5") PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$') /* 4 $ */
1747   PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("5  %  \xE3\x82\xA8  \xE3\x82\xA7") PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%') /* 5 % */
1748   PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("6  &  \xE3\x82\xAA  \xE3\x82\xA9") PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&') /* 6 & */
1749   PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("7  \'  \xE3\x83\xA4  \xE3\x83\xA3") PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'') /* 7 ' */
1750   PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("8  (  \xE3\x83\xA6  \xE3\x83\xA5") PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(') /* 8 ( */
1751   PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("9  )  \xE3\x83\xA8  \xE3\x83\xA7") PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')') /* 9 ) */
1752   PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("0  \xE3\x83\xAF  \xE3\x83\xB2") PORT_CODE(KEYCODE_0)  PORT_CHAR('0')                /* 0 */
1753   PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("-  =  \xE3\x83\x9B") PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('=') /* - = */
1754   PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("^  \xE3\x83\x98") PORT_CHAR('^') /* ^ */
1755   PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xC2\xA5  \xE3\x83\xBC  |") PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|') /* Yen | */
1756   PORT_BIT( 0x00008000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_BACKSPACE)  PORT_CHAR(8) /* Backspace */
1757   PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_TAB)  PORT_CHAR(9)  /* Tab */
1758   PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Q  \xE3\x82\xBF") PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q')  /* Q */
1759   PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("W  \xE3\x83\x86") PORT_CODE(KEYCODE_W)  PORT_CHAR('W')  /* W */
1760   PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("E  \xE3\x82\xA4  \xE3\x82\xA3") PORT_CODE(KEYCODE_E)  PORT_CHAR('E')  /* E */
1761   PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("R  \xE3\x82\xB9") PORT_CODE(KEYCODE_R)  PORT_CHAR('R')  /* R */
1762   PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("T  \xE3\x82\xAB") PORT_CODE(KEYCODE_T)  PORT_CHAR('T')  /* T */
1763   PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Y  \xE3\x83\xB3") PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y')  /* Y */
1764   PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("U  \xE3\x83\x8A") PORT_CODE(KEYCODE_U)  PORT_CHAR('U')  /* U */
1765   PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("I  \xE3\x83\x8B") PORT_CODE(KEYCODE_I)  PORT_CHAR('I')  /* I */
1766   PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("O  \xE3\x83\xA9") PORT_CODE(KEYCODE_O)  PORT_CHAR('O')  /* O */
1767   PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("P  \xE3\x82\xBB") PORT_CODE(KEYCODE_P)  PORT_CHAR('P')  /* P */
1768   PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("@  `  \xE3\x82\x9B") PORT_CHAR('@') PORT_CHAR('`')  /* @ */
1769   PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("[  {  \xE3\x82\x9C \xE3\x80\x8C") PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')  /* [ { */
1770   PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_CODE(KEYCODE_ENTER)  PORT_CHAR(13)  /* Return */
1771   PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("A  \xE3\x83\x81") PORT_CODE(KEYCODE_A)  PORT_CHAR('A')  /* A */
1772   PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("S  \xE3\x83\x88") PORT_CODE(KEYCODE_S)  PORT_CHAR('S')  /* S */
1773
1774   PORT_START( "key2" )
1775   PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("D  \xE3\x82\xB7") PORT_CODE(KEYCODE_D)  PORT_CHAR('D')  /* D */
1776   PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F  \xE3\x83\x8F") PORT_CODE(KEYCODE_F)  PORT_CHAR('F')  /* F */
1777   PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("G  \xE3\x82\xAD") PORT_CODE(KEYCODE_G)  PORT_CHAR('G')  /* G */
1778   PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("H  \xE3\x82\xAF") PORT_CODE(KEYCODE_H)  PORT_CHAR('H')  /* H */
1779   PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("J  \xE3\x83\x9E") PORT_CODE(KEYCODE_J)  PORT_CHAR('J')  /* J */
1780   PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("K  \xE3\x83\x8E") PORT_CODE(KEYCODE_K)  PORT_CHAR('K')  /* K */
1781   PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("L  \xE3\x83\xAA") PORT_CODE(KEYCODE_L)  PORT_CHAR('L')  /* L */
1782   PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(";  +  \xE3\x83\xAC") PORT_CODE(KEYCODE_COLON)  PORT_CHAR(';')  PORT_CHAR('+')  /* ; + */
1783   PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(":  *  \xE3\x82\xB1") PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR(':')  PORT_CHAR('*')  /* : * */
1784   PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("]  }  \xE3\x83\xA0  \xE3\x80\x8D") PORT_CODE(KEYCODE_CLOSEBRACE)  PORT_CHAR(']')  PORT_CHAR('}')  /* ] } */
1785   PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Z  \xE3\x83\x84  \xE3\x83\x83") PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z')  /* Z */
1786   PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("X  \xE3\x82\xB5") PORT_CODE(KEYCODE_X)  PORT_CHAR('X')  /* X */
1787   PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("C  \xE3\x82\xBD") PORT_CODE(KEYCODE_C)  PORT_CHAR('C')  /* C */
1788   PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("V  \xE3\x83\x92") PORT_CODE(KEYCODE_V)  PORT_CHAR('V')  /* V */
1789   PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("B  \xE3\x82\xB3") PORT_CODE(KEYCODE_B)  PORT_CHAR('B')  /* B */
1790   PORT_BIT( 0x00008000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("N  \xE3\x83\x9F") PORT_CODE(KEYCODE_N)  PORT_CHAR('N')  /* N */
1791   PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("M  \xE3\x83\xA2") PORT_CODE(KEYCODE_M)  PORT_CHAR('M')  /* M */
1792   PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(",  <  \xE3\x83\x8D  \xE3\x80\x81") PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',')  PORT_CHAR('<')  /* , < */
1793   PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME(".  >  \xE3\x83\xAB  \xE3\x80\x82") PORT_CODE(KEYCODE_STOP)  PORT_CHAR('.')  PORT_CHAR('>')  /* . > */
1794   PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("/  ?  \xE3\x83\xA1  \xE3\x83\xBB") PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/')  PORT_CHAR('?')  /* / ? */
1795   PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("_  \xE3\x83\xAD") PORT_CHAR('_')  /* Underscore (shifted only?) */
1796   PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Space")  PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')  /* Space */
1797   PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Home")  PORT_CODE(KEYCODE_HOME)  /* Home */
1798   PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Delete")  PORT_CODE(KEYCODE_DEL)  /* Del */
1799   PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Roll Up")  PORT_CODE(KEYCODE_PGUP)  /* Roll Up */
1800   PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Roll Down")  PORT_CODE(KEYCODE_PGDN)  /* Roll Down */
1801   PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Undo")  PORT_CODE(KEYCODE_END)  /* Undo */
1802   PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Left")  PORT_CODE(KEYCODE_LEFT)  /* Left */
1803   PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Up")  PORT_CODE(KEYCODE_UP)  /* Up */
1804   PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Right")  PORT_CODE(KEYCODE_RIGHT)  /* Right */
1805   PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Cursor Down")  PORT_CODE(KEYCODE_DOWN)  /* Down */
1806   PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey CLR")  PORT_CODE(KEYCODE_NUMLOCK)  /* CLR */
1807
1808   PORT_START( "key3" )
1809   PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey /")  PORT_CODE(KEYCODE_SLASH_PAD)  /* / (numpad) */
1810   PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey *")  PORT_CODE(KEYCODE_ASTERISK)  /* * (numpad) */
1811   PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey -")  PORT_CODE(KEYCODE_MINUS_PAD)  /* - (numpad) */
1812   PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 7")  PORT_CODE(KEYCODE_7_PAD)  /* 7 (numpad) */
1813   PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 8")  PORT_CODE(KEYCODE_8_PAD)  /* 8 (numpad) */
1814   PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 9")  PORT_CODE(KEYCODE_9_PAD)  /* 9 (numpad) */
1815   PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey +")  PORT_CODE(KEYCODE_PLUS_PAD)  /* + (numpad) */
1816   PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 4")  PORT_CODE(KEYCODE_4_PAD)  /* 4 (numpad) */
1817   PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 5")  PORT_CODE(KEYCODE_5_PAD)  /* 5 (numpad) */
1818   PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 6")  PORT_CODE(KEYCODE_6_PAD)  /* 6 (numpad) */
1819   PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey =")  /* = (numpad) */
1820   PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 1")  PORT_CODE(KEYCODE_1_PAD)  /* 1 (numpad) */
1821   PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 2")  PORT_CODE(KEYCODE_2_PAD)  /* 2 (numpad) */
1822   PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 3")  PORT_CODE(KEYCODE_3_PAD)  /* 3 (numpad) */
1823   PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey Enter")  PORT_CODE(KEYCODE_ENTER_PAD)  /* Enter (numpad) */
1824   PORT_BIT( 0x00008000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey 0")  PORT_CODE(KEYCODE_0_PAD)  /* 0 (numpad) */
1825   PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey ,")  /* , (numpad) */
1826   PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Tenkey .")  PORT_CODE(KEYCODE_DEL_PAD)  /* 2 (numpad) */
1827   PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE8\xA8\x98\xE5\x8F\xB7 (Symbolic input)")  /* Sign / Symbolic input (babelfish translation) */
1828   PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE7\x99\xBB\xE9\x8C\xB2 (Register)")  /* Register (babelfish translation) */
1829   PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Help")  /* Help */
1830   PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF1")  PORT_CODE(KEYCODE_F11)  /* XF1 */
1831   PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF2")  PORT_CODE(KEYCODE_F12)  /* XF2 */
1832   PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF3")  /* XF3 */
1833   PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF4")  /* XF4 */
1834   PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("XF5")  /* XF5 */
1835   PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xe3\x81\x8b\xe3\x81\xaa (Kana)")  /* Kana */
1836   PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x9e\xe5\xad\x97 (Romaji)")  /* Romaji */
1837   PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89 (Code input)")  /* Code input */
1838   PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Caps")  PORT_CODE(KEYCODE_CAPSLOCK)  /* Caps lock */
1839   PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Insert")  PORT_CODE(KEYCODE_INSERT)  /* Insert */
1840   PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE3\x81\xB2\xE3\x82\x89\xE3\x81\x8C\xE3\x81\xAA (Hiragana)")  /* Hiragana */
1841
1842   PORT_START( "key4" )
1843   PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("\xE5\x85\xA8\xE8\xA7\x92 (Full size)")  /* Full size (babelfish translation) */
1844   PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Break")  /* Break */
1845   PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Copy")  /* Copy */
1846   PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F1")  PORT_CODE(KEYCODE_F1)  /* F1 */
1847   PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F2")  PORT_CODE(KEYCODE_F2)  /* F2 */
1848   PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F3")  PORT_CODE(KEYCODE_F3)  /* F3 */
1849   PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F4")  PORT_CODE(KEYCODE_F4)  /* F4 */
1850   PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F5")  PORT_CODE(KEYCODE_F5)  /* F5 */
1851   PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F6")  PORT_CODE(KEYCODE_F6)  /* F6 */
1852   PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F7")  PORT_CODE(KEYCODE_F7)  /* F7 */
1853   PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F8")  PORT_CODE(KEYCODE_F8)  /* F8 */
1854   PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F9")  PORT_CODE(KEYCODE_F9)  /* F9 */
1855   PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("F10")  PORT_CODE(KEYCODE_F10)  /* F10 */
1856      // 0x6d reserved
1857      // 0x6e reserved
1858      // 0x6f reserved
1859   PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Shift")  PORT_CODE(KEYCODE_LSHIFT)  /* Shift */
1860   PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Ctrl")  PORT_CODE(KEYCODE_LCONTROL)  /* Ctrl */
1861   PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Opt. 1")  PORT_CODE(KEYCODE_PRTSCR) /* Opt1 */
1862   PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_KEYBOARD )  PORT_NAME("Opt. 2")  PORT_CODE(KEYCODE_PAUSE)  /* Opt2 */
1863
18641517   PORT_START("options")
1865   PORT_CONFNAME( 0x01, 0x01, "Enable keyboard hack")
1866   PORT_CONFSETTING(   0x00, DEF_STR( Off ))
1867   PORT_CONFSETTING(   0x01, DEF_STR( On ))
18681518   PORT_CONFNAME( 0x02, 0x02, "Enable fake bus errors")
18691519   PORT_CONFSETTING(   0x00, DEF_STR( Off ))
18701520   PORT_CONFSETTING(   0x02, DEF_STR( On ))
r26791r26792
20841734   memset(m_ram->pointer(),0,m_ram->size());
20851735   memcpy(m_ram->pointer(),romdata,8);
20861736
2087   // init keyboard
2088   m_keyboard.delay = 500;  // 3*100+200
2089   m_keyboard.repeat = 110;  // 4^2*5+30
2090
20911737   // initialise CRTC, set registers to defaults for the standard text mode (768x512)
20921738   m_crtc.reg[0] = 137;  // Horizontal total  (in characters)
20931739   m_crtc.reg[1] = 14;   // Horizontal sync end
r26791r26792
21491795   space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_sram_w),this));
21501796   membank("bank4")->set_base(m_nvram16);  // so that code in SRAM is executable, there is an option for booting from SRAM
21511797
2152   // start keyboard timer
2153   m_kb_timer->adjust(attotime::zero, 0, attotime::from_msec(5));  // every 5ms
2154
21551798   // start mouse timer
21561799   m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1));  // a guess for now
21571800   m_mouse.inputtype = 0;
r26791r26792
21961839   space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write32_delegate(FUNC(x68k_state::x68k_sram32_w),this));
21971840   membank("bank4")->set_base(m_nvram32);  // so that code in SRAM is executable, there is an option for booting from SRAM
21981841
2199   // start keyboard timer
2200   m_kb_timer->adjust(attotime::zero, 0, attotime::from_msec(5));  // every 5ms
2201
22021842   // start mouse timer
22031843   m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1));  // a guess for now
22041844   m_mouse.inputtype = 0;
r26791r26792
22471887
22481888   m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(x68k_state::x68k_int_ack),this));
22491889
2250   // init keyboard
2251   m_keyboard.delay = 500;  // 3*100+200
2252   m_keyboard.repeat = 110;  // 4^2*5+30
2253   m_kb_timer = timer_alloc(TIMER_X68K_KEYBOARD_POLL);
22541890   m_scanline_timer = timer_alloc(TIMER_X68K_HSYNC);
22551891   m_raster_irq = timer_alloc(TIMER_X68K_CRTC_RASTER_IRQ);
22561892   m_vblank_irq = timer_alloc(TIMER_X68K_CRTC_VBLANK_IRQ);
r26791r26792
23011937   /* device hardware */
23021938   MCFG_MC68901_ADD(MC68901_TAG, 4000000, mfp_interface)
23031939
1940   MCFG_X68K_KEYBOARD_ADD("keyboard", x68k_keyboard_interface)
1941
23041942   MCFG_I8255A_ADD( "ppi8255",  ppi_interface )
23051943
23061944   MCFG_HD63450_ADD( "hd63450", dmac_interface )
trunk/src/mess/mess.mak
r26791r26792
17951795   $(MESS_MACHINE)/x68k_neptunex.o \
17961796   $(MESS_MACHINE)/x68k_scsiext.o  \
17971797   $(MESS_MACHINE)/x68k_hdc.o  \
1798   $(MESS_MACHINE)/x68k_kbd.o  \
17981799   $(MESS_MACHINE)/mb89352.o   \
17991800   $(MESS_DRIVERS)/mz80.o      \
18001801   $(MESS_VIDEO)/mz80.o        \

Previous 199869 Revisions Next


© 1997-2024 The MAME Team