コード例 #1
0
ファイル: sound_pssj.c プロジェクト: aliaspider/PCem-mooch
static void pssj_callback(void *p)
{
        pssj_t *pssj = (pssj_t *)p;
        int data;
        
        pssj_update(pssj);
        if (pssj->ctrl & 2)
        {
                if ((pssj->ctrl & 3) == 3)
                {
                        data = dma_channel_read(1);

                        if (data != DMA_NODATA)
                        {
                                pssj->dac_val = data & 0xff;
//                                pclog("DAC_val=%02x\n", data);
                        }
                }
                else
                {
                        data = dma_channel_write(1, 0x80);
                }

                if ((data & DMA_OVER) && data != DMA_NODATA)
                {
//                        pclog("Check IRQ %i %02x\n", pssj->irq, pssj->ctrl);
                        if (pssj->ctrl & 0x08)
                        {
                                pssj->irq = 1;
                                pssj_update_irq(pssj);
                        }
                } 
        }
        else
        {
                switch (pssj->wave & 0xc0)
                {
                        case 0x00: /*Pulse*/
                        pssj->dac_val = (pssj->wave_pos > (pssj->pulse_width << 1)) ? 0xff : 0;
                        break;
                        case 0x40: /*Ramp*/
                        pssj->dac_val = pssj->wave_pos << 3;
                        break;
                        case 0x80: /*Triangle*/
                        if (pssj->wave_pos & 16)
                                pssj->dac_val = (pssj->wave_pos ^ 31) << 4;
                        else
                                pssj->dac_val = pssj->wave_pos << 4;
                        break;
                        case 0xc0:
                        pssj->dac_val = 0x80;
                        break;
                }
                pssj->wave_pos = (pssj->wave_pos + 1) & 31;
        }

        pssj->timer_count += (int)(TIMER_USEC * (1000000.0 / 3579545.0) * (double)(pssj->freq ? pssj->freq : 0x400));
}
コード例 #2
0
ファイル: snd_pssj.c プロジェクト: OBattler/PCem-Unofficial
static void pssj_get_buffer(int32_t *buffer, int len, void *p)
{
        pssj_t *pssj = (pssj_t *)p;
        int c;
        
        pssj_update(pssj);
        
        for (c = 0; c < len * 2; c++)
                buffer[c] += pssj->buffer[c >> 1];

        pssj->pos = 0;
}