home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / goattracker_2.65.zip / src / gsid.cpp < prev    next >
C/C++ Source or Header  |  2007-04-14  |  3KB  |  137 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 sidorder[] =
  19.   {0x15,0x16,0x18,0x17,
  20.    0x05,0x06,0x02,0x03,0x00,0x01,0x04,
  21.    0x0c,0x0d,0x09,0x0a,0x07,0x08,0x0b,
  22.    0x13,0x14,0x10,0x11,0x0e,0x0f,0x12};
  23.  
  24. unsigned char altsidorder[] =
  25.   {0x15,0x16,0x18,0x17,
  26.    0x04,0x00,0x01,0x02,0x03,0x05,0x06,
  27.    0x0b,0x07,0x08,0x09,0x0a,0x0c,0x0d,
  28.    0x12,0x0e,0x0f,0x10,0x11,0x13,0x14};
  29.  
  30. SID *sid = 0;
  31.  
  32. extern unsigned residdelay;
  33. extern unsigned adparam;
  34.  
  35. void sid_init(int speed, unsigned m, unsigned ntsc, unsigned interpolate, unsigned customclockrate)
  36. {
  37.   int c;
  38.  
  39.   if (ntsc) clockrate = NTSCCLOCKRATE;
  40.     else clockrate = PALCLOCKRATE;
  41.  
  42.   if (customclockrate)
  43.     clockrate = customclockrate;
  44.  
  45.   samplerate = speed;
  46.  
  47.   if (!sid) sid = new SID;
  48.  
  49.   switch(interpolate)
  50.   {
  51.     case 0:
  52.     sid->set_sampling_parameters(clockrate, SAMPLE_FAST, speed, 20000);
  53.     break;
  54.  
  55.     default:
  56.     sid->set_sampling_parameters(clockrate, SAMPLE_INTERPOLATE, speed, 20000);
  57.     break;
  58.   }
  59.  
  60.   sid->reset();
  61.   for (c = 0; c < NUMSIDREGS; c++)
  62.   {
  63.     sidreg[c] = 0x00;
  64.   }
  65.   if (m == 1)
  66.   {
  67.     sid->set_chip_model(MOS8580);
  68.   }
  69.   else
  70.   {
  71.     sid->set_chip_model(MOS6581);
  72.   }
  73. }
  74.  
  75. unsigned char sid_getorder(unsigned char index)
  76. {
  77.   if (adparam >= 0xf000)
  78.     return altsidorder[index];
  79.   else
  80.     return sidorder[index];
  81. }
  82.  
  83. int sid_fillbuffer(short *ptr, int samples)
  84. {
  85.   int tdelta;
  86.   int tdelta2;
  87.   int result;
  88.   int total = 0;
  89.   int c;
  90.  
  91.   int badline = rand() % NUMSIDREGS;
  92.  
  93.   tdelta = clockrate * samples / samplerate + 4;
  94.  
  95.   for (c = 0; c < NUMSIDREGS; c++)
  96.   {
  97.     unsigned char o = sid_getorder(c);
  98.  
  99.       // Extra delay for loading the waveform (and mt_chngate,x)
  100.       if ((o == 4) || (o == 11) || (o == 18))
  101.       {
  102.         tdelta2 = SIDWAVEDELAY;
  103.       result = sid->clock(tdelta2, ptr, samples);
  104.       total += result;
  105.       ptr += result;
  106.       samples -= result;
  107.       tdelta -= SIDWAVEDELAY;
  108.     }
  109.  
  110.     // Possible random badline delay once per writing
  111.     if ((badline == c) && (residdelay))
  112.       {
  113.       tdelta2 = residdelay;
  114.       result = sid->clock(tdelta2, ptr, samples);
  115.       total += result;
  116.       ptr += result;
  117.       samples -= result;
  118.       tdelta -= residdelay;
  119.     }
  120.  
  121.     sid->write(o, sidreg[o]);
  122.  
  123.     tdelta2 = SIDWRITEDELAY;
  124.     result = sid->clock(tdelta2, ptr, samples);
  125.     total += result;
  126.     ptr += result;
  127.     samples -= result;
  128.     tdelta -= SIDWRITEDELAY;
  129.   }
  130.   result = sid->clock(tdelta, ptr, samples);
  131.   total += result;
  132.  
  133.   return total;
  134. }
  135.  
  136. }
  137.