trunk/src/mame/audio/seibu.c
| r31971 | r31972 | |
| 77 | 77 | seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 78 | 78 | : device_t(mconfig, SEIBU_SOUND, "Seibu Sound System", tag, owner, clock, "seibu_sound", __FILE__), |
| 79 | 79 | m_main2sub_pending(0), |
| 80 | | m_sub2main_pending(0) |
| 80 | m_sub2main_pending(0), |
| 81 | m_rst10_irq(0xff), |
| 82 | m_rst18_irq(0xff) |
| 81 | 83 | { |
| 82 | 84 | } |
| 83 | 85 | |
| r31971 | r31972 | |
| 90 | 92 | m_main2sub[0] = m_main2sub[1] = 0; |
| 91 | 93 | m_sub2main[0] = m_sub2main[1] = 0; |
| 92 | 94 | |
| 95 | save_item(NAME(m_main2sub)); |
| 96 | save_item(NAME(m_sub2main)); |
| 93 | 97 | save_item(NAME(m_main2sub_pending)); |
| 94 | 98 | save_item(NAME(m_sub2main_pending)); |
| 95 | | |
| 96 | | save_item(NAME(m_main2sub)); |
| 97 | | save_item(NAME(m_sub2main)); |
| 98 | | |
| 99 | | for (int i = 0; i < 2; i++) |
| 100 | | { |
| 101 | | save_item(NAME(m_main2sub[i]), i); |
| 102 | | save_item(NAME(m_sub2main[i]), i); |
| 103 | | } |
| 99 | save_item(NAME(m_rst10_irq)); |
| 100 | save_item(NAME(m_rst18_irq)); |
| 104 | 101 | } |
| 105 | 102 | |
| 106 | 103 | //------------------------------------------------- |
| r31971 | r31972 | |
| 179 | 176 | |
| 180 | 177 | void seibu_sound_device::update_irq_lines(int param) |
| 181 | 178 | { |
| 182 | | static int irq1,irq2; |
| 179 | // note: we use 0xff here for inactive irq |
| 183 | 180 | |
| 184 | | switch(param) |
| 181 | switch (param) |
| 185 | 182 | { |
| 186 | 183 | case VECTOR_INIT: |
| 187 | | irq1 = irq2 = 0xff; |
| 184 | m_rst10_irq = m_rst18_irq = 0xff; |
| 188 | 185 | break; |
| 189 | 186 | |
| 190 | 187 | case RST10_ASSERT: |
| 191 | | irq1 = 0xd7; |
| 188 | m_rst10_irq = 0xd7; |
| 192 | 189 | break; |
| 193 | 190 | |
| 194 | 191 | case RST10_CLEAR: |
| 195 | | irq1 = 0xff; |
| 192 | m_rst10_irq = 0xff; |
| 196 | 193 | break; |
| 197 | 194 | |
| 198 | 195 | case RST18_ASSERT: |
| 199 | | irq2 = 0xdf; |
| 196 | m_rst18_irq = 0xdf; |
| 200 | 197 | break; |
| 201 | 198 | |
| 202 | 199 | case RST18_CLEAR: |
| 203 | | irq2 = 0xff; |
| 200 | m_rst18_irq = 0xff; |
| 204 | 201 | break; |
| 205 | 202 | } |
| 206 | 203 | |
| 207 | 204 | if (m_sound_cpu != NULL) |
| 208 | | if ((irq1 & irq2) == 0xff) /* no IRQs pending */ |
| 209 | | m_sound_cpu->execute().set_input_line(0,CLEAR_LINE); |
| 210 | | else /* IRQ pending */ |
| 211 | | m_sound_cpu->execute().set_input_line_and_vector(0,ASSERT_LINE,irq1 & irq2); |
| 205 | { |
| 206 | if ((m_rst10_irq & m_rst18_irq) == 0xff) /* no IRQs pending */ |
| 207 | m_sound_cpu->execute().set_input_line(0, CLEAR_LINE); |
| 208 | else /* IRQ pending */ |
| 209 | m_sound_cpu->execute().set_input_line_and_vector(0, ASSERT_LINE, m_rst10_irq & m_rst18_irq); |
| 210 | } |
| 212 | 211 | else |
| 213 | | return; |
| 214 | | } |
| 212 | return; |
| 213 | } |
| 215 | 214 | |
| 216 | 215 | |
| 217 | 216 | WRITE8_MEMBER( seibu_sound_device::irq_clear_w ) |
| r31971 | r31972 | |
| 252 | 251 | |
| 253 | 252 | WRITE8_MEMBER( seibu_sound_device::coin_w ) |
| 254 | 253 | { |
| 255 | | coin_counter_w(space.machine(), 0,data & 1); |
| 256 | | coin_counter_w(space.machine(), 1,data & 2); |
| 254 | coin_counter_w(space.machine(), 0, data & 1); |
| 255 | coin_counter_w(space.machine(), 1, data & 2); |
| 257 | 256 | } |
| 258 | 257 | |
| 259 | 258 | READ8_MEMBER( seibu_sound_device::soundlatch_r ) |
| r31971 | r31972 | |
| 333 | 332 | |
| 334 | 333 | WRITE16_MEMBER( seibu_sound_device::main_mustb_w ) |
| 335 | 334 | { |
| 336 | | m_main2sub[0] = data&0xff; |
| 337 | | m_main2sub[1] = data>>8; |
| 335 | if (ACCESSING_BITS_0_7) |
| 336 | m_main2sub[0] = data & 0xff; |
| 337 | if (ACCESSING_BITS_8_15) |
| 338 | m_main2sub[1] = data >> 8; |
| 338 | 339 | |
| 339 | 340 | // logerror("seibu_main_mustb_w: %x -> %x %x\n", data, main2sub[0], main2sub[1]); |
| 340 | 341 | |
| r31971 | r31972 | |
| 490 | 491 | m_end(0), |
| 491 | 492 | m_nibble(0), |
| 492 | 493 | m_playing(0), |
| 493 | | //m_allocated(0), |
| 494 | 494 | m_rom_tag(NULL), |
| 495 | 495 | m_base(NULL) |
| 496 | 496 | { |
| r31971 | r31972 | |
| 527 | 527 | { |
| 528 | 528 | if (m_stream) |
| 529 | 529 | m_stream->update(); |
| 530 | |
| 530 | 531 | if (offset) |
| 531 | 532 | { |
| 532 | 533 | m_end = data<<8; |
| r31971 | r31972 | |
| 543 | 544 | // sequence is 00 02 01 each time. |
| 544 | 545 | if (m_stream) |
| 545 | 546 | m_stream->update(); |
| 547 | |
| 546 | 548 | switch (data) |
| 547 | 549 | { |
| 548 | 550 | case 0: |
| r31971 | r31972 | |
| 553 | 555 | case 1: |
| 554 | 556 | m_playing = 1; |
| 555 | 557 | break; |
| 556 | | |
| 557 | 558 | } |
| 558 | 559 | } |
| 559 | 560 | |