trunk/src/emu/sound/ymz770.c
| r26453 | r26454 | |
| 41 | 41 | channels[i].decoder = new mpeg_audio(rom_base, mpeg_audio::AMM, false, 0); |
| 42 | 42 | } |
| 43 | 43 | |
| 44 | | |
| 45 | | save_item(NAME(cur_reg)); |
| 44 | // register for save states |
| 45 | save_item(NAME(m_cur_reg)); |
| 46 | 46 | for (int i = 0; i < 8; i++) |
| 47 | 47 | { |
| 48 | 48 | save_item(NAME(channels[i].phrase), i); |
| r26453 | r26454 | |
| 132 | 132 | channels[ch].seqdelay = 32 - 1; |
| 133 | 133 | break; |
| 134 | 134 | default: |
| 135 | | cur_reg = reg; |
| 136 | | internal_reg_write(1, data); |
| 135 | internal_reg_write(reg, data); |
| 137 | 136 | break; |
| 138 | 137 | } |
| 139 | 138 | } |
| r26453 | r26454 | |
| 147 | 146 | } |
| 148 | 147 | else |
| 149 | 148 | { |
| 150 | | retry: |
| 149 | retry: |
| 151 | 150 | if (channels[ch].last_block) |
| 152 | 151 | { |
| 153 | 152 | if (channels[ch].control & 1) |
| 154 | 153 | { |
| 155 | | UINT8 phrase = channels[ch].phrase; |
| 156 | | channels[ch].pptr = 8*(rom_base[(4*phrase)+1]<<16 | rom_base[(4*phrase)+2]<<8 | rom_base[(4*phrase)+3]); |
| 154 | UINT8 phrase = channels[ch].phrase; |
| 155 | channels[ch].pptr = 8*(rom_base[(4*phrase)+1]<<16 | rom_base[(4*phrase)+2]<<8 | rom_base[(4*phrase)+3]); |
| 157 | 156 | } |
| 158 | 157 | else |
| 159 | 158 | { |
| 160 | | channels[ch].is_playing = false; |
| 159 | channels[ch].is_playing = false; |
| 161 | 160 | } |
| 162 | 161 | } |
| 163 | 162 | |
| r26453 | r26454 | |
| 190 | 189 | } |
| 191 | 190 | |
| 192 | 191 | //------------------------------------------------- |
| 193 | | // read - read from the chip's registers and internal RAM |
| 192 | // read - read from the chip's registers |
| 194 | 193 | //------------------------------------------------- |
| 195 | 194 | |
| 196 | 195 | READ8_MEMBER( ymz770_device::read ) |
| r26453 | r26454 | |
| 198 | 197 | return 0; |
| 199 | 198 | } |
| 200 | 199 | |
| 201 | | void ymz770_device::internal_reg_write(int offset, UINT8 data) |
| 200 | void ymz770_device::internal_reg_write(UINT8 reg, UINT8 data) |
| 202 | 201 | { |
| 203 | | if (!offset) |
| 202 | if (reg >= 0x40 && reg <= 0x5f) |
| 204 | 203 | { |
| 205 | | cur_reg = data; |
| 206 | | return; |
| 207 | | } |
| 204 | int voice = reg >> 2 & 0x07; |
| 208 | 205 | |
| 209 | | if (cur_reg >= 0x40 && cur_reg <= 0x5f) |
| 210 | | { |
| 211 | | cur_reg -= 0x40; |
| 212 | | |
| 213 | | int voice = cur_reg / 4; |
| 214 | | int reg = cur_reg % 4; |
| 215 | | |
| 216 | | switch (reg) |
| 206 | switch (reg & 0x03) |
| 217 | 207 | { |
| 218 | 208 | case 0: |
| 219 | 209 | channels[voice].phrase = data; |
| r26453 | r26454 | |
| 247 | 237 | break; |
| 248 | 238 | } |
| 249 | 239 | } |
| 250 | | else if (cur_reg >= 0x80) |
| 240 | else if (reg >= 0x80) |
| 251 | 241 | { |
| 252 | | int voice = (cur_reg & 0x70)>>4; |
| 253 | | int reg = cur_reg & 0x0f; |
| 254 | | switch (reg) |
| 242 | int voice = reg >> 4 & 0x07; |
| 243 | |
| 244 | switch (reg & 0x0f) |
| 255 | 245 | { |
| 256 | 246 | case 0: |
| 257 | 247 | channels[voice].sequence = data; |
| r26453 | r26454 | |
| 267 | 257 | } |
| 268 | 258 | else |
| 269 | 259 | { |
| 270 | | channels[voice].is_seq_playing = false; |
| 260 | channels[voice].is_seq_playing = false; |
| 271 | 261 | } |
| 262 | |
| 272 | 263 | channels[voice].seqcontrol = data; |
| 273 | 264 | break; |
| 265 | |
| 266 | default: |
| 267 | break; |
| 274 | 268 | } |
| 275 | 269 | } |
| 276 | 270 | } |
| 277 | 271 | |
| 278 | 272 | //------------------------------------------------- |
| 279 | | // write - write to the chip's registers and internal RAM |
| 273 | // write - write to the chip's registers |
| 280 | 274 | //------------------------------------------------- |
| 281 | 275 | |
| 282 | 276 | WRITE8_MEMBER( ymz770_device::write ) |
| 283 | 277 | { |
| 284 | | m_stream->update(); |
| 285 | | internal_reg_write(offset, data); |
| 278 | if (offset & 1) |
| 279 | { |
| 280 | m_stream->update(); |
| 281 | internal_reg_write(m_cur_reg, data); |
| 282 | } |
| 283 | else |
| 284 | { |
| 285 | m_cur_reg = data; |
| 286 | } |
| 286 | 287 | } |