home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / goattracker_2.65_stereo.zip / src / gsid.cpp < prev    next >
C/C++ Source or Header  |  2007-04-12  |  4KB  |  163 lines

  1. /*
  2.  * GOATTRACKER reSID interface
  3.  */
  4.  
  5. #define GSID_C
  6.  
  7. #include <stdlib.h>
  8. #include "sid.h"
  9.  
  10. extern "C" {
  11.  
  12. #include "gsid.h"
  13. #include "gsound.h"
  14.  
  15. int clockrate;
  16. int samplerate;
  17. unsigned char sidreg[NUMSIDREGS];
  18. unsigned char sidreg2[NUMSIDREGS];
  19.  
  20. unsigned char sidorder[] =
  21.   {0x15,0x16,0x18,0x17,
  22.    0x05,0x06,0x02,0x03,0x00,0x01,0x04,
  23.    0x0c,0x0d,0x09,0x0a,0x07,0x08,0x0b,
  24.    0x13,0x14,0x10,0x11,0x0e,0x0f,0x12};
  25.  
  26. unsigned char altsidorder[] =
  27.   {0x15,0x16,0x18,0x17,
  28.    0x04,0x00,0x01,0x02,0x03,0x05,0x06,
  29.    0x0b,0x07,0x08,0x09,0x0a,0x0c,0x0d,
  30.    0x12,0x0e,0x0f,0x10,0x11,0x13,0x14};
  31.  
  32. SID *sid = 0;
  33. SID *sid2 = 0;
  34.  
  35. extern unsigned residdelay;
  36. extern unsigned adparam;
  37.  
  38. void sid_init(int speed, unsigned m, unsigned ntsc, unsigned interpolate, unsigned customclockrate)
  39. {
  40.   int c;
  41.  
  42.   if (ntsc) clockrate = NTSCCLOCKRATE;
  43.     else clockrate = PALCLOCKRATE;
  44.  
  45.   if (customclockrate)
  46.     clockrate = customclockrate;
  47.  
  48.   samplerate = speed;
  49.  
  50.   if (!sid) sid = new SID;
  51.   if (!sid2) sid2 = new SID;
  52.  
  53.   switch(interpolate)
  54.   {
  55.     case 0:
  56.     sid->set_sampling_parameters(clockrate, SAMPLE_FAST, speed, 20000);
  57.     sid2->set_sampling_parameters(clockrate, SAMPLE_FAST, speed, 20000);
  58.     break;
  59.  
  60.     default:
  61.     sid->set_sampling_parameters(clockrate, SAMPLE_INTERPOLATE, speed, 20000);
  62.     sid2->set_sampling_parameters(clockrate, SAMPLE_INTERPOLATE, speed, 20000);
  63.     break;
  64.   }
  65.  
  66.   sid->reset();
  67.   for (c = 0; c < NUMSIDREGS; c++)
  68.   {
  69.     sidreg[c] = 0x00;
  70.     sidreg2[c] = 0x00;
  71.   }
  72.   if (m == 1)
  73.   {
  74.     sid->set_chip_model(MOS8580);
  75.     sid2->set_chip_model(MOS8580);
  76.   }
  77.   else
  78.   {
  79.     sid->set_chip_model(MOS6581);
  80.     sid2->set_chip_model(MOS6581);
  81.   }
  82. }
  83.  
  84. unsigned char sid_getorder(unsigned char index)
  85. {
  86.   if (adparam >= 0xf000)
  87.     return altsidorder[index];
  88.   else
  89.     return sidorder[index];
  90. }
  91.  
  92. int sid_fillbuffer(short *lptr, short *rptr, int samples)
  93. {
  94.   int tdelta;
  95.   int tdelta2;
  96.   int result;
  97.   int total = 0;
  98.   int c;
  99.  
  100.   int badline = rand() % NUMSIDREGS;
  101.  
  102.   tdelta = clockrate * samples / samplerate + 4;
  103.  
  104.   for (c = 0; c < NUMSIDREGS; c++)
  105.   {
  106.     unsigned char o = sid_getorder(c);
  107.  
  108.       // Extra delay for loading the waveform (and mt_chngate,x)
  109.       if ((o == 4) || (o == 11) || (o == 18))
  110.       {
  111.         tdelta2 = SIDWAVEDELAY;
  112.       result = sid->clock(tdelta2, lptr, samples);
  113.         tdelta2 = SIDWAVEDELAY;
  114.       sid2->clock(tdelta2, rptr, samples);
  115.  
  116.       total += result;
  117.       lptr += result;
  118.       rptr += result;
  119.       samples -= result;
  120.       tdelta -= SIDWAVEDELAY;
  121.     }
  122.  
  123.     // Possible random badline delay once per writing
  124.     if ((badline == c) && (residdelay))
  125.       {
  126.       tdelta2 = residdelay;
  127.       result = sid->clock(tdelta2, lptr, samples);
  128.       tdelta2 = residdelay;
  129.       sid2->clock(tdelta2, rptr, samples);
  130.  
  131.       total += result;
  132.       lptr += result;
  133.       rptr += result;
  134.       samples -= result;
  135.       tdelta -= residdelay;
  136.     }
  137.  
  138.     sid->write(o, sidreg[o]);
  139.     sid2->write(o, sidreg2[o]);
  140.  
  141.     tdelta2 = SIDWRITEDELAY;
  142.     result = sid->clock(tdelta2, lptr, samples);
  143.     tdelta2 = SIDWRITEDELAY;
  144.     sid2->clock(tdelta2, rptr, samples);
  145.  
  146.     total += result;
  147.     lptr += result;
  148.     rptr += result;
  149.     samples -= result;
  150.     tdelta -= SIDWRITEDELAY;
  151.   }
  152.  
  153.   tdelta2 = tdelta;
  154.   result = sid->clock(tdelta2, lptr, samples);
  155.   tdelta2 = tdelta;
  156.   result = sid2->clock(tdelta2, rptr, samples);
  157.  
  158.   total += result;
  159.   return total;
  160. }
  161.  
  162. }
  163.