Mercurial > audlegacy
diff Plugins/Input/adplug/core/psi.cpp @ 428:15ca2ea93a30 trunk
[svn] Sync with upstream CVS. This implements RIX playback.
| author | chainsaw |
|---|---|
| date | Sat, 14 Jan 2006 07:27:13 -0800 |
| parents | 8df427a314a8 |
| children | f12d7e208b43 |
line wrap: on
line diff
--- a/Plugins/Input/adplug/core/psi.cpp Sat Jan 14 05:40:19 2006 -0800 +++ b/Plugins/Input/adplug/core/psi.cpp Sat Jan 14 07:27:13 2006 -0800 @@ -69,13 +69,20 @@ opl_write(0x08, 0x00); opl_write(0xBD, 0x00); + // get header + header.instr_ptr = (tune[1] << 8) + tune[0]; + header.seq_ptr = (tune[3] << 8) + tune[2]; + // define instruments - psi.instr_table = (unsigned short *)&tune[((psi_header *)&tune[0])->instr_ptr]; + psi.instr_table = &tune[header.instr_ptr]; for(int i=0; i<8; i++) { - for(int j=0; j<11; j++) - opl_write(psi_adlib_registers[i*11 + j],tune[psi.instr_table[i] + j]); + for(int j=0; j<11; j++) { + unsigned short inspos = (psi.instr_table[i * 2 + 1] << 8) + psi.instr_table[i * 2]; + + opl_write(psi_adlib_registers[i*11 + j],tune[inspos + j]); + } opl_write(0xA0+i, 0x00); opl_write(0xB0+i, 0x00); @@ -86,7 +93,7 @@ } // calculate sequence pointer - psi.seq_table = (unsigned short *)&tune[((psi_header *)&tune[0])->seq_ptr]; + psi.seq_table = &tune[header.seq_ptr]; } void CxadpsiPlayer::xadplayer_update() @@ -95,7 +102,7 @@ for(int i=0; i<8; i++) { - ptr = psi.seq_table[i<<1]; + ptr = (psi.seq_table[(i<<1) * 2 + 1] << 8) + psi.seq_table[(i<<1) * 2]; psi.note_curdelay[i]--; @@ -112,7 +119,7 @@ // end of sequence ? if (!event) { - ptr = psi.seq_table[(i<<1) + 1]; + ptr = (psi.seq_table[(i<<1) * 2 + 3] << 8) + psi.seq_table[(i<<1) * 2 + 2]; event = tune[ptr++]; #ifdef DEBUG @@ -148,7 +155,8 @@ opl_write(0xB0+i, (note >> 8) + ((event >> 2) & 0xFC)); // save position - psi.seq_table[i<<1] = ptr; + psi.seq_table[(i<<1) * 2] = ptr & 0xff; + psi.seq_table[(i<<1) * 2 + 1] = ptr >> 8; } } }
