Subversion Repositories pentevo

Rev

Rev 1147 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // This file is taken from the openMSX project.
  2. // The file has been modified to be built in the blueMSX environment.
  3.  
  4. #ifndef __YMF278_HH__
  5. #define __YMF278_HH__
  6.  
  7. #include "../sysdefs.h"
  8.  
  9. using namespace std;
  10.  
  11.  
  12. typedef unsigned long  EmuTime;
  13. typedef unsigned short word;
  14.  
  15.  
  16. #ifndef OPENMSX_SOUNDDEVICE
  17. #define OPENMSX_SOUNDDEVICE
  18.  
  19. #define MAX_BUFFER_SIZE 10000
  20.  
  21. class SoundDevice
  22. {
  23.         public:
  24.         SoundDevice() : internalMuted(true) {}
  25.                 void setVolume(short newVolume) {
  26.                 setInternalVolume(newVolume);
  27.         }
  28.  
  29.         protected:
  30.                 virtual void setInternalVolume(short newVolume) = 0;
  31.         void setInternalMute(bool muted) { internalMuted = muted; }
  32.         bool isInternalMuted() const { return internalMuted; }
  33.         public:
  34.                 virtual void setSampleRate(int newSampleRate, int Oversampling) = 0;
  35.                 virtual int* updateBuffer(int length) = 0;
  36.  
  37.         private:
  38.                 bool internalMuted;
  39. };
  40.  
  41. #endif
  42.  
  43.  
  44. class YMF278Slot
  45. {
  46.         public:
  47.                 YMF278Slot();
  48.                 void reset();
  49.                 int compute_rate(int val);
  50.                 unsigned int decay_rate(int num, int sample_rate);
  51.                 void envelope_next(int sample_rate);
  52.                 inline int compute_vib();
  53.                 inline int compute_am();
  54.                 void set_lfo(int newlfo);
  55.  
  56.                 short wave;             // wavetable number
  57.                 short FN;               // f-number
  58.                 char OCT;               // octave
  59.                 char PRVB;              // pseudo-reverb
  60.                 char LD;                // level direct
  61.                 char TL;                // total level
  62.                 char pan;               // panpot
  63.                 char lfo;               // LFO
  64.                 char vib;               // vibrato
  65.                 char AM;                // AM level
  66.  
  67.                 char AR;
  68.                 char D1R;
  69.                 int  DL;
  70.                 char D2R;
  71.                 char RC;                // rate correction
  72.                 char RR;
  73.  
  74.                 int step;               // fixed-point frequency step
  75.                 int stepptr;            // fixed-point pointer into the sample
  76.                 int pos;
  77.                 short sample1, sample2;
  78.  
  79.                 bool active;            // slot keyed on
  80.                 u8 bits;                // width of the samples
  81.                 int startaddr;
  82.                 int loopaddr;
  83.                 int endaddr;
  84.  
  85.                 u8 state;
  86.                 int env_vol;
  87.                 unsigned int env_vol_step;
  88.                 unsigned int env_vol_lim;
  89.  
  90.                 bool lfo_active;
  91.                 int lfo_cnt;
  92.                 int lfo_step;
  93.                 int lfo_max;
  94. };
  95.  
  96. static const int MASTER_CLK = 33868800;
  97.  
  98. class YMF278 : public SoundDevice
  99. {
  100.         public:
  101.                 YMF278(short volume, size_t ramSizeKb, size_t romSizeKb,
  102.                        const EmuTime &time);
  103.                 virtual ~YMF278();
  104.                 void reset(const EmuTime &time);
  105.                 void writeRegOPL4(u8 reg, u8 data, const EmuTime &time);
  106.                 u8 peekRegOPL4(u8 reg, const EmuTime &time);
  107.                 u8 readRegOPL4(u8 reg, const EmuTime &time);
  108.                 u8 peekStatus(const EmuTime &time);
  109.                 u8 readStatus(const EmuTime &time);
  110.                 u8 * getRom();
  111.                 size_t getRomSize();
  112.                 virtual void setSampleRate(int sampleRate, int Oversampling);
  113.                 virtual void setInternalVolume(short newVolume);
  114.                 virtual int* updateBuffer(int length);
  115.        
  116.         private:
  117.                 void attempt_alloc_rom();
  118.                 void attempt_alloc_ram();
  119.                 u8 readMem(unsigned int address);
  120.                 void writeMem(unsigned int address, u8 value);
  121.                 short getSample(YMF278Slot &op);
  122.                 void advance();
  123.                 void checkMute();
  124.                 bool anyActive();
  125.                 void keyOnHelper(YMF278Slot& slot);
  126.  
  127.                 int buffer[2 * MAX_BUFFER_SIZE];
  128.  
  129.  
  130.                 size_t ramSize;
  131.                 size_t romSize;
  132.                 size_t endRom;
  133.                 size_t endRam;
  134.  
  135.                 u8* rom;
  136.                 bool rom_alloc_attempted;
  137.  
  138.                 u8* ram;
  139.                 bool ram_alloc_attempted;
  140.  
  141.  
  142.                 int oplOversampling;
  143.                 double freqbase;
  144.  
  145.                 YMF278Slot slots[24];
  146.                
  147.                 unsigned int eg_cnt;    // global envelope generator counter
  148.                 unsigned int eg_timer;  // global envelope generator counter
  149.                 unsigned int eg_timer_add;              // step of eg_timer
  150.                 unsigned int eg_timer_overflow; // envelope generator timer overlfows every 1 sample (on real chip)
  151.                
  152.                 char wavetblhdr;
  153.                 char memmode;
  154.                 int memadr;
  155.  
  156.                 int fm_l, fm_r;
  157.                 int pcm_l, pcm_r;
  158.  
  159.                 // precalculated attenuation values with some marging for
  160.                 // enveloppe and pan levels
  161.                 int volume[256 * 4];
  162.  
  163.                 u8 regs[256];
  164.  
  165.                 unsigned long LD_Time;
  166.                 unsigned long BUSY_Time;
  167. };
  168.  
  169. #endif
  170.  
  171.