trunk/src/mess/machine/x68k_kbd.c
| r0 | r26792 | |
| 1 | #include "machine/x68k_kbd.h" |
| 2 | |
| 3 | x68k_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 | |
| 15 | void 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 | |
| 85 | UINT8 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 | |
| 159 | static 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") |
| 312 | INPUT_PORTS_END |
| 313 | |
| 314 | ioport_constructor x68k_keyboard_device::device_input_ports() const |
| 315 | { |
| 316 | return INPUT_PORTS_NAME(x68k_keyboard); |
| 317 | } |
| 318 | |
| 319 | void 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 | |
| 325 | void 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 | |
| 337 | void x68k_keyboard_device::rcv_complete() |
| 338 | { |
| 339 | receive_register_extract(); |
| 340 | write(get_received_char()); |
| 341 | } |
| 342 | |
| 343 | const device_type X68K_KEYBOARD = &device_creator<x68k_keyboard_device>; |
| 344 | |
| 345 | #if 0 |
| 346 | |
| 347 | void 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 | |
| 372 | TIMER_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 |
trunk/src/mess/drivers/x68k.c
| r26791 | r26792 | |
| 128 | 128 | #include "formats/xdf_dsk.h" |
| 129 | 129 | #include "formats/dim_dsk.h" |
| 130 | 130 | #include "machine/x68k_hdc.h" |
| 131 | #include "machine/x68k_kbd.h" |
| 131 | 132 | #include "includes/x68k.h" |
| 132 | 133 | #include "machine/ram.h" |
| 133 | 134 | #include "machine/nvram.h" |
| r26791 | r26792 | |
| 147 | 148 | case TIMER_X68K_LED: |
| 148 | 149 | x68k_led_callback(ptr, param); |
| 149 | 150 | break; |
| 150 | | case TIMER_X68K_KEYBOARD_POLL: |
| 151 | | x68k_keyboard_poll(ptr, param); |
| 152 | | break; |
| 153 | 151 | case TIMER_X68K_SCC_ACK: |
| 154 | 152 | x68k_scc_ack(ptr, param); |
| 155 | 153 | break; |
| r26791 | r26792 | |
| 223 | 221 | return hd63450_r(device, space, offset, mem_mask); |
| 224 | 222 | } |
| 225 | 223 | |
| 226 | | void x68k_state::x68k_keyboard_ctrl_w(int data) |
| 227 | | { |
| 228 | | /* Keyboard control commands: |
| 229 | | 00xxxxxx - TV Control |
| 230 | | Not of much use as yet |
| 231 | 224 | |
| 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 | | |
| 297 | | int 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 | | |
| 312 | | void 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 | | |
| 336 | | TIMER_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 | | |
| 384 | 225 | // mouse input |
| 385 | 226 | // port B of the Z8530 SCC |
| 386 | 227 | // typically read from the SCC data port on receive buffer full interrupt per byte |
| r26791 | r26792 | |
| 1076 | 917 | } |
| 1077 | 918 | } |
| 1078 | 919 | |
| 1079 | | READ16_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 | | |
| 1098 | | WRITE16_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 | | |
| 1148 | 920 | WRITE16_MEMBER(x68k_state::x68k_ppi_w) |
| 1149 | 921 | { |
| 1150 | 922 | i8255_device *ppi = machine().device<i8255_device>("ppi8255"); |
| r26791 | r26792 | |
| 1540 | 1312 | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1541 | 1313 | AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w) |
| 1542 | 1314 | 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) |
| 1545 | 1317 | // AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w) |
| 1546 | 1318 | AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w) |
| 1547 | 1319 | AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w) |
| r26791 | r26792 | |
| 1578 | 1350 | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1579 | 1351 | AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w) |
| 1580 | 1352 | 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) |
| 1583 | 1355 | // AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w) |
| 1584 | 1356 | AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w) |
| 1585 | 1357 | AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w) |
| r26791 | r26792 | |
| 1618 | 1390 | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE16(x68k_vid_r, x68k_vid_w,0xffffffff) |
| 1619 | 1391 | AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE16(x68k_dmac_r, x68k_dmac_w,0xffffffff) |
| 1620 | 1392 | 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) |
| 1623 | 1395 | // AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w) |
| 1624 | 1396 | AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE16(x68k_sysport_r, x68k_sysport_w,0xffffffff) |
| 1625 | 1397 | AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE16(x68k_fm_r, x68k_fm_w,0xffffffff) |
| r26791 | r26792 | |
| 1645 | 1417 | AM_RANGE(0xfe0000, 0xffffff) AM_ROM |
| 1646 | 1418 | ADDRESS_MAP_END |
| 1647 | 1419 | |
| 1648 | | WRITE_LINE_MEMBER( x68k_state::mfp_tdo_w ) |
| 1420 | WRITE_LINE_MEMBER( x68k_state::mfp_tbo_w ) |
| 1649 | 1421 | { |
| 1650 | 1422 | m_mfpdev->clock_w(state); |
| 1651 | 1423 | } |
| r26791 | r26792 | |
| 1659 | 1431 | DEVCB_DRIVER_MEMBER(x68k_state, mfp_gpio_r), /* GPIO read */ |
| 1660 | 1432 | DEVCB_NULL, /* GPIO write */ |
| 1661 | 1433 | DEVCB_NULL, /* TAO */ |
| 1662 | | DEVCB_NULL, /* TBO */ |
| 1434 | DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tbo_w), /* TBO */ |
| 1663 | 1435 | 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 */ |
| 1666 | 1438 | DEVCB_NULL, |
| 1667 | 1439 | DEVCB_NULL |
| 1668 | 1440 | }; |
| 1669 | 1441 | |
| 1442 | static struct serial_keyboard_interface x68k_keyboard_interface = |
| 1443 | { |
| 1444 | DEVCB_DEVICE_LINE_MEMBER(MC68901_TAG, mc68901_device, write_rx) |
| 1445 | }; |
| 1446 | |
| 1670 | 1447 | static I8255A_INTERFACE( ppi_interface ) |
| 1671 | 1448 | { |
| 1672 | 1449 | DEVCB_DRIVER_MEMBER(x68k_state,ppi_port_a_r), |
| r26791 | r26792 | |
| 1737 | 1514 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(JOYCODE_BUTTON2) PORT_PLAYER(2) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00) |
| 1738 | 1515 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("ctrltype", 0xf0, EQUALS, 0x00) |
| 1739 | 1516 | |
| 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 | | |
| 1864 | 1517 | 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 )) |
| 1868 | 1518 | PORT_CONFNAME( 0x02, 0x02, "Enable fake bus errors") |
| 1869 | 1519 | PORT_CONFSETTING( 0x00, DEF_STR( Off )) |
| 1870 | 1520 | PORT_CONFSETTING( 0x02, DEF_STR( On )) |
| r26791 | r26792 | |
| 2084 | 1734 | memset(m_ram->pointer(),0,m_ram->size()); |
| 2085 | 1735 | memcpy(m_ram->pointer(),romdata,8); |
| 2086 | 1736 | |
| 2087 | | // init keyboard |
| 2088 | | m_keyboard.delay = 500; // 3*100+200 |
| 2089 | | m_keyboard.repeat = 110; // 4^2*5+30 |
| 2090 | | |
| 2091 | 1737 | // initialise CRTC, set registers to defaults for the standard text mode (768x512) |
| 2092 | 1738 | m_crtc.reg[0] = 137; // Horizontal total (in characters) |
| 2093 | 1739 | m_crtc.reg[1] = 14; // Horizontal sync end |
| r26791 | r26792 | |
| 2149 | 1795 | space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_sram_w),this)); |
| 2150 | 1796 | membank("bank4")->set_base(m_nvram16); // so that code in SRAM is executable, there is an option for booting from SRAM |
| 2151 | 1797 | |
| 2152 | | // start keyboard timer |
| 2153 | | m_kb_timer->adjust(attotime::zero, 0, attotime::from_msec(5)); // every 5ms |
| 2154 | | |
| 2155 | 1798 | // start mouse timer |
| 2156 | 1799 | m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1)); // a guess for now |
| 2157 | 1800 | m_mouse.inputtype = 0; |
| r26791 | r26792 | |
| 2196 | 1839 | space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write32_delegate(FUNC(x68k_state::x68k_sram32_w),this)); |
| 2197 | 1840 | membank("bank4")->set_base(m_nvram32); // so that code in SRAM is executable, there is an option for booting from SRAM |
| 2198 | 1841 | |
| 2199 | | // start keyboard timer |
| 2200 | | m_kb_timer->adjust(attotime::zero, 0, attotime::from_msec(5)); // every 5ms |
| 2201 | | |
| 2202 | 1842 | // start mouse timer |
| 2203 | 1843 | m_mouse_timer->adjust(attotime::zero, 0, attotime::from_msec(1)); // a guess for now |
| 2204 | 1844 | m_mouse.inputtype = 0; |
| r26791 | r26792 | |
| 2247 | 1887 | |
| 2248 | 1888 | m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(x68k_state::x68k_int_ack),this)); |
| 2249 | 1889 | |
| 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); |
| 2254 | 1890 | m_scanline_timer = timer_alloc(TIMER_X68K_HSYNC); |
| 2255 | 1891 | m_raster_irq = timer_alloc(TIMER_X68K_CRTC_RASTER_IRQ); |
| 2256 | 1892 | m_vblank_irq = timer_alloc(TIMER_X68K_CRTC_VBLANK_IRQ); |
| r26791 | r26792 | |
| 2301 | 1937 | /* device hardware */ |
| 2302 | 1938 | MCFG_MC68901_ADD(MC68901_TAG, 4000000, mfp_interface) |
| 2303 | 1939 | |
| 1940 | MCFG_X68K_KEYBOARD_ADD("keyboard", x68k_keyboard_interface) |
| 1941 | |
| 2304 | 1942 | MCFG_I8255A_ADD( "ppi8255", ppi_interface ) |
| 2305 | 1943 | |
| 2306 | 1944 | MCFG_HD63450_ADD( "hd63450", dmac_interface ) |