trunk/src/emu/sound/ymz770.c
| r26478 | r26479 | |
| 5 | 5 | Emulation by R. Belmont |
| 6 | 6 | AMM decode by Olivier Galibert |
| 7 | 7 | |
| 8 | ----- |
| 9 | TODO: |
| 10 | - A lot of unimplemented features, even simple ones like panning, |
| 11 | these should be added once we find out any software that uses it. |
| 12 | - Sequencer is very preliminary |
| 13 | - What does channel ATBL mean? |
| 14 | - Is YMZ774(and other variants) the same family as this chip? |
| 15 | What are the differences? |
| 16 | |
| 8 | 17 | ***************************************************************************/ |
| 9 | 18 | |
| 10 | 19 | #include "emu.h" |
| r26478 | r26479 | |
| 39 | 48 | { |
| 40 | 49 | // create the stream |
| 41 | 50 | m_stream = machine().sound().stream_alloc(*this, 0, 2, 16000, this); |
| 42 | | m_rom_base = device().machine().root_device().memregion(":ymz770")->base(); |
| 43 | | m_rom_limit = device().machine().root_device().memregion(":ymz770")->bytes() * 8; |
| 51 | m_rom_base = *region(); |
| 52 | m_rom_limit = region()->bytes() * 8; |
| 44 | 53 | |
| 45 | 54 | for (int i = 0; i < 8; i++) |
| 46 | 55 | { |
| r26478 | r26479 | |
| 119 | 128 | { |
| 120 | 129 | if (m_channels[ch].is_seq_playing) |
| 121 | 130 | { |
| 122 | | if (m_channels[ch].seqdelay != 0) |
| 131 | if (m_channels[ch].seqdelay > 0) |
| 123 | 132 | { |
| 124 | 133 | m_channels[ch].seqdelay--; |
| 125 | 134 | } |
| r26478 | r26479 | |
| 155 | 164 | { |
| 156 | 165 | if (m_channels[ch].output_remaining > 0) |
| 157 | 166 | { |
| 158 | | mix += (m_channels[ch].output_data[m_channels[ch].output_ptr++]*2*m_channels[ch].volume); |
| 167 | mix += (m_channels[ch].output_data[m_channels[ch].output_ptr++]*m_channels[ch].volume); |
| 159 | 168 | m_channels[ch].output_remaining--; |
| 160 | 169 | } |
| 161 | 170 | else |
| r26478 | r26479 | |
| 179 | 188 | if (m_channels[ch].is_playing) |
| 180 | 189 | { |
| 181 | 190 | int sample_rate, channel_count; |
| 182 | | if (!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, |
| 183 | | m_rom_limit, |
| 184 | | m_channels[ch].output_data, |
| 185 | | m_channels[ch].output_remaining, |
| 186 | | sample_rate, |
| 187 | | channel_count)) |
| 191 | if (!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, m_rom_limit, m_channels[ch].output_data, m_channels[ch].output_remaining, sample_rate, channel_count) || m_channels[ch].output_remaining == 0) |
| 188 | 192 | { |
| 189 | 193 | m_channels[ch].is_playing = !m_channels[ch].last_block; // detect infinite retry loop |
| 190 | 194 | m_channels[ch].last_block = true; |
| r26478 | r26479 | |
| 195 | 199 | m_channels[ch].output_remaining--; |
| 196 | 200 | m_channels[ch].output_ptr = 1; |
| 197 | 201 | |
| 198 | | mix += (m_channels[ch].output_data[0]*2*m_channels[ch].volume); |
| 202 | mix += (m_channels[ch].output_data[0]*m_channels[ch].volume); |
| 199 | 203 | } |
| 200 | 204 | } |
| 201 | 205 | } |