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; } }
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"); }
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); }
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"); } }
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; } }
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); } }
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]); }
static void pssj_update_irq(pssj_t *pssj) { if (pssj->irq && (pssj->ctrl & 0x10) && (pssj->ctrl & 0x08)) picint(1 << 7); }
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); } } } }
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]); }
static void fdc_int() { if (!fdc.pcjr) picint(1 << 6); }