#ifndef M64P_RDP_RDP_CORE_H
#define M64P_RDP_RDP_CORE_H
#include <stdint.h>
struct r4300_core;
struct rsp_core;
struct ri_controller;
enum dpc_registers
{
DPC_START_REG,
DPC_END_REG,
DPC_CURRENT_REG,
DPC_STATUS_REG,
DPC_CLOCK_REG,
DPC_BUFBUSY_REG,
DPC_PIPEBUSY_REG,
DPC_TMEM_REG,
DPC_REGS_COUNT
};
enum dps_registers
{
DPS_TBIST_REG,
DPS_TEST_MODE_REG,
DPS_BUFTEST_ADDR_REG,
DPS_BUFTEST_DATA_REG,
DPS_REGS_COUNT
};
struct rdp_core
{
uint32_t dpc_regs[DPC_REGS_COUNT];
uint32_t dps_regs[DPS_REGS_COUNT];
struct r4300_core* r4300;
struct rsp_core* sp;
struct ri_controller* ri;
};
#include "osal/preproc.h"
static osal_inline uint32_t dpc_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
}
static osal_inline uint32_t dps_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
}
void connect_rdp(struct rdp_core* dp,
struct r4300_core* r4300,
struct rsp_core* sp,
struct ri_controller* ri);
void init_rdp(struct rdp_core* dp);
int read_dpc_regs(void* opaque, uint32_t address, uint32_t* value);
int write_dpc_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask);
int read_dps_regs(void* opaque, uint32_t address, uint32_t* value);
int write_dps_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask);
void rdp_interrupt_event(struct rdp_core* dp);
#endif