trunk/src/emu/sound/ymz770.c
| r26462 | r26463 | |
| 40 | 40 | // create the stream |
| 41 | 41 | m_stream = machine().sound().stream_alloc(*this, 0, 2, 16000, this); |
| 42 | 42 | m_rom_base = device().machine().root_device().memregion(":ymz770")->base(); |
| 43 | | m_rom_size = device().machine().root_device().memregion(":ymz770")->bytes() * 8; |
| 43 | m_rom_limit = device().machine().root_device().memregion(":ymz770")->bytes() * 8; |
| 44 | 44 | |
| 45 | 45 | for (int i = 0; i < 8; i++) |
| 46 | 46 | { |
| r26462 | r26463 | |
| 67 | 67 | save_item(NAME(m_channels[i].last_block), i); |
| 68 | 68 | save_item(NAME(m_channels[i].output_remaining), i); |
| 69 | 69 | save_item(NAME(m_channels[i].output_ptr), i); |
| 70 | save_item(NAME(m_channels[i].atbl), i); |
| 70 | 71 | save_item(NAME(m_channels[i].pptr), i); |
| 71 | 72 | save_item(NAME(m_channels[i].sequence), i); |
| 72 | 73 | save_item(NAME(m_channels[i].seqcontrol), i); |
| r26462 | r26463 | |
| 131 | 132 | case 0x0f: |
| 132 | 133 | if (m_channels[ch].seqcontrol & 1) |
| 133 | 134 | { |
| 135 | // loop sequence |
| 134 | 136 | UINT8 sqn = m_channels[ch].sequence; |
| 135 | 137 | UINT32 pptr = m_rom_base[(4*sqn)+1+0x400]<<16 | m_rom_base[(4*sqn)+2+0x400]<<8 | m_rom_base[(4*sqn)+3+0x400]; |
| 136 | 138 | m_channels[ch].seqdata = &m_rom_base[pptr]; |
| r26462 | r26463 | |
| 163 | 165 | { |
| 164 | 166 | if (m_channels[ch].control & 1) |
| 165 | 167 | { |
| 168 | // loop sample |
| 166 | 169 | UINT8 phrase = m_channels[ch].phrase; |
| 170 | m_channels[ch].atbl = m_rom_base[(4*phrase)+0] >> 4 & 7; |
| 167 | 171 | m_channels[ch].pptr = 8*(m_rom_base[(4*phrase)+1]<<16 | m_rom_base[(4*phrase)+2]<<8 | m_rom_base[(4*phrase)+3]); |
| 168 | 172 | } |
| 169 | 173 | else |
| r26462 | r26463 | |
| 175 | 179 | if (m_channels[ch].is_playing) |
| 176 | 180 | { |
| 177 | 181 | int sample_rate, channel_count; |
| 178 | | if(!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, |
| 179 | | m_rom_size, |
| 182 | if (!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, |
| 183 | m_rom_limit, |
| 180 | 184 | m_channels[ch].output_data, |
| 181 | 185 | m_channels[ch].output_remaining, |
| 182 | 186 | sample_rate, |
| 183 | 187 | channel_count)) |
| 184 | 188 | { |
| 189 | m_channels[ch].is_playing = !m_channels[ch].last_block; // detect infinite retry loop |
| 185 | 190 | m_channels[ch].last_block = true; |
| 186 | 191 | goto retry; |
| 187 | 192 | } |
| r26462 | r26463 | |
| 269 | 274 | if (data & 6) |
| 270 | 275 | { |
| 271 | 276 | UINT8 phrase = m_channels[voice].phrase; |
| 277 | m_channels[voice].atbl = m_rom_base[(4*phrase)+0] >> 4 & 7; |
| 272 | 278 | m_channels[voice].pptr = 8*(m_rom_base[(4*phrase)+1]<<16 | m_rom_base[(4*phrase)+2]<<8 | m_rom_base[(4*phrase)+3]); |
| 273 | 279 | m_channels[voice].output_remaining = 0; |
| 274 | 280 | m_channels[voice].output_ptr = 0; |