home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Large Pack of OldSkool DOS MOD Trackers
/
goattracker_2.65_stereo.zip
/
src
/
gsid.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2007-04-12
|
4KB
|
163 lines
/*
* GOATTRACKER reSID interface
*/
#define GSID_C
#include <stdlib.h>
#include "sid.h"
extern "C" {
#include "gsid.h"
#include "gsound.h"
int clockrate;
int samplerate;
unsigned char sidreg[NUMSIDREGS];
unsigned char sidreg2[NUMSIDREGS];
unsigned char sidorder[] =
{0x15,0x16,0x18,0x17,
0x05,0x06,0x02,0x03,0x00,0x01,0x04,
0x0c,0x0d,0x09,0x0a,0x07,0x08,0x0b,
0x13,0x14,0x10,0x11,0x0e,0x0f,0x12};
unsigned char altsidorder[] =
{0x15,0x16,0x18,0x17,
0x04,0x00,0x01,0x02,0x03,0x05,0x06,
0x0b,0x07,0x08,0x09,0x0a,0x0c,0x0d,
0x12,0x0e,0x0f,0x10,0x11,0x13,0x14};
SID *sid = 0;
SID *sid2 = 0;
extern unsigned residdelay;
extern unsigned adparam;
void sid_init(int speed, unsigned m, unsigned ntsc, unsigned interpolate, unsigned customclockrate)
{
int c;
if (ntsc) clockrate = NTSCCLOCKRATE;
else clockrate = PALCLOCKRATE;
if (customclockrate)
clockrate = customclockrate;
samplerate = speed;
if (!sid) sid = new SID;
if (!sid2) sid2 = new SID;
switch(interpolate)
{
case 0:
sid->set_sampling_parameters(clockrate, SAMPLE_FAST, speed, 20000);
sid2->set_sampling_parameters(clockrate, SAMPLE_FAST, speed, 20000);
break;
default:
sid->set_sampling_parameters(clockrate, SAMPLE_INTERPOLATE, speed, 20000);
sid2->set_sampling_parameters(clockrate, SAMPLE_INTERPOLATE, speed, 20000);
break;
}
sid->reset();
for (c = 0; c < NUMSIDREGS; c++)
{
sidreg[c] = 0x00;
sidreg2[c] = 0x00;
}
if (m == 1)
{
sid->set_chip_model(MOS8580);
sid2->set_chip_model(MOS8580);
}
else
{
sid->set_chip_model(MOS6581);
sid2->set_chip_model(MOS6581);
}
}
unsigned char sid_getorder(unsigned char index)
{
if (adparam >= 0xf000)
return altsidorder[index];
else
return sidorder[index];
}
int sid_fillbuffer(short *lptr, short *rptr, int samples)
{
int tdelta;
int tdelta2;
int result;
int total = 0;
int c;
int badline = rand() % NUMSIDREGS;
tdelta = clockrate * samples / samplerate + 4;
for (c = 0; c < NUMSIDREGS; c++)
{
unsigned char o = sid_getorder(c);
// Extra delay for loading the waveform (and mt_chngate,x)
if ((o == 4) || (o == 11) || (o == 18))
{
tdelta2 = SIDWAVEDELAY;
result = sid->clock(tdelta2, lptr, samples);
tdelta2 = SIDWAVEDELAY;
sid2->clock(tdelta2, rptr, samples);
total += result;
lptr += result;
rptr += result;
samples -= result;
tdelta -= SIDWAVEDELAY;
}
// Possible random badline delay once per writing
if ((badline == c) && (residdelay))
{
tdelta2 = residdelay;
result = sid->clock(tdelta2, lptr, samples);
tdelta2 = residdelay;
sid2->clock(tdelta2, rptr, samples);
total += result;
lptr += result;
rptr += result;
samples -= result;
tdelta -= residdelay;
}
sid->write(o, sidreg[o]);
sid2->write(o, sidreg2[o]);
tdelta2 = SIDWRITEDELAY;
result = sid->clock(tdelta2, lptr, samples);
tdelta2 = SIDWRITEDELAY;
sid2->clock(tdelta2, rptr, samples);
total += result;
lptr += result;
rptr += result;
samples -= result;
tdelta -= SIDWRITEDELAY;
}
tdelta2 = tdelta;
result = sid->clock(tdelta2, lptr, samples);
tdelta2 = tdelta;
result = sid2->clock(tdelta2, rptr, samples);
total += result;
return total;
}
}