trunk/src/mess/drivers/esq5505.c
| r19130 | r19131 | |
| 36 | 36 | O6: To ESPHALT pin on ES5510 |
| 37 | 37 | O7: "SACK" |
| 38 | 38 | |
| 39 | VFX-SD / SD-1 / SD-1 32 panel button codes: |
| 40 | 2 = PROG-CNTL |
| 41 | 3 = WRITE EDIT PROGRAM |
| 42 | 4 = WAVE |
| 43 | 5 = SELECT VOICE |
| 44 | 6 = MIXER/SHAPER |
| 45 | 7 & 8 = EFFECT |
| 46 | 9 = COPY EFFECTS PARAMETERS |
| 47 | 10 = LFO |
| 48 | 11 = PITCH |
| 49 | 12 = ENV1 |
| 50 | 13 = PITCH MOD |
| 51 | 14 = ENV2 |
| 52 | 15 = FILTER |
| 53 | 16 = ENV3 |
| 54 | 17 = OUTPUT |
| 55 | 20 = MASTER |
| 56 | 24 = MIDI |
| 57 | 25 = INT9 |
| 58 | 26 = PSEL |
| 59 | 27 = STAT |
| 60 | 28 = EFFECT |
| 61 | 29 = INT9 |
| 62 | 30 = TRAX |
| 63 | 31 = TRAX (page 2) |
| 64 | 34 = INT8 |
| 65 | 35 = INT7 |
| 66 | 36 = VOL |
| 67 | 37 = PAN |
| 68 | 38 = TIMB |
| 69 | 39 = ZONE |
| 70 | 40 = XPOS |
| 71 | 41 = RELS |
| 72 | |
| 39 | 73 | ***************************************************************************/ |
| 40 | 74 | |
| 41 | 75 | #include "emu.h" |
| r19130 | r19131 | |
| 55 | 89 | #define EPS (1) |
| 56 | 90 | #define SQ1 (2) |
| 57 | 91 | |
| 58 | | #define KEYBOARD_HACK (0) // turn on to play the SQ-1, SD-1, and SD-1 32-voice: 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 |
| 92 | #define KEYBOARD_HACK (1) // turn on to play the SQ-1, SD-1, and SD-1 32-voice: 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 |
| 59 | 93 | |
| 60 | 94 | #if KEYBOARD_HACK |
| 61 | 95 | static int program = 0; |
| r19130 | r19131 | |
| 136 | 170 | |
| 137 | 171 | READ16_MEMBER(esq5505_state::es5510_dsp_r) |
| 138 | 172 | { |
| 139 | | // logerror("%06x: DSP read offset %04x (data is %04x)\n",space.device().safe_pc(),offset,es5510_dsp_ram[offset]); |
| 173 | // printf("%06x: DSP read offset %04x (data is %04x)\n",space.device().safe_pc(),offset,es5510_dsp_ram[offset]); |
| 140 | 174 | |
| 175 | // VFX hack |
| 176 | if (mame_stricmp(space.machine().system().name, "vfx") == 0) |
| 177 | { |
| 178 | if (space.device().safe_pc() == 0xc091f0) |
| 179 | { |
| 180 | return space.device().state().state_int(M68K_D2); |
| 181 | } |
| 182 | } |
| 183 | |
| 141 | 184 | switch(offset) |
| 142 | 185 | { |
| 143 | 186 | case 0x09: return (es5510_dil_latch >> 16) & 0xff; |
| r19130 | r19131 | |
| 324 | 367 | break; |
| 325 | 368 | } |
| 326 | 369 | |
| 327 | | if (state->m_bCalibSecondByte) |
| 370 | if (state->m_bCalibSecondByte) |
| 328 | 371 | { |
| 329 | 372 | if (data == 0xfd) // calibration request |
| 330 | 373 | { |
| r19130 | r19131 | |
| 396 | 439 | #if KEYBOARD_HACK |
| 397 | 440 | INPUT_CHANGED_MEMBER(esq5505_state::key_stroke) |
| 398 | 441 | { |
| 442 | #if 1 // MIDI |
| 399 | 443 | // send a MIDI Note On |
| 400 | 444 | if (oldval == 0 && newval == 1) |
| 401 | 445 | { |
| r19130 | r19131 | |
| 441 | 485 | duart68681_rx_data(m_duart, 0, (UINT8)(FPTR)0x7f); |
| 442 | 486 | } |
| 443 | 487 | } |
| 488 | #else |
| 489 | int val = (UINT8)(FPTR)param; |
| 490 | val += 50; |
| 491 | if (oldval == 0 && newval == 1) |
| 492 | { |
| 493 | printf("key on %d\n", val&0x7f); |
| 494 | duart68681_rx_data(m_duart, 1, val); |
| 495 | duart68681_rx_data(m_duart, 1, 0x00); |
| 496 | } |
| 497 | else if (oldval == 1 && newval == 0) |
| 498 | { |
| 499 | // printf("key off %x\n", (UINT8)(FPTR)param); |
| 500 | duart68681_rx_data(m_duart, 1, val&0x7f); |
| 501 | duart68681_rx_data(m_duart, 1, 0x00); |
| 502 | } |
| 503 | #endif |
| 444 | 504 | } |
| 445 | 505 | #endif |
| 446 | 506 | |
| r19130 | r19131 | |
| 474 | 534 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 475 | 535 | MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_10MHz) |
| 476 | 536 | MCFG_SOUND_CONFIG(es5505_config) |
| 477 | | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 478 | | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 537 | MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) |
| 538 | MCFG_SOUND_ROUTE(1, "rspeaker", 2.0) |
| 479 | 539 | MACHINE_CONFIG_END |
| 480 | 540 | |
| 481 | 541 | static MACHINE_CONFIG_DERIVED(eps, vfx) |
| r19130 | r19131 | |
| 511 | 571 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 512 | 572 | MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_30_4761MHz / 2) |
| 513 | 573 | MCFG_SOUND_CONFIG(es5505_config) |
| 514 | | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 515 | | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 574 | MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) |
| 575 | MCFG_SOUND_ROUTE(1, "rspeaker", 2.0) |
| 516 | 576 | |
| 517 | 577 | MCFG_WD1772x_ADD("wd1772", 8000000) |
| 518 | 578 | MCFG_FLOPPY_DRIVE_ADD("wd1772:0", ensoniq_floppies, "35dd", 0, esq5505_state::floppy_formats) |
| r19130 | r19131 | |
| 555 | 615 | ROM_LOAD16_BYTE( "vfx210b-high.bin", 0x000001, 0x010000, CRC(59853be8) SHA1(8e07f69d53f80885d15f624e0b912aeaf3212ee4) ) |
| 556 | 616 | |
| 557 | 617 | ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00) |
| 558 | | ROM_LOAD( "u14.bin", 0x000000, 0x080000, NO_DUMP ) // type 234000 on the schematic |
| 559 | | ROM_LOAD( "u15.bin", 0x080000, 0x080000, NO_DUMP ) |
| 560 | | ROM_LOAD( "u16.bin", 0x100000, 0x080000, NO_DUMP ) |
| 618 | ROM_LOAD16_BYTE( "u14.bin", 0x000001, 0x080000, CRC(85592299) SHA1(1aa7cf612f91972baeba15991d9686ccde01599c) ) |
| 619 | ROM_LOAD16_BYTE( "u15.bin", 0x100001, 0x080000, CRC(c0055975) SHA1(5a22f1d5e437c6277eb0cfb1ff1b3f8dcdea1cc6) ) |
| 561 | 620 | |
| 562 | 621 | ROM_REGION(0x80000, "nibbles", ROMREGION_ERASE00) |
| 622 | ROM_LOAD( "u16.bin", 0x000000, 0x080000, CRC(c3ddaf95) SHA1(44a7bd89cd7e82952cc5100479e110c385246559) ) |
| 563 | 623 | ROM_END |
| 564 | 624 | |
| 565 | 625 | ROM_START( vfxsd ) |
| r19130 | r19131 | |
| 662 | 722 | DRIVER_INIT_MEMBER(esq5505_state,denib) |
| 663 | 723 | { |
| 664 | 724 | UINT8 *pNibbles = (UINT8 *)machine().root_device().memregion("nibbles")->base(); |
| 665 | | UINT8 *pBS0 = (UINT8 *)machine().root_device().memregion("waverom")->base(); |
| 725 | UINT8 *pBS0L = (UINT8 *)machine().root_device().memregion("waverom")->base(); |
| 726 | UINT8 *pBS0H = pBS0L + 0x100000; |
| 666 | 727 | |
| 667 | 728 | DRIVER_INIT_CALL(common); |
| 668 | 729 | |
| 669 | 730 | // create the 12 bit samples by patching in the nibbles from the nibble ROM |
| 670 | | for (int i = 0; i < 0x80000; i++) |
| 671 | | { |
| 672 | | *pBS0 = *pNibbles & 0xf0; |
| 673 | | pBS0 += 2; |
| 674 | | *pBS0 = (*pNibbles & 0x0f) << 4; |
| 675 | | pBS0 += 2; |
| 731 | // low nibbles go with the lower ROM, high nibbles with the upper ROM |
| 732 | for (int i = 0; i < 0x80000; i++) |
| 733 | { |
| 734 | *pBS0L = (*pNibbles & 0x0f) << 4; |
| 735 | *pBS0H = (*pNibbles & 0xf0); |
| 736 | pBS0L += 2; |
| 737 | pBS0H += 2; |
| 676 | 738 | pNibbles++; |
| 677 | | } |
| 739 | } |
| 678 | 740 | } |
| 679 | 741 | |
| 680 | 742 | CONS( 1988, eps, 0, 0, eps, vfx, esq5505_state, eps, "Ensoniq", "EPS", GAME_NOT_WORKING ) // custom VFD: one alphanumeric 22-char row, one graphics-capable row (alpha row can also do bar graphs) |
| 681 | | CONS( 1989, vfx, 0, 0, vfx, vfx, esq5505_state, common, "Ensoniq", "VFX", GAME_NOT_WORKING ) // 2x40 VFD |
| 743 | CONS( 1989, vfx, 0, 0, vfx, vfx, esq5505_state, denib, "Ensoniq", "VFX", GAME_NOT_WORKING ) // 2x40 VFD |
| 682 | 744 | CONS( 1989, vfxsd, 0, 0, vfxsd, vfx, esq5505_state, denib, "Ensoniq", "VFX-SD", GAME_NOT_WORKING ) // 2x40 VFD |
| 683 | 745 | CONS( 1990, sd1, 0, 0, vfxsd, vfx, esq5505_state, denib, "Ensoniq", "SD-1", GAME_NOT_WORKING ) // 2x40 VFD |
| 684 | 746 | CONS( 1990, sd132, sd1, 0, vfx32, vfx, esq5505_state, denib, "Ensoniq", "SD-1 32", GAME_NOT_WORKING ) // 2x40 VFD |
| 685 | 747 | CONS( 1990, sq1, 0, 0, sq1, vfx, esq5505_state, sq1, "Ensoniq", "SQ-1", GAME_NOT_WORKING ) // LCD of some sort |
| 686 | | |