Mercurial > audlegacy
diff Plugins/Input/adplug/core/rix.cpp @ 1280:6ad7eb96dd26 trunk
[svn] Sync with upstream. This adds Westwood ADL format support.
| author | chainsaw |
|---|---|
| date | Sat, 17 Jun 2006 16:17:51 -0700 |
| parents | 1cd8716972df |
| children | c71e2ef2dcf4 |
line wrap: on
line diff
--- a/Plugins/Input/adplug/core/rix.cpp Fri Jun 16 20:55:52 2006 -0700 +++ b/Plugins/Input/adplug/core/rix.cpp Sat Jun 17 16:17:51 2006 -0700 @@ -21,7 +21,7 @@ */ #include "rix.h" -#include <binfile.h> +#include "debug.h" const unsigned char CrixPlayer::adflag[] = {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1}; const unsigned char CrixPlayer::reg_data[] = {0,1,2,3,4,5,8,9,10,11,12,13,16,17,18,19,20,21}; @@ -53,12 +53,62 @@ } CrixPlayer::CrixPlayer(Copl *newopl) - : CPlayer(newopl),I(0),T(0),mus_block(0),ins_block(0),rhythm(0),mutex(0), - music_on(0),pause_flag(0),band(0),band_low(0),e0_reg_flag(0),bd_modify(0), - sustain(0),dro_end(0), mstotal(0), opl3_mode(0) + : CPlayer(newopl), buf_addr(0) +{ +} + +CrixPlayer::~CrixPlayer() +{ + if(buf_addr) + delete [] buf_addr; +} + +bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp) { - memset(dro, 0, 128000); - memset(buf_addr, 0, 327680); + binistream *f = fp.open(filename); if(!f) return false; + unsigned long i=0; + + if(f->readInt(2)!=0x55aa) { fp.close(f);return false; } + buf_addr = new unsigned char [fp.filesize(f) + 1]; + buf_addr[i++]=0xaa;buf_addr[i++]=0x55; + while(!f->eof()) + buf_addr[i++]=f->readInt(1); + length=i; + fp.close(f); + + rewind(0); + return true; +} + +bool CrixPlayer::update() +{ + if (delay>100) { + delay-=100; + return true; + } else delay=1; + + int_08h_entry(); + return !dro_end; +} + +void CrixPlayer::rewind(int subsong) +{ + I = 0; T = 0; + mus_block = 0; + ins_block = 0; + rhythm = 0; + mutex = 0; + music_on = 0; + pause_flag = 0; + band = 0; + band_low = 0; + e0_reg_flag = 0; + bd_modify = 0; + delay = 1; + sustain = 0; + dro_end = 0; + pos = index = 0; + memset(buffer, 0, sizeof(unsigned short) * 300); memset(a0b0_data2, 0, sizeof(unsigned short) * 11); memset(a0b0_data3, 0, 18); @@ -68,93 +118,17 @@ memset(insbuf, 0, 28 * sizeof(unsigned short)); memset(displace, 0, 11 * sizeof(unsigned short)); memset(reg_bufs, 0, 18 * sizeof(ADDT)); - memset(for40reg, 0, 18); - if(opl->gettype() == Copl::TYPE_OPL2) - opl3_mode = 0; - else - opl3_mode = 1; -}; - -bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp) -{ - binistream *f = fp.open(filename); if(!f) return false; - unsigned long i=0; - - if(f->readInt(2)!=0x55aa) {fp.close(f);return false; } - buf_addr[i++]=0xaa;buf_addr[i++]=0x55; - while(!f->eof()) - buf_addr[i++]=f->readInt(1); - length=i; - fp.close(f); + opl->init(); + opl->write(1,32); // go to OPL2 mode set_new_int(); data_initial(); - while(!dro_end) - int_08h_entry(); - - length=T; - mode = (OplMode)1; // Type of opl data this can contain - - // binofstream *g=new binofstream(filename+string(".dro")); - // g->writeString("DBRAWOPL",8); - // g->writeInt(mstotal,4); - // g->writeInt(length+1,4); - // g->writeInt(1,1); - // for(int t=0;t<length;t++) - // g->writeInt(dro[t],1); - // g->close(); - // delete g; - - rewind(0); - return true; -} - -bool CrixPlayer::update() -{ - if (delay>500) { - delay-=500; - return true; - } else delay=1; - while (pos < length) - { - unsigned char cmd = dro[pos++]; - switch(cmd) { - case 0: - delay = 1 + dro[pos++]; - return true; - case 1: - delay = 1 + dro[pos] + (dro[pos+1]<<8); - pos+=2; - return true; - case 2: - index = 0; - opl->setchip(0); - break; - case 3: - index = 1; - opl->setchip(1); - break; - default: - if(index == 0 || opl3_mode) - opl->write(cmd,dro[pos++]); - break; - } - } - return pos<length; -} - -void CrixPlayer::rewind(int subsong) -{ - delay=1; - pos = index = 0; - opl->init(); - opl->write(1,32); // go to OPL2 mode } float CrixPlayer::getrefresh() { - if (delay > 500) return 1000 / 500; - else return 1000 / (double)delay; + if (delay > 100) return 1000 / 100; + else return 1000.0 / (double)delay; } /*------------------Implemention----------------------------*/ @@ -239,7 +213,9 @@ /*----------------------------------------------------------*/ inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value) { - dro[T++]=reg;dro[T++]=value; + if(reg == 2 || reg == 3) + AdPlug_LogWrite("switch OPL2/3 mode!\n"); + opl->write(reg & 0xff, value & 0xff); } /*------------------------------------------------------*/ inline unsigned short CrixPlayer::ad_test() /* Test the SoundCard */ @@ -254,7 +230,7 @@ } /*--------------------------------------------------------------*/ inline void CrixPlayer::int_08h_entry() -{ + { unsigned short band_sus = 1; while(band_sus) { @@ -263,11 +239,7 @@ mutex++; band_sus = rix_proc(); if(band_sus) sustain += band_sus; - mstotal+=sustain; - dro[T++]=(sustain>=0x100?1:0); - dro[T++]=sustain&0xff; - if(sustain>=0x100) - dro[T++]=(sustain>>8)&0xff; + delay=sustain; mutex--; if(band_sus == 0) { @@ -277,11 +249,11 @@ } else { - if(band_sus) sustain -= 1; /* aging */ + if(band_sus) sustain -= 9; /* aging */ break; } } -} + } /*--------------------------------------------------------------*/ inline unsigned short CrixPlayer::rix_proc() { @@ -312,7 +284,13 @@ /*--------------------------------------------------------------*/ inline void CrixPlayer::rix_get_ins() { - memcpy(insbuf,(&buf_addr[ins_block])+(band_low<<6),56); + int i; + unsigned char *baddr = (&buf_addr[ins_block])+(band_low<<6); + + for(i = 0; i < 28; i++) + insbuf[i] = (baddr[i * 2 + 1] << 8) + baddr[i * 2]; + +// memcpy(insbuf,(&buf_addr[ins_block])+(band_low<<6),56); } /*--------------------------------------------------------------*/ inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l)
