void rdp_interrupt_event(struct rdp_core* dp) { dp->dpc_regs[DPC_STATUS_REG] &= ~2; dp->dpc_regs[DPC_STATUS_REG] |= 0x81; raise_rcp_interrupt(dp->r4300, MI_INTR_DP); }
void si_end_of_dma_event(struct si_controller* si) { si->pif.ram[0x3f] = 0x0; /* trigger SI interrupt */ si->regs[SI_STATUS_REG] |= 0x1000; raise_rcp_interrupt(si->r4300, MI_INTR_SI); }
void rsp_interrupt_event(struct rsp_core* sp) { sp->regs[SP_STATUS_REG] |= 0x203; if ((sp->regs[SP_STATUS_REG] & 0x40) != 0) { raise_rcp_interrupt(sp->r4300, MI_INTR_SP); } }
void rsp_interrupt_event(struct rsp_core* sp) { /* XXX: assume task has fully completed */ sp->regs[SP_STATUS_REG] |= SP_STATUS_TASKDONE | SP_STATUS_BROKE | SP_STATUS_HALT; if ((sp->regs[SP_STATUS_REG] & SP_STATUS_INTR_BREAK) != 0) { raise_rcp_interrupt(sp->r4300, MI_INTR_SP); } }
void ai_end_of_dma_event(struct ai_controller* ai) { if (ai->last_read != 0) { unsigned int diff = ai->fifo[0].length - ai->last_read; unsigned char *p = (unsigned char*)&ai->ri->rdram.dram[ai->fifo[0].address/4]; ai->push_audio_samples(&ai->backend, p + diff, ai->last_read); } fifo_pop(ai); raise_rcp_interrupt(ai->r4300, MI_INTR_AI); }
void ai_end_of_dma_event(void* opaque) { struct ai_controller* ai = (struct ai_controller*)opaque; if (ai->last_read != 0) { unsigned int diff = ai->fifo[0].length - ai->last_read; unsigned char *p = (unsigned char*)&ai->ri->rdram->dram[ai->fifo[0].address/4]; ai->iaout->push_samples(ai->aout, p + diff, ai->last_read); } fifo_pop(ai); raise_rcp_interrupt(ai->mi, MI_INTR_AI); }
void ai_end_of_dma_event(struct ai_controller* ai, unsigned int ai_event) { if (ai->regs[AI_STATUS_REG] & 0x80000000) // full { ai->regs[AI_STATUS_REG] &= ~0x80000000; ai->fifo[0].delay = ai->fifo[1].delay; ai->fifo[0].length = ai->fifo[1].length; add_interupt_event_count(AI_INT, ai_event+ai->fifo[1].delay); } else { ai->regs[AI_STATUS_REG] &= ~0x40000000; } raise_rcp_interrupt(ai->r4300, MI_INTR_AI); }
// Checks for interrupts, possibly sets the cause bit. static void check_for_interrupts(struct vr4300 *vr4300) { if (vr4300->mi_regs[MI_INTR_REG] & vr4300->mi_regs[MI_INTR_MASK_REG]) raise_rcp_interrupt(vr4300); else lower_rcp_interrupt(vr4300); }