trunk/src/mess/drivers/vic10.c
| r20545 | r20546 | |
| 23 | 23 | |
| 24 | 24 | void vic10_state::check_interrupts() |
| 25 | 25 | { |
| 26 | | m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_cia_irq | m_vic_irq | m_exp_irq); |
| 26 | m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_cia_irq || m_vic_irq || m_exp_irq); |
| 27 | 27 | } |
| 28 | 28 | |
| 29 | 29 | |
| r20545 | r20546 | |
| 185 | 185 | //------------------------------------------------- |
| 186 | 186 | |
| 187 | 187 | static INPUT_PORTS_START( vic10 ) |
| 188 | | PORT_INCLUDE( common_cbm_keyboard ) // ROW0 -> ROW7 |
| 188 | PORT_START( "ROW0" ) |
| 189 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP)) |
| 190 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F5)) |
| 191 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F3)) |
| 192 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) |
| 193 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F7)) |
| 194 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) |
| 195 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 196 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("INST DEL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) |
| 189 | 197 | |
| 190 | | PORT_INCLUDE( c64_special ) // SPECIAL |
| 198 | PORT_START( "ROW1" ) |
| 199 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 200 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 201 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') |
| 202 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') |
| 203 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 204 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 205 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') |
| 206 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 191 | 207 | |
| 192 | | PORT_INCLUDE( c64_controls ) // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER |
| 208 | PORT_START( "ROW2" ) |
| 209 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') |
| 210 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') |
| 211 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 212 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 213 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') |
| 214 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 215 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') |
| 216 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 217 | |
| 218 | PORT_START( "ROW3" ) |
| 219 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') |
| 220 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') |
| 221 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') |
| 222 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 223 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 224 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') |
| 225 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') |
| 226 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') |
| 227 | |
| 228 | PORT_START( "ROW4" ) |
| 229 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') |
| 230 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') |
| 231 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') |
| 232 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') |
| 233 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 234 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') |
| 235 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') |
| 236 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
| 237 | |
| 238 | PORT_START( "ROW5" ) |
| 239 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 240 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') |
| 241 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(':') PORT_CHAR('[') |
| 242 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 243 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') |
| 244 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') |
| 245 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') |
| 246 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+') |
| 247 | |
| 248 | PORT_START( "ROW6" ) |
| 249 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 250 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91 Pi") PORT_CODE(KEYCODE_DEL) PORT_CHAR(0x2191) PORT_CHAR(0x03C0) |
| 251 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('=') |
| 252 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| 253 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CLR HOME") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(HOME)) |
| 254 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(';') PORT_CHAR(']') |
| 255 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('*') |
| 256 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\xA3') |
| 257 | |
| 258 | PORT_START( "ROW7" ) |
| 259 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN STOP") PORT_CODE(KEYCODE_HOME) |
| 260 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') |
| 261 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CBM") PORT_CODE(KEYCODE_LALT) |
| 262 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 263 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 264 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_SHIFT_2) |
| 265 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(0x2190) |
| 266 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') |
| 267 | |
| 268 | PORT_START( "RESTORE" ) |
| 269 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESTORE") PORT_CODE(KEYCODE_PRTSCR) |
| 270 | |
| 271 | PORT_START( "LOCK" ) |
| 272 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) |
| 273 | PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 193 | 274 | INPUT_PORTS_END |
| 194 | 275 | |
| 195 | 276 | |
| r20545 | r20546 | |
| 202 | 283 | // vic2_interface vic_intf |
| 203 | 284 | //------------------------------------------------- |
| 204 | 285 | |
| 205 | | INTERRUPT_GEN_MEMBER(vic10_state::vic10_frame_interrupt) |
| 206 | | { |
| 207 | | cbm_common_interrupt(&device); |
| 208 | | } |
| 209 | | |
| 210 | 286 | WRITE_LINE_MEMBER( vic10_state::vic_irq_w ) |
| 211 | 287 | { |
| 212 | 288 | m_vic_irq = state; |
| r20545 | r20546 | |
| 237 | 313 | { |
| 238 | 314 | case 1: data = m_joy1->pot_x_r(); break; |
| 239 | 315 | case 2: data = m_joy2->pot_x_r(); break; |
| 240 | | case 3: break; // TODO pot1 and pot2 in series |
| 316 | case 3: |
| 317 | if (m_joy1->has_pot_x() && m_joy2->has_pot_x()) |
| 318 | { |
| 319 | data = 1 / (1 / m_joy1->pot_x_r() + 1 / m_joy2->pot_x_r()); |
| 320 | } |
| 321 | else if (m_joy1->has_pot_x()) |
| 322 | { |
| 323 | data = m_joy1->pot_x_r(); |
| 324 | } |
| 325 | else if (m_joy2->has_pot_x()) |
| 326 | { |
| 327 | data = m_joy2->pot_x_r(); |
| 328 | } |
| 329 | break; |
| 241 | 330 | } |
| 242 | 331 | |
| 243 | 332 | return data; |
| r20545 | r20546 | |
| 251 | 340 | { |
| 252 | 341 | case 1: data = m_joy1->pot_y_r(); break; |
| 253 | 342 | case 2: data = m_joy2->pot_y_r(); break; |
| 254 | | case 3: break; // TODO pot1 and pot2 in series |
| 343 | case 3: |
| 344 | if (m_joy1->has_pot_y() && m_joy2->has_pot_y()) |
| 345 | { |
| 346 | data = 1 / (1 / m_joy1->pot_y_r() + 1 / m_joy2->pot_y_r()); |
| 347 | } |
| 348 | else if (m_joy1->has_pot_y()) |
| 349 | { |
| 350 | data = m_joy1->pot_y_r(); |
| 351 | } |
| 352 | else if (m_joy2->has_pot_y()) |
| 353 | { |
| 354 | data = m_joy2->pot_y_r(); |
| 355 | } |
| 356 | break; |
| 255 | 357 | } |
| 256 | 358 | |
| 257 | 359 | return data; |
| r20545 | r20546 | |
| 292 | 394 | |
| 293 | 395 | */ |
| 294 | 396 | |
| 295 | | UINT8 cia0portb = m_cia->pb_r(); |
| 397 | UINT8 data = 0xff; |
| 296 | 398 | |
| 297 | | return cbm_common_cia0_port_a_r(m_cia, cia0portb); |
| 399 | // joystick |
| 400 | UINT8 joy_b = m_joy2->joy_r(); |
| 401 | |
| 402 | data &= (0xf0 | (joy_b & 0x0f)); |
| 403 | data &= ~(!BIT(joy_b, 5) << 4); |
| 404 | |
| 405 | // keyboard |
| 406 | UINT8 cia_pb = m_cia->pb_r(); |
| 407 | UINT8 row[8] = { m_row0->read(), m_row1->read() & m_lock->read(), m_row2->read(), m_row3->read(), |
| 408 | m_row4->read(), m_row5->read(), m_row6->read(), m_row7->read() }; |
| 409 | |
| 410 | for (int i = 0; i < 8; i++) |
| 411 | { |
| 412 | if (!BIT(cia_pb, i)) |
| 413 | { |
| 414 | if (!BIT(row[7], i)) data &= ~0x80; |
| 415 | if (!BIT(row[6], i)) data &= ~0x40; |
| 416 | if (!BIT(row[5], i)) data &= ~0x20; |
| 417 | if (!BIT(row[4], i)) data &= ~0x10; |
| 418 | if (!BIT(row[3], i)) data &= ~0x08; |
| 419 | if (!BIT(row[2], i)) data &= ~0x04; |
| 420 | if (!BIT(row[1], i)) data &= ~0x02; |
| 421 | if (!BIT(row[0], i)) data &= ~0x01; |
| 422 | } |
| 423 | } |
| 424 | |
| 425 | return data; |
| 298 | 426 | } |
| 299 | 427 | |
| 300 | 428 | READ8_MEMBER( vic10_state::cia_pb_r ) |
| r20545 | r20546 | |
| 314 | 442 | |
| 315 | 443 | */ |
| 316 | 444 | |
| 317 | | UINT8 cia0porta = m_cia->pa_r(); |
| 445 | UINT8 data = 0xff; |
| 318 | 446 | |
| 319 | | return cbm_common_cia0_port_b_r(m_cia, cia0porta); |
| 447 | // joystick |
| 448 | UINT8 joy_a = m_joy1->joy_r(); |
| 449 | |
| 450 | data &= (0xf0 | (joy_a & 0x0f)); |
| 451 | data &= ~(!BIT(joy_a, 5) << 4); |
| 452 | |
| 453 | // keyboard |
| 454 | UINT8 cia_pa = m_cia->pa_r(); |
| 455 | |
| 456 | if (!BIT(cia_pa, 7)) data &= m_row7->read(); |
| 457 | if (!BIT(cia_pa, 6)) data &= m_row6->read(); |
| 458 | if (!BIT(cia_pa, 5)) data &= m_row5->read(); |
| 459 | if (!BIT(cia_pa, 4)) data &= m_row4->read(); |
| 460 | if (!BIT(cia_pa, 3)) data &= m_row3->read(); |
| 461 | if (!BIT(cia_pa, 2)) data &= m_row2->read(); |
| 462 | if (!BIT(cia_pa, 1)) data &= m_row1->read() & m_lock->read(); |
| 463 | if (!BIT(cia_pa, 0)) data &= m_row0->read(); |
| 464 | |
| 465 | return data; |
| 320 | 466 | } |
| 321 | 467 | |
| 322 | 468 | WRITE8_MEMBER( vic10_state::cia_pb_w ) |
| r20545 | r20546 | |
| 496 | 642 | MCFG_CPU_PROGRAM_MAP(vic10_mem) |
| 497 | 643 | MCFG_M6510_PORT_CALLBACKS(READ8(vic10_state, cpu_r), WRITE8(vic10_state, cpu_w)) |
| 498 | 644 | MCFG_M6510_PORT_PULLS(0x10, 0x20) |
| 499 | | MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, vic10_state, vic10_frame_interrupt) |
| 500 | 645 | MCFG_QUANTUM_PERFECT_CPU(M6510_TAG) |
| 501 | 646 | |
| 502 | 647 | // video hardware |
| r20545 | r20546 | |
| 514 | 659 | MCFG_MOS6526_ADD(MOS6526_TAG, VIC6566_CLOCK, 60, cia_intf) |
| 515 | 660 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, NULL, NULL) |
| 516 | 661 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL) |
| 517 | | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL) |
| 662 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL) |
| 518 | 663 | MCFG_VIC10_EXPANSION_SLOT_ADD(VIC10_EXPANSION_SLOT_TAG, VIC6566_CLOCK, expansion_intf, vic10_expansion_cards, NULL, NULL) |
| 519 | 664 | |
| 520 | 665 | // software list |