comparison Plugins/Input/adplug/core/rix.cpp @ 1590:fd943ec96935 trunk

[svn] Sync with upstream. ADL is now dual licensed, and RIX has had a pitch fixup. Free warning fix included.
author chainsaw
date Thu, 24 Aug 2006 11:11:30 -0700
parents 705d4c089fce
children
comparison
equal deleted inserted replaced
1589:ebc170f08767 1590:fd943ec96935
73 flag_mkf=1; 73 flag_mkf=1;
74 f->seek(0); 74 f->seek(0);
75 int offset=f->readInt(4); 75 int offset=f->readInt(4);
76 f->seek(offset); 76 f->seek(offset);
77 } 77 }
78 if(f->readInt(4)!=0x55aa){ fp.close(f);return false; } 78 if(f->readInt(2)!=0x55aa){ fp.close(f);return false; }
79 file_buffer = new unsigned char [fp.filesize(f) + 1]; 79 file_buffer = new unsigned char [fp.filesize(f) + 1];
80 f->seek(0); 80 f->seek(0);
81 while(!f->eof()) 81 while(!f->eof())
82 file_buffer[i++]=f->readInt(1); 82 file_buffer[i++]=f->readInt(1);
83 length=i; 83 length=i;
89 } 89 }
90 90
91 bool CrixPlayer::update() 91 bool CrixPlayer::update()
92 { 92 {
93 int_08h_entry(); 93 int_08h_entry();
94 return !dro_end; 94 return !play_end;
95 } 95 }
96 96
97 void CrixPlayer::rewind(int subsong) 97 void CrixPlayer::rewind(int subsong)
98 { 98 {
99 I = 0; T = 0; 99 I = 0; T = 0;
100 mus_block = 0; 100 mus_block = 0;
101 ins_block = 0; 101 ins_block = 0;
102 rhythm = 0; 102 rhythm = 0;
103 mutex = 0;
104 music_on = 0; 103 music_on = 0;
105 pause_flag = 0; 104 pause_flag = 0;
106 band = 0; 105 band = 0;
107 band_low = 0; 106 band_low = 0;
108 e0_reg_flag = 0; 107 e0_reg_flag = 0;
109 bd_modify = 0; 108 bd_modify = 0;
110 sustain = 0; 109 sustain = 0;
111 dro_end = 0; 110 play_end = 0;
112 pos = index = 0; 111 pos = index = 0;
113 112
114 memset(buffer, 0, sizeof(unsigned short) * 300); 113 memset(f_buffer, 0, sizeof(unsigned short) * 300);
115 memset(a0b0_data2, 0, sizeof(unsigned short) * 11); 114 memset(a0b0_data2, 0, sizeof(unsigned short) * 11);
116 memset(a0b0_data3, 0, 18); 115 memset(a0b0_data3, 0, 18);
117 memset(a0b0_data4, 0, 18); 116 memset(a0b0_data4, 0, 18);
118 memset(a0b0_data5, 0, 96); 117 memset(a0b0_data5, 0, 96);
119 memset(addrs_head, 0, 96); 118 memset(addrs_head, 0, 96);
156 155
157 /*------------------Implemention----------------------------*/ 156 /*------------------Implemention----------------------------*/
158 inline void CrixPlayer::set_new_int() 157 inline void CrixPlayer::set_new_int()
159 { 158 {
160 if(!ad_initial()) exit(1); 159 if(!ad_initial()) exit(1);
161 prep_int();
162 } 160 }
163 /*----------------------------------------------------------*/ 161 /*----------------------------------------------------------*/
164 inline void CrixPlayer::Pause() 162 inline void CrixPlayer::Pause()
165 { 163 {
166 register unsigned short i; 164 register unsigned short i;
195 } 193 }
196 /*----------------------------------------------------------*/ 194 /*----------------------------------------------------------*/
197 inline unsigned short CrixPlayer::ad_initial() 195 inline unsigned short CrixPlayer::ad_initial()
198 { 196 {
199 register unsigned short i,j,k = 0; 197 register unsigned short i,j,k = 0;
200 for(i=0;i<25;i++) crc_trans(i,i*4); 198 for(i=0;i<25;i++)
199 {
200 f_buffer[i*12]=(unsigned int)((i*24+10000)*0.27461678223+4)>>3;
201 for(int t=1;t<12;t++)
202 f_buffer[i*12+t]=(unsigned int)((double)f_buffer[i*12+t-1]*1.06);
203 }
201 for(i=0;i<8;i++) 204 for(i=0;i<8;i++)
202 for(j=0;j<12;j++) 205 for(j=0;j<12;j++)
203 { 206 {
204 a0b0_data5[k] = i; 207 a0b0_data5[k] = i;
205 addrs_head[k] = j; 208 addrs_head[k] = j;
212 //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0); 215 //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0);
213 //ad_bop(1,e0_reg_flag); 216 //ad_bop(1,e0_reg_flag);
214 return 1;//ad_test(); 217 return 1;//ad_test();
215 } 218 }
216 /*----------------------------------------------------------*/ 219 /*----------------------------------------------------------*/
217 inline void CrixPlayer::crc_trans(unsigned short index,unsigned short v)
218 {
219 register unsigned short i;
220 unsigned int res; unsigned short low;
221 res = strm_and_fr(v);
222 low = res;
223 buffer[index*12] = (low+4)>>3;
224 for(i=1;i<=11;i++)
225 {
226 res = (unsigned int)((double)res * 1.06);
227 buffer[index*12+i] = res>>3;
228 }
229 }
230
231 /*----------------------------------------------------------*/
232 inline void CrixPlayer::prep_int()
233 {
234 mutex = 0;
235 }
236 /*----------------------------------------------------------*/
237 inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value) 220 inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value)
238 { 221 {
239 if(reg == 2 || reg == 3) 222 if(reg == 2 || reg == 3)
240 AdPlug_LogWrite("switch OPL2/3 mode!\n"); 223 AdPlug_LogWrite("switch OPL2/3 mode!\n");
241 opl->write(reg & 0xff, value & 0xff); 224 opl->write(reg & 0xff, value & 0xff);
242 }
243 /*------------------------------------------------------*/
244 inline unsigned short CrixPlayer::ad_test() /* Test the SoundCard */
245 {
246 ad_bop(0x04,0x60);
247 ad_bop(0x04,0x80);
248 ad_bop(0x02,0xFF);
249 ad_bop(0x04,0x21);
250 ad_bop(0x04,0x60);
251 ad_bop(0x04,0x80);
252 return 1;
253 } 225 }
254 /*--------------------------------------------------------------*/ 226 /*--------------------------------------------------------------*/
255 inline void CrixPlayer::int_08h_entry() 227 inline void CrixPlayer::int_08h_entry()
256 { 228 {
257 unsigned short band_sus = 1; 229 unsigned short band_sus = 1;
258 while(band_sus) 230 while(band_sus)
259 { 231 {
260 if(sustain <= 0 && mutex == 0) 232 if(sustain <= 0)
261 { 233 {
262 mutex++;
263 band_sus = rix_proc(); 234 band_sus = rix_proc();
264 if(band_sus) sustain += band_sus; 235 if(band_sus) sustain += band_sus;
265 mutex--; 236 else
266 if(band_sus == 0)
267 { 237 {
268 dro_end=1; 238 play_end=1;
269 break; 239 break;
270 } 240 }
271 } 241 }
272 else 242 else
273 { 243 {
309 int i; 279 int i;
310 unsigned char *baddr = (&buf_addr[ins_block])+(band_low<<6); 280 unsigned char *baddr = (&buf_addr[ins_block])+(band_low<<6);
311 281
312 for(i = 0; i < 28; i++) 282 for(i = 0; i < 28; i++)
313 insbuf[i] = (baddr[i * 2 + 1] << 8) + baddr[i * 2]; 283 insbuf[i] = (baddr[i * 2 + 1] << 8) + baddr[i * 2];
314
315 // memcpy(insbuf,(&buf_addr[ins_block])+(band_low<<6),56);
316 } 284 }
317 /*--------------------------------------------------------------*/ 285 /*--------------------------------------------------------------*/
318 inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l) 286 inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l)
319 { 287 {
320 if(rhythm == 0 || ctrl_l < 6) 288 if(rhythm == 0 || ctrl_l < 6)
321 { 289 {
322 ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]); 290 ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]);
323 ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]); 291 ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]);
324 return; 292 return;
325 } 293 }
326 else 294 else if(ctrl_l > 6)
327 {
328 if(ctrl_l > 6)
329 { 295 {
330 ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]); 296 ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]);
331 return; 297 return;
332 } 298 }
333 else 299 else
334 { 300 {
335 ins_to_reg(12,insbuf,insbuf[26]); 301 ins_to_reg(12,insbuf,insbuf[26]);
336 ins_to_reg(15,insbuf+13,insbuf[27]); 302 ins_to_reg(15,insbuf+13,insbuf[27]);
337 return; 303 return;
338 } 304 }
339 }
340 } 305 }
341 /*--------------------------------------------------------------*/ 306 /*--------------------------------------------------------------*/
342 inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index) 307 inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index)
343 { 308 {
344 if(rhythm == 0 || ctrl_l <= 6) 309 if(rhythm == 0 || ctrl_l <= 6)
350 } 315 }
351 /*--------------------------------------------------------------*/ 316 /*--------------------------------------------------------------*/
352 inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/ 317 inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/
353 { 318 {
354 short high = 0,low = 0; unsigned int res; 319 short high = 0,low = 0; unsigned int res;
355 low = ((unsigned short)(v-0x2000))*0x19; 320 int res1 = (v-0x2000)*0x19;
356 high = ((short)v)<0x2000?0xFFFF:0; 321 if(res1 == (int)0xff) return;
357 if(low == 0xFF && high == 0) return; 322 low = res1/0x2000;
358 res = ((((unsigned int)high)<<16)|low)/0x2000;
359 low = res&0xFFFF;
360 if(low < 0) 323 if(low < 0)
361 { 324 {
362 low = 0x18-low; high = (signed short)low<0?0xFFFF:0; 325 low = 0x18-low; high = (signed short)low<0?0xFFFF:0;
363 res = high; res<<=16; res+=low; 326 res = high; res<<=16; res+=low;
364 low = ((signed short)res)/(signed short)0xFFE7; 327 low = ((signed short)res)/(signed short)0xFFE7;
386 unsigned short data; unsigned short i = p2+a0b0_data2[index]; 349 unsigned short data; unsigned short i = p2+a0b0_data2[index];
387 a0b0_data4[index] = p3; 350 a0b0_data4[index] = p3;
388 a0b0_data3[index] = p2; 351 a0b0_data3[index] = p2;
389 i = ((signed short)i<=0x5F?i:0x5F); 352 i = ((signed short)i<=0x5F?i:0x5F);
390 i = ((signed short)i>=0?i:0); 353 i = ((signed short)i>=0?i:0);
391 data = buffer[addrs_head[i]+displace[index]/2]; 354 data = f_buffer[addrs_head[i]+displace[index]/2];
392 ad_bop(0xA0+index,data); 355 ad_bop(0xA0+index,data);
393 data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3); 356 data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3);
394 ad_bop(0xB0+index,data); 357 ad_bop(0xB0+index,data);
395 } 358 }
396 /*--------------------------------------------------------------*/ 359 /*--------------------------------------------------------------*/
522 } 485 }
523 /*--------------------------------------------------------------*/ 486 /*--------------------------------------------------------------*/
524 inline void CrixPlayer::music_ctrl() 487 inline void CrixPlayer::music_ctrl()
525 { 488 {
526 register int i; 489 register int i;
527 music_on = 0;
528 for(i=0;i<11;i++) 490 for(i=0;i<11;i++)
529 switch_ad_bd(i); 491 switch_ad_bd(i);
530 } 492 }
531 /*----------------------------------------------------------------------*/
532 inline unsigned int CrixPlayer::strm_and_fr(unsigned short parm)
533 {
534 return (int)(((unsigned int)parm*6+10000)*0.27461678223);
535 }