Skip to content

Commit

Permalink
3rdParty: implement register mirroring in mupen64plus-core
Browse files Browse the repository at this point in the history
  • Loading branch information
Rosalie241 committed Feb 9, 2025
1 parent 358cb33 commit a7ea66e
Show file tree
Hide file tree
Showing 14 changed files with 45 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ void read_ai_regs(void* opaque, uint32_t address, uint32_t* value)
ai->last_read = *value;
}
}
else
else if (reg < AI_REGS_COUNT)
{
*value = ai->regs[reg];
}
Expand Down Expand Up @@ -216,7 +216,10 @@ void write_ai_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&ai->regs[reg], value, mask);
if (reg < AI_REGS_COUNT)
{
masked_write(&ai->regs[reg], value, mask);
}
}

void ai_end_of_dma_event(void* opaque)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ struct ai_controller

static osal_inline uint32_t ai_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_ai(struct ai_controller* ai,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ struct mi_controller

static osal_inline uint32_t mi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0xf) >> 2;
}

void init_mi(struct mi_controller* mi, struct r4300_core* r4300);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,14 @@ void read_pi_regs(void* opaque, uint32_t address, uint32_t* value)
struct pi_controller* pi = (struct pi_controller*)opaque;
uint32_t reg = pi_reg(address);

*value = pi->regs[reg];

if (reg == PI_WR_LEN_REG || reg == PI_RD_LEN_REG)
*value = 0x7F;
else if (reg == PI_CART_ADDR_REG)
*value &= 0xFFFFFFFE;
else if (reg == PI_DRAM_ADDR_REG)
*value &= 0xFFFFFE;
else if (reg < PI_REGS_COUNT)
*value = pi->regs[reg];
}

void write_pi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand Down Expand Up @@ -209,7 +209,10 @@ void write_pi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&pi->regs[reg], value, mask);
if (reg < PI_REGS_COUNT)
{
masked_write(&pi->regs[reg], value, mask);
}
}

void pi_end_of_dma_event(void* opaque)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ struct pi_controller

static osal_inline uint32_t pi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x3f) >> 2;
}


Expand Down
10 changes: 8 additions & 2 deletions Source/3rdParty/mupen64plus-core/src/device/rcp/rdp/rdp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,21 @@ void read_dps_regs(void* opaque, uint32_t address, uint32_t* value)
struct rdp_core* dp = (struct rdp_core*)opaque;
uint32_t reg = dps_reg(address);

*value = dp->dps_regs[reg];
if (reg < DPS_REGS_COUNT)
{
*value = dp->dps_regs[reg];
}
}

void write_dps_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
{
struct rdp_core* dp = (struct rdp_core*)opaque;
uint32_t reg = dps_reg(address);

masked_write(&dp->dps_regs[reg], value, mask);
if (reg < DPS_REGS_COUNT)
{
masked_write(&dp->dps_regs[reg], value, mask);
}
}

void rdp_interrupt_event(void* opaque)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,12 @@ struct rdp_core

static osal_inline uint32_t dpc_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint32_t dps_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_rdp(struct rdp_core* dp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ struct ri_controller

static osal_inline uint32_t ri_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint32_t ri_address(uint32_t address)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,10 @@ void read_rsp_regs2(void* opaque, uint32_t address, uint32_t* value)
struct rsp_core* sp = (struct rsp_core*)opaque;
uint32_t reg = rsp_reg2(address);

*value = sp->regs2[reg];

if (reg == SP_PC_REG)
*value &= 0xffc;

else if (reg < SP_REGS2_COUNT)
*value = sp->regs2[reg];
}

void write_rsp_regs2(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand All @@ -318,8 +317,8 @@ void write_rsp_regs2(void* opaque, uint32_t address, uint32_t value, uint32_t ma

if (reg == SP_PC_REG)
mask &= 0xffc;

masked_write(&sp->regs2[reg], value, mask);
else if (reg < SP_REGS2_COUNT)
masked_write(&sp->regs2[reg], value, mask);
}

void do_SP_Task(struct rsp_core* sp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,12 @@ static osal_inline uint32_t rsp_mem_address(uint32_t address)

static osal_inline uint32_t rsp_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint32_t rsp_reg2(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_rsp(struct rsp_core* sp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,10 @@ void read_si_regs(void* opaque, uint32_t address, uint32_t* value)
struct si_controller* si = (struct si_controller*)opaque;
uint32_t reg = si_reg(address);

*value = si->regs[reg];
if (reg < SI_REGS_COUNT)
{
*value = si->regs[reg];
}
}

void write_si_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ struct si_controller

static osal_inline uint32_t si_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,10 @@ void read_vi_regs(void* opaque, uint32_t address, uint32_t* value)
/* update current field */
vi->regs[VI_CURRENT_REG] = (vi->regs[VI_CURRENT_REG] & (~1)) | vi->field;
}

*value = vi->regs[reg];
else if (reg < VI_REGS_COUNT)
{
*value = vi->regs[reg];
}
}

void write_vi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand Down Expand Up @@ -151,7 +153,10 @@ void write_vi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&vi->regs[reg], value, mask);
if (reg < VI_REGS_COUNT)
{
masked_write(&vi->regs[reg], value, mask);
}
}

void vi_vertical_interrupt_event(void* opaque)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ struct vi_controller

static osal_inline uint32_t vi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x3f) >> 2;
}


Expand Down

0 comments on commit a7ea66e

Please sign in to comment.