Mercurial > audlegacy
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 } |
