コード例 #1
0
ファイル: keyboard_at.c プロジェクト: startmenu/PCemN
void keyboard_at_poll()
{
	keybsenddelay += (1000 * TIMER_USEC);
        if (keyboard_at.out_new != -1)
        {
                keyboard_at.wantirq = 0;
                if (keyboard_at.mem[0] & 0x01)
                        picint(2);
                keyboard_at.out = keyboard_at.out_new;
                keyboard_at.out_new = -1;
                keyboard_at.status |=  STAT_OFULL;
                keyboard_at.status &= ~STAT_IFULL;
//                pclog("keyboard_at : take IRQ\n");
                keyboard_at.last_irq = 2;
        }
        else if (keyboard_at.wantirq12)
        {
                keyboard_at.wantirq12 = 0;
                picint(0x1000);
//                pclog("keyboard_at : take IRQ 12\n");
                keyboard_at.last_irq = 0x1000;
        }
        if (!(keyboard_at.status & STAT_OFULL) && !(keyboard_at.mem[0] & 0x10) &&
            mouse_queue_start != mouse_queue_end)
        {
//                pclog("Reading %02X from the mouse queue at %i\n", keyboard_at.out, key_queue_start);
                keyboard_at.out = mouse_queue[mouse_queue_start];
                mouse_queue_start = (mouse_queue_start + 1) & 0xf;
                keyboard_at.status |=  STAT_OFULL | STAT_MFULL;
                keyboard_at.status &= ~STAT_IFULL;
                if (keyboard_at.mem[0] & 0x02)
                   keyboard_at.wantirq12 = 1;        
        }                
        else if (!(keyboard_at.status & STAT_OFULL) && keyboard_at.out_new == -1 &&
                 !(keyboard_at.mem[0] & 0x10) && key_queue_start != key_queue_end)
        {
                keyboard_at.out_new = key_queue[key_queue_start];
//                pclog("Reading %02X from the key queue at %i\n", keyboard_at.out, key_queue_start);
                key_queue_start = (key_queue_start + 1) & 0xf;
        }                
        else if (keyboard_at.out_new == -1 && !(keyboard_at.status & STAT_OFULL) && 
            key_ctrl_queue_start != key_ctrl_queue_end)
        {
                keyboard_at.out_new = key_ctrl_queue[key_ctrl_queue_start];
//                pclog("Reading %02X from the key ctrl_queue at %i\n", keyboard_at.out, key_ctrl_queue_start);
                key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf;
        }                
}
コード例 #2
0
ファイル: snd_mpu401.c プロジェクト: Nado15/86Box
static void QueueByte(mpu_t *mpu, uint8_t data) 
{
	if (mpu->state.block_ack) 
	{
		mpu->state.block_ack=0;
		return;
	}
	
	if (mpu->queue_used == 0 && mpu->intelligent) 
	{
		mpu->state.irq_pending=1;
		//PIC_ActivateIRQ(mpu->irq);
		picint(1 << mpu->irq);
	}
	if (mpu->queue_used < MPU401_QUEUE) 
	{
		int pos = mpu->queue_used+mpu->queue_pos;
		
		if (mpu->queue_pos >= MPU401_QUEUE) 
			mpu->queue_pos -= MPU401_QUEUE;
		
		if (pos>=MPU401_QUEUE) 
			pos-=MPU401_QUEUE;
		
		mpu->queue_used++;
		mpu->queue[pos]=data;
	} 
	else
		pclog("MPU401:Data queue full\n");
}
コード例 #3
0
ファイル: nvr.c プロジェクト: aliaspider/PCem-mooch
void nvr_onesec(void *p)
{
        nvr_onesec_cnt++;
        if (nvr_onesec_cnt >= 100)
        {
                nvr_onesec_cnt = 0;
		/* If sync is disabled, move internal clock ahead by 1 second. */
		if (!enable_sync)  nvr_update_internal_clock();
                nvrram[0xC] |= 0x10;
                if (nvrram[0xB] & 0x10)
                {
                        nvrram[0xC] |= 0x80;
                        if (AMSTRAD) picint(2);
                        else         picint(0x100);
                }
//                pclog("RTC onesec\n");
        }
        nvr_onesec_time += (int)(10000 * TIMER_USEC);
}
コード例 #4
0
ファイル: nvr.c プロジェクト: aliaspider/PCem-mooch
void nvr_rtc(void *p)
{
        int c;
        if (!(nvrram[0xA]&0xF))
        {
                rtctime=0x7fffffff;
                return;
        }
        c=1<<((nvrram[0xA]&0xF)-1);
        rtctime += (int)(RTCCONST * c * (1 << TIMER_SHIFT));
//        pclog("RTCtime now %f\n",rtctime);
        nvrram[0xC] |= 0x40;
        if (nvrram[0xB]&0x40)
        {
                nvrram[0xC]|=0x80;
                if (AMSTRAD) picint(2);
                else         picint(0x100);
//                pclog("RTC int\n");
        }
}
コード例 #5
0
ファイル: keyboard_xt.c プロジェクト: Nado15/86Box
void keyboard_xt_poll()
{
        keybsenddelay += (1000 * TIMER_USEC);
        if (key_queue_start != key_queue_end && !keyboard_xt.blocked)
        {
                keyboard_xt.pa = key_queue[key_queue_start];
		picint(2);
                pclog("Reading %02X from the key queue at %i\n", keyboard_xt.pa, key_queue_start);
                key_queue_start = (key_queue_start + 1) & 0xf;
                keyboard_xt.blocked = 1;
        }                
}
コード例 #6
0
ファイル: fdc.c プロジェクト: MoochMcGee/PCem-mooch
static void fdc_watchdog_poll(void *p)
{
        FDC *fdc = (FDC *)p;

        fdc->watchdog_count--;
        if (fdc->watchdog_count)
                fdc->watchdog_timer += 1000 * TIMER_USEC;
        else
        {
//                pclog("Watchdog timed out\n");
        
                fdc->watchdog_timer = 0;
                if (fdc->dor & 0x20)
                        picint(1 << 6);
        }
}
コード例 #7
0
ファイル: sound_ad1848.c プロジェクト: fourks/libretro-pcem
static void ad1848_poll(void *p)
{
        ad1848_t *ad1848 = (ad1848_t *)p;
 
        if (ad1848->timer_latch)
                ad1848->timer_count += ad1848->timer_latch;
        else
                ad1848->timer_count = TIMER_USEC;
        
        ad1848_update(ad1848);
        
        if (ad1848->enable)
        {
                int32_t temp;
                
                switch (ad1848->regs[8] & 0x70)
                {
                        case 0x00: /*Mono, 8-bit PCM*/
                        ad1848->out_l = ad1848->out_r = (dma_channel_read(ad1848->dma) ^ 0x80) * 256;
                        break;
                        case 0x10: /*Stereo, 8-bit PCM*/
                        ad1848->out_l = (dma_channel_read(ad1848->dma) ^ 0x80)  * 256;
                        ad1848->out_r = (dma_channel_read(ad1848->dma) ^ 0x80)  * 256;
                        break;
                
                        case 0x40: /*Mono, 16-bit PCM*/
                        temp = dma_channel_read(ad1848->dma);
                        ad1848->out_l = ad1848->out_r = (dma_channel_read(ad1848->dma) << 8) | temp;
                        break;
                        case 0x50: /*Stereo, 16-bit PCM*/
                        temp = dma_channel_read(ad1848->dma);
                        ad1848->out_l = (dma_channel_read(ad1848->dma) << 8) | temp;
                        temp = dma_channel_read(ad1848->dma);
                        ad1848->out_r = (dma_channel_read(ad1848->dma) << 8) | temp;
                        break;
                }

                if (ad1848->regs[6] & 0x80)
                        ad1848->out_l = 0;
                else
                        ad1848->out_l = (ad1848->out_l * ad1848_vols[ad1848->regs[6] & 0x3f]) >> 16;

                if (ad1848->regs[7] & 0x80)
                        ad1848->out_r = 0;
                else
                        ad1848->out_r = (ad1848->out_r * ad1848_vols[ad1848->regs[7] & 0x3f]) >> 16;
                
                if (ad1848->count < 0)
                {
                        ad1848->count = ad1848->regs[15] | (ad1848->regs[14] << 8);
                        if (!(ad1848->status & 0x01))
                        {
                                ad1848->status |= 0x01;
                                if (ad1848->regs[0xa] & 2)
                                        picint(1 << ad1848->irq);
                        }                                
                }

                ad1848->count--;
//                pclog("ad1848_poll : enable %X %X  %X %X  %X %X\n", ad1848->pcm_buffer[0][ad1848->pos], ad1848->pcm_buffer[1][ad1848->pos], ad1848->out_l[0], ad1848->out_r[0], ad1848->out_l[1], ad1848->out_r[1]);
        }
コード例 #8
0
ファイル: snd_pssj.c プロジェクト: OBattler/PCem-Unofficial
static void pssj_update_irq(pssj_t *pssj)
{
        if (pssj->irq && (pssj->ctrl & 0x10) && (pssj->ctrl & 0x08))
                picint(1 << 7);
}
コード例 #9
0
ファイル: sound_pas16.c プロジェクト: MoochMcGee/PCem-mooch
static void pas16_pcm_poll(void *p)
{
        pas16_t *pas16 = (pas16_t *)p;
        
        pas16_update(pas16);
//        if (pas16->pcm_ctrl & PAS16_PCM_ENA)
//                pclog("pas16_pcm_poll : poll %i %i ", pas16->pit.c[0], pas16->pit.l[0]);
        if (pas16->pit.m[0] & 2)
        {
                if (pas16->pit.l[0]) 
                        pas16->pit.c[0] += (pas16->pit.l[0] * PITCONST * (1 << TIMER_SHIFT));
                else                
                        pas16->pit.c[0] += (0x10000 * PITCONST * (1 << TIMER_SHIFT));
        }
        else
        {
                pas16->pit.c[0] = -1;
                pas16->pit.enable[0] = 0;
        }
//        if (pas16->pcm_ctrl & PAS16_PCM_ENA)
//                pclog(" %i\n", pas16->pit.c[0]);

        pas16->irq_stat |= PAS16_INT_SAMP;
        if (pas16->irq_ena & PAS16_INT_SAMP)
                picint(1 << pas16->irq);
//        pas16_update_irqs();
        
        /*Update sample rate counter*/
        if (pas16->pit.enable[1])
        {               
                if (pas16->pcm_ctrl & PAS16_PCM_ENA)
                {
                        uint16_t temp;
                        
                        if (pas16->sys_conf_2 & PAS16_SC2_16BIT)
                        {
                                temp = pas16_readdma(pas16) << 8;
                                temp |= pas16_readdma(pas16);
                        }
                        else
                                temp = (pas16_readdma(pas16) ^ 0x80) << 8;
                        
                        if (pas16->sys_conf_2 & PAS16_SC2_MSBINV)
                                temp ^= 0x8000;
                        if (pas16->pcm_ctrl & PAS16_PCM_MONO)
                                pas16->pcm_dat_l = pas16->pcm_dat_r = temp;
                        else
                        {
                                if (pas16->stereo_lr)
                                        pas16->pcm_dat_r = temp;
                                else
                                        pas16->pcm_dat_l = temp;
                                        
                                pas16->stereo_lr = !pas16->stereo_lr;
                        }
//                        pclog("pas16_pcm_poll : %04X %i\n", temp, pas16->stereo_lr);
//                        pclog("pas16_pcm_poll : %i %02X  %i\n", pas16->pit.c[1], temp, pas16->pit.c[0]);
/*                        if (!pas16_pcm)
                                pas16_pcm=fopen("pas16->pcm", "wb");
                        putc(temp, pas16_pcm);*/
                }
                if (pas16->sys_conf_2 & PAS16_SC2_16BIT)
                        pas16->pit.c[1] -= 2;
                else
                        pas16->pit.c[1]--;
                if (pas16->pit.c[1] == 0)
                {
//                        if (pas16->pcm_ctrl & PAS16_PCM_ENA)
//                                pclog("pas16_pcm_poll : buffer over\n");
                        if (pas16->pit.m[1] & 2)
                        {
                                if (pas16->pit.l[1]) 
                                        pas16->pit.c[1] += pas16->pit.l[1];
                                else                
                                        pas16->pit.c[1] += 0x10000;
                        }
                        else
                        {
                                pas16->pit.c[1] = -1;
                                pas16->pit.enable[1] = 0;
                        }
                
                        pas16->irq_stat |= PAS16_INT_PCM;
                        if (pas16->irq_ena & PAS16_INT_PCM)
                        {
                                pclog("pas16_pcm_poll : cause IRQ %i %02X\n", pas16->irq, 1 << pas16->irq);
                                picint(1 << pas16->irq);
                        }
                }
        }
}
コード例 #10
0
void ad1848_poll(void *p, int16_t *l, int16_t *r)
{
        ad1848_t *ad1848 = (ad1848_t *)p;
        
//        opl3_poll(&ad1848->opl, &ad1848->opl_buffer[ad1848->pos * 2], &ad1848->opl_buffer[(ad1848->pos * 2) + 1]);
        
        if (ad1848->enable)
        {
                int32_t temp;
                
                if (ad1848->regs[6] & 0x80)
                        *l = 0;
                else
                        *l = (ad1848->out_l * ad1848_vols[ad1848->regs[6] & 0x3f]) >> 16;

                if (ad1848->regs[7] & 0x80)
                        *r = 0;
                else
                        *r = (ad1848->out_r * ad1848_vols[ad1848->regs[7] & 0x3f]) >> 16;
                
                ad1848->interp_count += ad1848->inc;
                if (ad1848->interp_count >= 0x10000)
                {
                        ad1848->interp_count -= 0x10000;

                        if (ad1848->count < 0)
                        {               
                                ad1848->count = ad1848->regs[15] | (ad1848->regs[14] << 8);
                                if (!(ad1848->status & 0x01))
                                {
                                        ad1848->status |= 0x01;
                                        if (ad1848->regs[0xa] & 2)
                                                picint(1 << ad1848->irq);
                                }                                
                        }

                        switch (ad1848->regs[8] & 0x70)
                        {
                                case 0x00: /*Mono, 8-bit PCM*/
                                ad1848->out_l = ad1848->out_r = (dma_channel_read(ad1848->dma) ^ 0x80) * 256;
                                break;
                                case 0x10: /*Stereo, 8-bit PCM*/
                                ad1848->out_l = (dma_channel_read(ad1848->dma) ^ 0x80)  * 256;
                                ad1848->out_r = (dma_channel_read(ad1848->dma) ^ 0x80)  * 256;
                                break;
                
                                case 0x40: /*Mono, 16-bit PCM*/
                                temp = dma_channel_read(ad1848->dma);
                                ad1848->out_l = ad1848->out_r = dma_channel_read(ad1848->dma) | (temp << 8);
                                break;
                                case 0x50: /*Stereo, 16-bit PCM*/
                                temp = dma_channel_read(ad1848->dma);
                                ad1848->out_l = dma_channel_read(ad1848->dma) | (temp << 8);
                                temp = dma_channel_read(ad1848->dma);
                                ad1848->out_r = dma_channel_read(ad1848->dma) | (temp << 8);
                                break;
                        }
        
                        ad1848->count--;
                }
//                pclog("ad1848_poll : enable %X %X  %X %X  %X %X\n", ad1848->pcm_buffer[0][ad1848->pos], ad1848->pcm_buffer[1][ad1848->pos], ad1848->out_l[0], ad1848->out_r[0], ad1848->out_l[1], ad1848->out_r[1]);
        }
コード例 #11
0
ファイル: fdc.c プロジェクト: MoochMcGee/PCem-mooch
static void fdc_int()
{
        if (!fdc.pcjr)
                picint(1 << 6);
}