src/mess/drivers/esq5505.c
| r15483 | r15484 | |
| 7 | 7 | |
| 8 | 8 | The Taito sound system in taito_en.c is directly derived from the SQ-1. |
| 9 | 9 | |
| 10 | | Driver by R. Belmont |
| 10 | Driver by R. Belmont with thanks to Parduz, Christian Brunschen, and Phil Bennett |
| 11 | 11 | |
| 12 | 12 | Memory map: |
| 13 | 13 | |
| r15483 | r15484 | |
| 17 | 17 | 0x260000-0x2601ff ESP (5510) regs |
| 18 | 18 | 0x280000-0x28001f DUART (68681) regs |
| 19 | 19 | 0x2C0000-0x2C0003 Floppy (WD1772) regs (VFX-SD, SD-1, and EPS/EPS-16) |
| 20 | 0x2E0000-0x2FFFFF Expansion cartridge (VFX, unknown other models) |
| 20 | 21 | 0x300000-0x300003 EPS/EPS-16 SCSI (WD33C93, register at 300001, data at 300003) |
| 21 | 22 | 0x340000-0x3bffff EPS/EPS-16 sample RAM |
| 22 | 23 | 0xc00000-0xc3ffff OS ROM |
| 23 | 24 | 0xff0000-0xffffff work RAM hi (may or may not be mirrored with work RAM low) |
| 24 | | |
| 25 | |
| 25 | 26 | Interrupts: |
| 26 | 27 | 68681 uses custom vector 0x40 (address 0x100) |
| 27 | 28 | 5505 interrupts are on normal autovector IRQ 1 |
| 29 | |
| 30 | 68681 GPIO lines (from VFX schematics): |
| 31 | I0: CARTIN (if cartridge is present) |
| 32 | |
| 33 | O0: "AN0" |
| 34 | O1: "AN1" |
| 35 | O2: "AN2" (disk side select on EPS/EPS-16) |
| 36 | O6: To ESPHALT pin on ES5510 |
| 37 | O7: "SACK" |
| 38 | |
| 28 | 39 | |
| 29 | 40 | ***************************************************************************/ |
| 30 | 41 | |
| r15483 | r15484 | |
| 45 | 56 | #define EPS (1) |
| 46 | 57 | #define SQ1 (2) |
| 47 | 58 | |
| 59 | #define KEYBOARD_HACK (0) // turn on to play the SQ-1: Z and X are program up/down, A/S/D/F/G/H/J/K/L and Q/W/E/R/T/Y/U play notes |
| 60 | |
| 61 | #if KEYBOARD_HACK |
| 62 | static int program = 0; |
| 63 | #endif |
| 64 | |
| 48 | 65 | class esq5505_state : public driver_device |
| 49 | 66 | { |
| 50 | 67 | public: |
| r15483 | r15484 | |
| 221 | 238 | AM_RANGE(0x240000, 0x2400ff) AM_DEVREADWRITE_LEGACY("mc68450", hd63450_r, hd63450_w) |
| 222 | 239 | AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff) |
| 223 | 240 | AM_RANGE(0x2c0000, 0x2c0007) AM_DEVREADWRITE8("wd1772", wd1772_t, read, write, 0x00ff) |
| 224 | | AM_RANGE(0x580000, 0x77ffff) AM_RAM // sample RAM? |
| 241 | AM_RANGE(0x580000, 0x7fffff) AM_RAM // sample RAM? |
| 225 | 242 | AM_RANGE(0xc00000, 0xc0ffff) AM_ROM AM_REGION("osrom", 0) |
| 226 | 243 | AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram") |
| 227 | 244 | ADDRESS_MAP_END |
| r15483 | r15484 | |
| 373 | 390 | state->m_fdc->data_w(data & 0xff); |
| 374 | 391 | } |
| 375 | 392 | |
| 393 | #if KEYBOARD_HACK |
| 394 | static INPUT_CHANGED( key_stroke ) |
| 395 | { |
| 396 | esq5505_state *state = device.machine().driver_data<esq5505_state>(); |
| 397 | |
| 398 | // send a MIDI Note On |
| 399 | if (oldval == 0 && newval == 1) |
| 400 | { |
| 401 | if ((UINT8)(FPTR)param < 0x40) |
| 402 | { |
| 403 | int code = (int)(FPTR)param; |
| 404 | |
| 405 | if (code == 0) |
| 406 | { |
| 407 | program--; |
| 408 | if (program < 0) |
| 409 | { |
| 410 | program = 0; |
| 411 | } |
| 412 | printf("program to %d\n", program); |
| 413 | } |
| 414 | if (code == 1) |
| 415 | { |
| 416 | program++; |
| 417 | if (program > 127) |
| 418 | { |
| 419 | program = 127; |
| 420 | } |
| 421 | printf("program to %d\n", program); |
| 422 | } |
| 423 | |
| 424 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)0xc0); // program change |
| 425 | duart68681_rx_data(state->m_duart, 0, program); // program |
| 426 | } |
| 427 | else |
| 428 | { |
| 429 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)0x90); // note on |
| 430 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)param); |
| 431 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)0x7f); |
| 432 | } |
| 433 | } |
| 434 | else if (oldval == 1 && newval == 0) |
| 435 | { |
| 436 | if ((UINT8)(FPTR)param != 0x40) |
| 437 | { |
| 438 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)0x80); // note off |
| 439 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)param); |
| 440 | duart68681_rx_data(state->m_duart, 0, (UINT8)(FPTR)0x7f); |
| 441 | } |
| 442 | } |
| 443 | } |
| 444 | #endif |
| 445 | |
| 376 | 446 | static const hd63450_intf dmac_interface = |
| 377 | 447 | { |
| 378 | 448 | "maincpu", // CPU - 68000 |
| r15483 | r15484 | |
| 387 | 457 | static const es5505_interface es5505_config = |
| 388 | 458 | { |
| 389 | 459 | "waverom", /* Bank 0 */ |
| 390 | | "waverom", /* Bank 1 */ |
| 460 | "waverom2", /* Bank 1 */ |
| 391 | 461 | NULL, /* irq */ |
| 392 | 462 | esq5505_read_adc |
| 393 | 463 | }; |
| 394 | 464 | |
| 395 | 465 | static MACHINE_CONFIG_START( vfx, esq5505_state ) |
| 396 | | MCFG_CPU_ADD("maincpu", M68000, 16000000) |
| 466 | MCFG_CPU_ADD("maincpu", M68000, 10000000) |
| 397 | 467 | MCFG_CPU_PROGRAM_MAP(vfx_map) |
| 398 | 468 | |
| 399 | 469 | MCFG_ESQ2x40_ADD("vfd") |
| r15483 | r15484 | |
| 434 | 504 | MACHINE_CONFIG_END |
| 435 | 505 | |
| 436 | 506 | static INPUT_PORTS_START( vfx ) |
| 507 | #if KEYBOARD_HACK |
| 508 | PORT_START("KEY0") |
| 509 | PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED(key_stroke, 0x40) |
| 510 | PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHANGED(key_stroke, 0x41) |
| 511 | PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHANGED(key_stroke, 0x42) |
| 512 | PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHANGED(key_stroke, 0x43) |
| 513 | PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHANGED(key_stroke, 0x44) |
| 514 | PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHANGED(key_stroke, 0x45) |
| 515 | PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHANGED(key_stroke, 0x46) |
| 516 | PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHANGED(key_stroke, 0x47) |
| 517 | PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHANGED(key_stroke, 0x48) |
| 518 | PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHANGED(key_stroke, 0x49) |
| 519 | PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHANGED(key_stroke, 0x4a) |
| 520 | PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('e') PORT_CHAR('E') PORT_CHANGED(key_stroke, 0x4b) |
| 521 | PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('r') PORT_CHAR('R') PORT_CHANGED(key_stroke, 0x4c) |
| 522 | PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('t') PORT_CHAR('T') PORT_CHANGED(key_stroke, 0x4d) |
| 523 | PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHANGED(key_stroke, 0x4e) |
| 524 | PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('u') PORT_CHAR('U') PORT_CHANGED(key_stroke, 0x4f) |
| 525 | |
| 526 | PORT_START("KEY1") |
| 527 | PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHANGED(key_stroke, 0x0) |
| 528 | PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHANGED(key_stroke, 0x1) |
| 529 | #endif |
| 437 | 530 | INPUT_PORTS_END |
| 438 | 531 | |
| 439 | 532 | ROM_START( vfx ) |
| r15483 | r15484 | |
| 442 | 535 | ROM_LOAD16_BYTE( "vfx210b-high.bin", 0x000001, 0x010000, CRC(59853be8) SHA1(8e07f69d53f80885d15f624e0b912aeaf3212ee4) ) |
| 443 | 536 | |
| 444 | 537 | ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00) |
| 445 | | ROM_LOAD( "vfx-waves-1.bin", 0x000000, 0x080000, NO_DUMP ) |
| 446 | | ROM_LOAD( "vfx-waves-2.bin", 0x100000, 0x080000, NO_DUMP ) |
| 538 | ROM_LOAD( "u14.bin", 0x000000, 0x080000, NO_DUMP ) // type 234000 on the schematic |
| 539 | ROM_LOAD( "u15.bin", 0x080000, 0x080000, NO_DUMP ) |
| 540 | ROM_LOAD( "u16.bin", 0x100000, 0x080000, NO_DUMP ) |
| 447 | 541 | ROM_END |
| 448 | 542 | |
| 449 | 543 | ROM_START( vfxsd ) |
| r15483 | r15484 | |
| 452 | 546 | ROM_LOAD16_BYTE( "vfxsd_200_upper.bin", 0x000001, 0x010000, CRC(9a40efa2) SHA1(e38a2a4514519c1573361cb1526139bfcf94e45a) ) |
| 453 | 547 | |
| 454 | 548 | ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00) |
| 455 | | ROM_LOAD( "vfxsd-waves-1.bin", 0x000000, 0x080000, NO_DUMP ) |
| 456 | | ROM_LOAD( "vfxsd-waves-2.bin", 0x100000, 0x080000, NO_DUMP ) |
| 549 | ROM_LOAD( "u54.bin", 0x000000, 0x010000, NO_DUMP ) |
| 550 | ROM_LOAD( "u55.bin", 0x010000, 0x010000, NO_DUMP ) |
| 551 | ROM_LOAD( "u56.bin", 0x020000, 0x010000, NO_DUMP ) |
| 552 | ROM_LOAD( "u57.bin", 0x030000, 0x080000, NO_DUMP ) |
| 553 | ROM_LOAD( "u58.bin", 0x038000, 0x080000, NO_DUMP ) |
| 554 | ROM_LOAD( "u59.bin", 0x040000, 0x010000, NO_DUMP ) |
| 555 | ROM_LOAD( "u60.bin", 0x050000, 0x080000, NO_DUMP ) |
| 556 | |
| 557 | ROM_REGION(0x200000, "waverom2", ROMREGION_ERASE00) |
| 457 | 558 | ROM_END |
| 458 | 559 | |
| 459 | 560 | ROM_START( sd1 ) |