// Reads a word from the MI MMIO register space. int read_mi_regs(void *opaque, uint32_t address, uint32_t *word) { struct vr4300 *vr4300 = (struct vr4300 *) opaque; uint32_t offset = address - MI_REGS_BASE_ADDRESS; enum mi_register reg = (offset >> 2); *word = vr4300->mi_regs[reg]; debug_mmio_read(mi, mi_register_mnemonics[reg], *word); return 0; }
// Reads a word from the PI MMIO register space. int read_pi_regs(void *opaque, uint32_t address, uint32_t *word) { struct pi_controller *pi = (struct pi_controller *) opaque; unsigned offset = address - PI_REGS_BASE_ADDRESS; enum pi_register reg = (offset >> 2); *word = pi->regs[reg]; debug_mmio_read(pi, pi_register_mnemonics[reg], *word); return 0; }
// Reads a word from the AI MMIO register space. int read_ai_regs(void *opaque, uint32_t address, uint32_t *word) { struct ai_controller *ai = (struct ai_controller *) opaque; unsigned offset = address - AI_REGS_BASE_ADDRESS; enum ai_register reg = (offset >> 2); *word = ai->regs[reg]; debug_mmio_read(ai, ai_register_mnemonics[reg], *word); if (reg == AI_LEN_REG) { *word = 0; if (ai->regs[AI_STATUS_REG] & 0x80000001) *word = ai->regs[AI_LEN_REG]; else if (ai->regs[AI_STATUS_REG] & 0x40000000) { // TODO } } return 0; }