trunk/src/mess/drivers/segapico.c
| r249155 | r249156 | |
| 119 | 119 | |
| 120 | 120 | #include "emu.h" |
| 121 | 121 | #include "includes/md_cons.h" |
| 122 | | #include "sound/upd7759.h" |
| 122 | #include "sound/315-5641.h" |
| 123 | 123 | |
| 124 | 124 | |
| 125 | 125 | #define PICO_PENX 1 |
| r249155 | r249156 | |
| 130 | 130 | public: |
| 131 | 131 | pico_base_state(const machine_config &mconfig, device_type type, const char *tag) |
| 132 | 132 | : md_cons_state(mconfig, type, tag), |
| 133 | | m_upd7759(*this, "7759"), |
| 133 | m_sega_315_5641_pcm(*this, "315_5641"), |
| 134 | 134 | m_io_page(*this, "PAGE"), |
| 135 | 135 | m_io_pad(*this, "PAD"), |
| 136 | 136 | m_io_penx(*this, "PENX"), |
| 137 | 137 | m_io_peny(*this, "PENY") |
| 138 | 138 | { } |
| 139 | 139 | |
| 140 | | optional_device<upd7759_device> m_upd7759; |
| 140 | optional_device<sega_315_5641_pcm_device> m_sega_315_5641_pcm; |
| 141 | 141 | |
| 142 | 142 | required_ioport m_io_page; |
| 143 | 143 | required_ioport m_io_pad; |
| r249155 | r249156 | |
| 251 | 251 | |
| 252 | 252 | case 8: // toy story 2 checks this for 0x3f (is that 'empty'?) |
| 253 | 253 | /* Returns free bytes left in the PCM FIFO buffer */ |
| 254 | | retdata = 0x3f; |
| 254 | retdata = m_sega_315_5641_pcm->get_fifo_space(); |
| 255 | 255 | break; |
| 256 | 256 | case 9: |
| 257 | 257 | /* |
| 258 | 258 | For reads, if bit 15 is cleared, it means PCM is 'busy' or |
| 259 | 259 | something like that, as games sometimes wait for it to become 1. |
| 260 | 260 | */ |
| 261 | | return (m_upd7759->busy_r()^1) << 15; |
| 261 | // return (m_upd7759->busy_r()^1) << 15; |
| 262 | // The BUSY bit stays 1 as long as some PCM sound is playing. |
| 263 | // SMPS drivers check 800012 [byte] and clear the "prevent music PCM" byte when the READY bit gets set. |
| 264 | // If this is done incorrectly, the voices in Sonic Gameworld (J) are muted by the music's PCM drums. |
| 265 | return m_sega_315_5641_pcm->busy_r() << 15; |
| 262 | 266 | |
| 263 | 267 | |
| 264 | 268 | case 7: |
| r249155 | r249156 | |
| 279 | 283 | WRITE_LINE_MEMBER(pico_base_state::sound_cause_irq) |
| 280 | 284 | { |
| 281 | 285 | // printf("sound irq\n"); |
| 282 | | /* upd7759 callback */ |
| 286 | /* sega_315_5641_pcm callback */ |
| 283 | 287 | m_maincpu->set_input_line(3, HOLD_LINE); |
| 284 | 288 | } |
| 285 | 289 | |
| r249155 | r249156 | |
| 289 | 293 | |
| 290 | 294 | switch (offset) |
| 291 | 295 | { |
| 292 | | case 0x12/2: // guess |
| 293 | | m_upd7759->reset_w(0); |
| 294 | | m_upd7759->start_w(0); |
| 295 | | m_upd7759->reset_w(1); |
| 296 | | m_upd7759->start_w(1); |
| 296 | case 0x10/2: |
| 297 | if (mem_mask & 0xFF00) |
| 298 | m_sega_315_5641_pcm->port_w(space, 0, (data >> 8) & 0xFF); |
| 299 | if (mem_mask & 0x00FF) |
| 300 | m_sega_315_5641_pcm->port_w(space, 0, (data >> 0) & 0xFF); |
| 301 | break; |
| 302 | case 0x12/2: // guess |
| 303 | // Note about uPD7759 lines: |
| 304 | // reset line: 1 - normal, 1->0 - reset chip, 0 - playback disabled |
| 305 | // start line: 0->1 - start playback |
| 306 | if (mem_mask & 0xFF00) |
| 307 | { |
| 308 | // I assume that: |
| 309 | // value 8000 resets the FIFO? (always used with low reset line) |
| 310 | // value 0800 maps to the uPD7759's reset line (0 = reset, 1 = normal) |
| 311 | // value 4000 maps to the uPD7759's start line (0->1 = start) |
| 312 | m_sega_315_5641_pcm->reset_w((data >> 8) & 0x08); |
| 313 | m_sega_315_5641_pcm->start_w((data >> 8) & 0x40); |
| 314 | if (data & 0x4000) |
| 315 | { |
| 316 | // Somewhere between "Reset Off" and the first sample data, |
| 317 | // we need to send a few commands to make the sample stream work. |
| 318 | // Doing that when rising the "start" line seems to work fine. |
| 319 | m_sega_315_5641_pcm->port_w(space, 0, 0xFF); // "Last Sample" value (must be >= 0x10) |
| 320 | m_sega_315_5641_pcm->port_w(space, 0, 0x00); // Dummy 1 |
| 321 | m_sega_315_5641_pcm->port_w(space, 0, 0x00); // Addr MSB |
| 322 | m_sega_315_5641_pcm->port_w(space, 0, 0x00); // Addr LSB |
| 323 | } |
| 324 | } |
| 325 | |
| 326 | |
| 327 | /*m_sega_315_5641_pcm->reset_w(0); |
| 328 | m_sega_315_5641_pcm->start_w(0); |
| 329 | m_sega_315_5641_pcm->reset_w(1); |
| 330 | m_sega_315_5641_pcm->start_w(1); |
| 297 | 331 | |
| 298 | | if (mem_mask&0x00ff) m_upd7759->port_w(space,0,data&0xff); |
| 299 | | if (mem_mask&0xff00) m_upd7759->port_w(space,0,(data>>8)&0xff); |
| 332 | if (mem_mask&0x00ff) m_sega_315_5641_pcm->port_w(space,0,data&0xff); |
| 333 | if (mem_mask&0xff00) m_sega_315_5641_pcm->port_w(space,0,(data>>8)&0xff);*/ |
| 300 | 334 | |
| 301 | 335 | break; |
| 302 | 336 | } |
| r249155 | r249156 | |
| 356 | 390 | MCFG_CPU_PROGRAM_MAP(pico_mem) |
| 357 | 391 | |
| 358 | 392 | MCFG_DEVICE_REMOVE("genesis_snd_z80") |
| 393 | MCFG_DEVICE_REMOVE("ymsnd") |
| 359 | 394 | |
| 360 | 395 | MCFG_MACHINE_START_OVERRIDE( pico_state, pico ) |
| 361 | 396 | MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv ) |
| r249155 | r249156 | |
| 363 | 398 | MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL) |
| 364 | 399 | MCFG_SOFTWARE_LIST_ADD("cart_list","pico") |
| 365 | 400 | |
| 366 | | MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK) |
| 401 | MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK*2) |
| 367 | 402 | MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(pico_state,sound_cause_irq)) |
| 368 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48) |
| 369 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48) |
| 403 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16) |
| 404 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16) |
| 370 | 405 | MACHINE_CONFIG_END |
| 371 | 406 | |
| 372 | 407 | static MACHINE_CONFIG_START( picopal, pico_state ) |
| r249155 | r249156 | |
| 376 | 411 | MCFG_CPU_PROGRAM_MAP(pico_mem) |
| 377 | 412 | |
| 378 | 413 | MCFG_DEVICE_REMOVE("genesis_snd_z80") |
| 414 | MCFG_DEVICE_REMOVE("ymsnd") |
| 379 | 415 | |
| 380 | 416 | MCFG_MACHINE_START_OVERRIDE( pico_state, pico ) |
| 381 | 417 | MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv ) |
| r249155 | r249156 | |
| 383 | 419 | MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL) |
| 384 | 420 | MCFG_SOFTWARE_LIST_ADD("cart_list","pico") |
| 385 | 421 | |
| 386 | | MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK) |
| 422 | MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK*2) |
| 387 | 423 | MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(pico_state,sound_cause_irq)) |
| 388 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48) |
| 389 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48) |
| 424 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16) |
| 425 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16) |
| 390 | 426 | MACHINE_CONFIG_END |
| 391 | 427 | |
| 392 | 428 | |
| r249155 | r249156 | |
| 552 | 588 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_picocart)); |
| 553 | 589 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_picocart)); |
| 554 | 590 | |
| 555 | | m_upd7759->reset_w(0); |
| 556 | | m_upd7759->start_w(0); |
| 557 | | m_upd7759->reset_w(1); |
| 558 | | m_upd7759->start_w(1); |
| 591 | m_sega_315_5641_pcm->reset_w(0); |
| 592 | m_sega_315_5641_pcm->start_w(0); |
| 593 | m_sega_315_5641_pcm->reset_w(1); |
| 594 | m_sega_315_5641_pcm->start_w(1); |
| 559 | 595 | |
| 560 | 596 | } |
| 561 | 597 | |
| r249155 | r249156 | |
| 566 | 602 | MCFG_CPU_PROGRAM_MAP(copera_mem) |
| 567 | 603 | |
| 568 | 604 | MCFG_DEVICE_REMOVE("genesis_snd_z80") |
| 605 | MCFG_DEVICE_REMOVE("ymsnd") |
| 569 | 606 | |
| 570 | 607 | MCFG_MACHINE_START_OVERRIDE( copera_state, copera ) |
| 571 | 608 | MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv ) |
| r249155 | r249156 | |
| 573 | 610 | MCFG_COPERA_CARTRIDGE_ADD("coperaslot", copera_cart, NULL) |
| 574 | 611 | MCFG_SOFTWARE_LIST_ADD("cart_list","copera") |
| 575 | 612 | |
| 576 | | MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK) |
| 613 | MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK) |
| 577 | 614 | MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(copera_state,sound_cause_irq)) |
| 578 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48) |
| 579 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48) |
| 615 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16) |
| 616 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16) |
| 580 | 617 | MACHINE_CONFIG_END |
| 581 | 618 | |
| 582 | 619 | |