#include #include #include #include #include "resid-fp/sid.h" #include <86box/plat.h> #include <86box/snd_resid.h> #define RESID_FREQ 48000 typedef struct psid_t { /* resid sid implementation */ SIDFP *sid; int16_t last_sample; } psid_t; psid_t *psid; void * sid_init(void) { #if 0 psid_t *psid; #endif sampling_method method = SAMPLE_INTERPOLATE; float cycles_per_sec = 14318180.0 / 16.0; psid = new psid_t; #if 0 psid = (psid_t *)malloc(sizeof(sound_t)); #endif psid->sid = new SIDFP; psid->sid->set_chip_model(MOS8580FP); psid->sid->set_voice_nonlinearity(1.0f); psid->sid->get_filter().set_distortion_properties(0.f, 0.f, 0.f); psid->sid->get_filter().set_type4_properties(6.55f, 20.0f); psid->sid->enable_filter(true); psid->sid->enable_external_filter(true); psid->sid->reset(); for (uint8_t c = 0; c < 32; c++) psid->sid->write(c, 0); if (!psid->sid->set_sampling_parameters(cycles_per_sec, method, (float) RESID_FREQ, 0.9 * (float) RESID_FREQ / 2.0)) { #if 0 printf("reSID failed!\n"); #endif } psid->sid->set_chip_model(MOS6581FP); psid->sid->set_voice_nonlinearity(0.96f); psid->sid->get_filter().set_distortion_properties(3.7e-3f, 2048.f, 1.2e-4f); psid->sid->input(0); psid->sid->get_filter().set_type3_properties(1.33e6f, 2.2e9f, 1.0056f, 7e3f); return (void *) psid; } void sid_close(UNUSED(void *priv)) { #if 0 psid_t *psid = (psid_t *) priv; #endif delete psid->sid; #if 0 free(psid); #endif } void sid_reset(UNUSED(void *priv)) { #if 0 psid_t *psid = (psid_t *) priv; #endif psid->sid->reset(); for (uint8_t c = 0; c < 32; c++) psid->sid->write(c, 0); } uint8_t sid_read(uint16_t addr, UNUSED(void *priv)) { #if 0 psid_t *psid = (psid_t *) priv; #endif return psid->sid->read(addr & 0x1f); #if 0 return 0xFF; #endif } void sid_write(uint16_t addr, uint8_t val, UNUSED(void *priv)) { #if 0 psid_t *psid = (psid_t *) priv; #endif psid->sid->write(addr & 0x1f, val); } #define CLOCK_DELTA(n) (int) (((14318180.0 * n) / 16.0) / (float) RESID_FREQ) static void fillbuf2(int &count, int16_t *buf, int len) { int c; c = psid->sid->clock(count, buf, len, 1); if (!c) *buf = psid->last_sample; psid->last_sample = *buf; } void sid_fillbuf(int16_t *buf, int len, UNUSED(void *priv)) { #if 0 psid_t *psid = (psid_t *) priv; #endif int x = CLOCK_DELTA(len); fillbuf2(x, buf, len); }