mirror of
https://github.com/n64dev/cen64.git
synced 2025-04-02 10:31:54 -04:00
83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
//
|
|
// rsp/cpu.h: RSP processor container.
|
|
//
|
|
// CEN64: Cycle-Accurate Nintendo 64 Emulator.
|
|
// Copyright (C) 2015, Tyler J. Stachecki.
|
|
//
|
|
// This file is subject to the terms and conditions defined in
|
|
// 'LICENSE', which is part of this source code package.
|
|
//
|
|
|
|
#ifndef __rsp_cpu_h__
|
|
#define __rsp_cpu_h__
|
|
#include "bus/controller.h"
|
|
#include "common.h"
|
|
#include "os/dynarec.h"
|
|
#include "rdp/cpu.h"
|
|
#include "rsp/cp0.h"
|
|
#include "rsp/cp2.h"
|
|
#include "rsp/pipeline.h"
|
|
|
|
enum rsp_register {
|
|
RSP_REGISTER_R0, RSP_REGISTER_AT, RSP_REGISTER_V0,
|
|
RSP_REGISTER_V1, RSP_REGISTER_A0, RSP_REGISTER_A1,
|
|
RSP_REGISTER_A2, RSP_REGISTER_A3, RSP_REGISTER_T0,
|
|
RSP_REGISTER_T1, RSP_REGISTER_T2, RSP_REGISTER_T3,
|
|
RSP_REGISTER_T4, RSP_REGISTER_R5, RSP_REGISTER_T6,
|
|
RSP_REGISTER_T7, RSP_REGISTER_S0, RSP_REGISTER_S1,
|
|
RSP_REGISTER_S2, RSP_REGISTER_S3, RSP_REGISTER_S4,
|
|
RSP_REGISTER_S5, RSP_REGISTER_S6, RSP_REGISTER_S7,
|
|
RSP_REGISTER_T8, RSP_REGISTER_T9, RSP_REGISTER_K0,
|
|
RSP_REGISTER_K1, RSP_REGISTER_GP, RSP_REGISTER_SP,
|
|
RSP_REGISTER_FP, RSP_REGISTER_RA,
|
|
|
|
// CP0 registers.
|
|
RSP_REGISTER_CP0_0, RSP_REGISTER_CP0_1, RSP_REGISTER_CP0_2,
|
|
RSP_REGISTER_CP0_3, RSP_REGISTER_CP0_4, RSP_REGISTER_CP0_5,
|
|
RSP_REGISTER_CP0_6, RSP_REGISTER_CP0_7,
|
|
|
|
// Miscellanious registers.
|
|
NUM_RSP_REGISTERS
|
|
};
|
|
|
|
enum sp_register {
|
|
#define X(reg) reg,
|
|
#include "rsp/registers.md"
|
|
#undef X
|
|
NUM_SP_REGISTERS,
|
|
SP_REGISTER_OFFSET = RSP_REGISTER_CP0_0
|
|
};
|
|
|
|
#ifdef DEBUG_MMIO_REGISTER_ACCESS
|
|
extern const char *sp_register_mnemonics[NUM_SP_REGISTERS];
|
|
#endif
|
|
|
|
struct rsp {
|
|
struct bus_controller *bus;
|
|
struct rsp_pipeline pipeline;
|
|
struct rsp_cp2 cp2;
|
|
|
|
uint32_t regs[NUM_RSP_REGISTERS];
|
|
uint8_t mem[0x2000];
|
|
|
|
// Instead of redecoding the instructions (there's only 256 words)
|
|
// every cycle, we maintain a 256-word decoded instruction cache.
|
|
struct rsp_opcode opcode_cache[0x1000 / 4];
|
|
unsigned rdp_has_pending_dl;
|
|
};
|
|
|
|
cen64_cold int rsp_init(struct rsp *rsp, struct bus_controller *bus);
|
|
cen64_cold void rsp_late_init(struct rsp *rsp);
|
|
cen64_cold void rsp_destroy(struct rsp *rsp);
|
|
|
|
cen64_flatten cen64_hot void rsp_cycle_(struct rsp *rsp);
|
|
|
|
cen64_flatten cen64_hot static inline void rsp_cycle(struct rsp *rsp) {
|
|
if (rsp->regs[RSP_CP0_REGISTER_SP_STATUS] & SP_STATUS_HALT)
|
|
return;
|
|
|
|
rsp_cycle_(rsp);
|
|
}
|
|
|
|
#endif
|
|
|