trunk/src/mess/drivers/esq5505.c
| r19628 | r19629 | |
| 11 | 11 | |
| 12 | 12 | Memory map: |
| 13 | 13 | |
| 14 | | 0x000000-0x00ffff work RAM low |
| 15 | | 0x200000-0x20001f OTTO(5505) regs |
| 14 | 0x000000-0x007fff work RAM low (64k for SQ-1 and later) |
| 15 | 0x200000-0x20001f OTIS (5505) regs |
| 16 | 16 | 0x240000-0x2400ff DMAC (68450) regs (EPS/EPS-16) |
| 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 | 0x2e0000-0x2fffff Expansion cartridge (VFX, VFX-SD, SD-1, SD-1 32 voice) |
| 21 | 21 | 0x300000-0x300003 EPS/EPS-16 SCSI (WD33C93, register at 300001, data at 300003) |
| 22 | 0x330000-0x37ffff VFX-SD / SD-1 sequencer RAM |
| 22 | 23 | 0x340000-0x3bffff EPS/EPS-16 sample RAM |
| 23 | 24 | 0xc00000-0xc3ffff OS ROM |
| 24 | | 0xff0000-0xffffff work RAM hi (may or may not be mirrored with work RAM low) |
| 25 | | |
| 25 | 0xff8000-0xffffff work RAM hi (64k for SQ-1 and later) |
| 26 | |
| 27 | Note from es5700.pdf PLA equations: |
| 28 | RAM if (A23/22/21 = 000 and FC is not 6) or (A23/22/21 = 111 and FC is not 7) |
| 29 | ROM if (A23/22/21 = 110) or (A23/22/21 = 000 & FC is 6) |
| 30 | |
| 26 | 31 | Interrupts: |
| 27 | | 68681 uses custom vector 0x40 (address 0x100) |
| 28 | 32 | 5505 interrupts are on normal autovector IRQ 1 |
| 33 | DMAC interrupts (EPS only) are on autovector IRQ 2 |
| 34 | 68681 uses custom vector 0x40 (address 0x100) level 3 |
| 29 | 35 | |
| 30 | 36 | VFX / VFX-SD / SD-1 / SD-1 32 panel button codes: |
| 31 | 37 | 2 = PROGRAM CONTROL |
| r19628 | r19629 | |
| 45 | 51 | 16 = ENV3 |
| 46 | 52 | 17 = OUTPUT |
| 47 | 53 | 18 = ERROR 20 (VFX) / SEQ. CONTROL |
| 48 | | 19 = ? |
| 54 | 19 = RECORD |
| 49 | 55 | 20 = MASTER |
| 50 | 56 | 21 = STORAGE |
| 51 | | 22 = ERROR 129 (VFX-SD w/Seq. loaded) |
| 52 | | 23 = ERROR 129 (VFX-SD w/Seq. loaded) |
| 57 | 22 = STOP/CONT |
| 58 | 23 = PLAY |
| 53 | 59 | 24 = MIDI |
| 54 | 60 | 25 = BUTTON 9 |
| 55 | 61 | 26 = PSEL |
| r19628 | r19629 | |
| 295 | 301 | |
| 296 | 302 | if (offset < 0x4000) |
| 297 | 303 | { |
| 298 | | if (m68k_get_fc(m_maincpu) == 0x6) // supervisor mode, ROM |
| 304 | if (m68k_get_fc(m_maincpu) == 0x6) // supervisor mode = ROM |
| 299 | 305 | { |
| 300 | 306 | return m_rom[offset]; |
| 301 | 307 | } |
| r19628 | r19629 | |
| 320 | 326 | { |
| 321 | 327 | COMBINE_DATA(&m_ram[offset]); |
| 322 | 328 | } |
| 329 | else |
| 330 | { |
| 331 | logerror("Write to ROM: %x @ %x (fc=%x)\n", data, offset, m68k_get_fc(m_maincpu)); |
| 332 | } |
| 323 | 333 | } |
| 324 | 334 | else |
| 325 | 335 | { |
| r19628 | r19629 | |
| 328 | 338 | } |
| 329 | 339 | |
| 330 | 340 | static ADDRESS_MAP_START( vfx_map, AS_PROGRAM, 16, esq5505_state ) |
| 331 | | AM_RANGE(0x000000, 0x03ffff) AM_READWRITE(lower_r, lower_w) |
| 341 | AM_RANGE(0x000000, 0x007fff) AM_READWRITE(lower_r, lower_w) |
| 332 | 342 | AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE_LEGACY("ensoniq", es5505_r, es5505_w) |
| 333 | 343 | AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w) |
| 334 | 344 | AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff) |
| r19628 | r19629 | |
| 337 | 347 | ADDRESS_MAP_END |
| 338 | 348 | |
| 339 | 349 | static ADDRESS_MAP_START( vfxsd_map, AS_PROGRAM, 16, esq5505_state ) |
| 340 | | AM_RANGE(0x000000, 0x03ffff) AM_READWRITE(lower_r, lower_w) |
| 350 | AM_RANGE(0x000000, 0x007fff) AM_READWRITE(lower_r, lower_w) |
| 341 | 351 | AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE_LEGACY("ensoniq", es5505_r, es5505_w) |
| 342 | 352 | AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w) |
| 343 | 353 | AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff) |
| r19628 | r19629 | |
| 348 | 358 | ADDRESS_MAP_END |
| 349 | 359 | |
| 350 | 360 | static ADDRESS_MAP_START( eps_map, AS_PROGRAM, 16, esq5505_state ) |
| 351 | | AM_RANGE(0x000000, 0x03ffff) AM_READWRITE(lower_r, lower_w) |
| 361 | AM_RANGE(0x000000, 0x007fff) AM_READWRITE(lower_r, lower_w) |
| 352 | 362 | AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE_LEGACY("ensoniq", es5505_r, es5505_w) |
| 353 | 363 | AM_RANGE(0x240000, 0x2400ff) AM_DEVREADWRITE_LEGACY("mc68450", hd63450_r, hd63450_w) |
| 354 | 364 | AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff) |
| r19628 | r19629 | |
| 358 | 368 | AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram") |
| 359 | 369 | ADDRESS_MAP_END |
| 360 | 370 | |
| 371 | static ADDRESS_MAP_START( sq1_map, AS_PROGRAM, 16, esq5505_state ) |
| 372 | AM_RANGE(0x000000, 0x03ffff) AM_READWRITE(lower_r, lower_w) |
| 373 | AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE_LEGACY("ensoniq", es5505_r, es5505_w) |
| 374 | AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w) |
| 375 | AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff) |
| 376 | AM_RANGE(0x2c0000, 0x2c0007) AM_DEVREADWRITE8("wd1772", wd1772_t, read, write, 0x00ff) |
| 377 | AM_RANGE(0x330000, 0x3bffff) AM_RAM // sequencer memory? |
| 378 | AM_RANGE(0xc00000, 0xc3ffff) AM_ROM AM_REGION("osrom", 0) |
| 379 | AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram") |
| 380 | ADDRESS_MAP_END |
| 381 | |
| 361 | 382 | static void esq5505_otis_irq(device_t *device, int state) |
| 362 | 383 | { |
| 363 | 384 | #if 0 // 5505/06 IRQ generation needs (more) work |
| r19628 | r19629 | |
| 421 | 442 | // printf("\nDUART IRQ: state %d vector %d\n", state, vector); |
| 422 | 443 | if (state == ASSERT_LINE) |
| 423 | 444 | { |
| 424 | | esq5505->m_maincpu->set_input_line_vector(2, vector); |
| 425 | | esq5505->m_maincpu->set_input_line(2, ASSERT_LINE); |
| 445 | esq5505->m_maincpu->set_input_line_vector(M68K_IRQ_3, vector); |
| 446 | esq5505->m_maincpu->set_input_line(M68K_IRQ_3, ASSERT_LINE); |
| 426 | 447 | } |
| 427 | 448 | else |
| 428 | 449 | { |
| 429 | | esq5505->m_maincpu->set_input_line(2, CLEAR_LINE); |
| 450 | esq5505->m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); |
| 430 | 451 | } |
| 431 | 452 | }; |
| 432 | 453 | |
| r19628 | r19629 | |
| 503 | 524 | |
| 504 | 525 | if (channel == 1) |
| 505 | 526 | { |
| 506 | | // printf("ch %d: [%02x] (PC=%x)\n", channel, data, state->m_maincpu->pc()); |
| 527 | printf("ch %d: [%02x] (PC=%x)\n", channel, data, state->m_maincpu->pc()); |
| 507 | 528 | |
| 508 | 529 | switch (state->m_system_type) |
| 509 | 530 | { |
| r19628 | r19629 | |
| 534 | 555 | } |
| 535 | 556 | else |
| 536 | 557 | { |
| 537 | | // EPS-16+ wants a throwaway reply byte for each byte sent to the KPC |
| 558 | // EPS wants a throwaway reply byte for each byte sent to the KPC |
| 538 | 559 | // VFX-SD and SD-1 definitely don't :) |
| 539 | 560 | if (state->m_system_type == EPS) |
| 540 | 561 | { |
| 541 | | // 0xe7 must respond with any byte that isn't 0xc8 or the ROM dies. |
| 542 | | // 0x71 must respond with anything (return not checked) |
| 543 | | duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0x00); // actual value of response is never checked |
| 562 | if (data == 0xe7) |
| 563 | { |
| 564 | duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0x00); // actual value of response is never checked |
| 565 | } |
| 566 | else if (data == 0x71) |
| 567 | { |
| 568 | duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0x00); // actual value of response is never checked |
| 569 | } |
| 570 | else |
| 571 | { |
| 572 | duart68681_rx_data(state->m_duart, 1, data); // actual value of response is never checked |
| 573 | } |
| 544 | 574 | } |
| 545 | 575 | } |
| 546 | 576 | } |
| r19628 | r19629 | |
| 553 | 583 | duart_input, |
| 554 | 584 | duart_output, |
| 555 | 585 | |
| 556 | | 500000, 500000, // IP3, IP4 |
| 557 | | 1000000, 1000000, // IP5, IP6 |
| 586 | 1000000, 500000, // IP3, IP4 |
| 587 | 500000, 1000000, // IP5, IP6 |
| 558 | 588 | }; |
| 559 | 589 | |
| 560 | 590 | static void esq_dma_end(running_machine &machine, int channel, int irq) |
| r19628 | r19629 | |
| 752 | 782 | MACHINE_CONFIG_END |
| 753 | 783 | |
| 754 | 784 | static MACHINE_CONFIG_DERIVED(sq1, vfx32) |
| 755 | | MCFG_ESQ2x40_REMOVE("vfd") |
| 785 | MCFG_CPU_MODIFY( "maincpu" ) |
| 786 | MCFG_CPU_PROGRAM_MAP(sq1_map) |
| 787 | |
| 788 | MCFG_ESQ2x40_REMOVE("vfd") |
| 756 | 789 | MCFG_ESQ2x40_SQ1_ADD("sq1vfd") |
| 757 | 790 | MACHINE_CONFIG_END |
| 758 | 791 | |
| r19628 | r19629 | |
| 889 | 922 | |
| 890 | 923 | ROM_START( sq1 ) |
| 891 | 924 | ROM_REGION(0x40000, "osrom", 0) |
| 892 | | ROM_LOAD16_BYTE( "esq5505lo.bin", 0x000000, 0x010000, CRC(b004cf05) SHA1(567b0dae2e35b06e39da108f9c041fd9bc38fa35) ) |
| 893 | | ROM_LOAD16_BYTE( "esq5505up.bin", 0x000001, 0x010000, CRC(2e927873) SHA1(06a948cb71fa254b23f4b9236f29035d10778da1) ) |
| 925 | ROM_LOAD16_BYTE( "sq1lo.bin", 0x000000, 0x010000, CRC(b004cf05) SHA1(567b0dae2e35b06e39da108f9c041fd9bc38fa35) ) |
| 926 | ROM_LOAD16_BYTE( "sq1up.bin", 0x000001, 0x010000, CRC(2e927873) SHA1(06a948cb71fa254b23f4b9236f29035d10778da1) ) |
| 894 | 927 | |
| 895 | 928 | ROM_REGION(0x200000, "waverom", 0) |
| 896 | 929 | ROM_LOAD16_BYTE( "sq1-u25.bin", 0x000001, 0x080000, CRC(26312451) SHA1(9f947a11592fd8420fc581914bf16e7ade75390c) ) |
| r19628 | r19629 | |
| 899 | 932 | ROM_REGION(0x80000, "nibbles", ROMREGION_ERASE00) |
| 900 | 933 | ROM_END |
| 901 | 934 | |
| 935 | ROM_START( sqrack ) |
| 936 | ROM_REGION(0x40000, "osrom", 0) |
| 937 | ROM_LOAD16_BYTE( "sqr-102-lower.bin", 0x000000, 0x010000, CRC(186c85ad) SHA1(801c5cf82823ce31a88688fbee4c11ea5ffdbc10) ) |
| 938 | ROM_LOAD16_BYTE( "sqr-102-upper.bin", 0x000001, 0x010000, CRC(088c9d31) SHA1(30627f21d893888b6159c481bea08e3eedd21902) ) |
| 939 | |
| 940 | ROM_REGION(0x200000, "waverom", 0) |
| 941 | ROM_LOAD16_BYTE( "sq1-u25.bin", 0x000001, 0x080000, CRC(26312451) SHA1(9f947a11592fd8420fc581914bf16e7ade75390c) ) |
| 942 | ROM_LOAD16_BYTE( "sq1-u26.bin", 0x100001, 0x080000, CRC(2edaa9dc) SHA1(72fead505c4f44e5736ff7d545d72dfa37d613e2) ) |
| 943 | |
| 944 | ROM_REGION(0x80000, "nibbles", ROMREGION_ERASE00) |
| 945 | ROM_END |
| 946 | |
| 902 | 947 | ROM_START( eps ) |
| 903 | 948 | ROM_REGION(0x10000, "osrom", 0) |
| 904 | 949 | ROM_LOAD16_BYTE( "eps-l.bin", 0x000000, 0x008000, CRC(382beac1) SHA1(110e31edb03fcf7bbde3e17423b21929e5b32db2) ) |
| r19628 | r19629 | |
| 963 | 1008 | CONS( 1990, sd1, 0, 0, vfxsd, vfx, esq5505_state, denib, "Ensoniq", "SD-1", GAME_NOT_WORKING ) // 2x40 VFD |
| 964 | 1009 | CONS( 1990, sd132, sd1, 0, vfx32, vfx, esq5505_state, denib, "Ensoniq", "SD-1 32", GAME_NOT_WORKING ) // 2x40 VFD |
| 965 | 1010 | CONS( 1990, sq1, 0, 0, sq1, vfx, esq5505_state, sq1, "Ensoniq", "SQ-1", GAME_NOT_WORKING ) // LCD of some sort |
| 1011 | CONS( 1990, sqrack,sq1, 0, sq1, vfx, esq5505_state, sq1, "Ensoniq", "SQ-Rack", GAME_NOT_WORKING ) // LCD of some sort |