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)