45 lines
1.0 KiB
C++
45 lines
1.0 KiB
C++
#include "recomp.h"
|
|
|
|
enum class RDPStatusBit {
|
|
XbusDmem = 0,
|
|
Freeze = 1,
|
|
Flush = 2,
|
|
CommandBusy = 6,
|
|
BufferReady = 7,
|
|
DmaBusy = 8,
|
|
EndValid = 9,
|
|
StartValid = 10,
|
|
};
|
|
|
|
constexpr void update_bit(uint32_t& state, uint32_t flags, RDPStatusBit bit) {
|
|
int set_bit_pos = (int)bit * 2 + 0;
|
|
int reset_bit_pos = (int)bit * 2 + 1;
|
|
bool set = (flags & (1U << set_bit_pos)) != 0;
|
|
bool reset = (flags & (1U << reset_bit_pos)) != 0;
|
|
|
|
if (set ^ reset) {
|
|
if (set) {
|
|
state |= (1U << (int)bit);
|
|
}
|
|
else {
|
|
state &= ~(1U << (int)bit);
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t rdp_state = 1 << (int)RDPStatusBit::BufferReady;
|
|
|
|
extern "C" void osDpSetNextBuffer_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|
assert(false);
|
|
}
|
|
|
|
extern "C" void osDpGetStatus_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|
ctx->r2 = rdp_state;
|
|
}
|
|
|
|
extern "C" void osDpSetStatus_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|
update_bit(rdp_state, ctx->r4, RDPStatusBit::XbusDmem);
|
|
update_bit(rdp_state, ctx->r4, RDPStatusBit::Freeze);
|
|
update_bit(rdp_state, ctx->r4, RDPStatusBit::Flush);
|
|
}
|