pureikyubu/SRC/Hardware/SI.h
2020-06-28 16:01:58 +03:00

103 lines
4.5 KiB
C

#pragma once
#define SI_POLLING_INTERVAL 0x10000 // In Gekko ticks
// SI registers (all registers are 32-bit)
#define SI_CHAN0_OUTBUF 0x0C006400 // Channel 0 Output Buffer
#define SI_CHAN0_INBUFH 0x0C006404 // Channel 0 Input Buffer High
#define SI_CHAN0_INBUFL 0x0C006408 // Channel 0 Input Buffer Low
#define SI_CHAN1_OUTBUF 0x0C00640C // Channel 1 Output Buffer
#define SI_CHAN1_INBUFH 0x0C006410 // Channel 1 Input Buffer High
#define SI_CHAN1_INBUFL 0x0C006414 // Channel 1 Input Buffer Low
#define SI_CHAN2_OUTBUF 0x0C006418 // Channel 2 Output Buffer
#define SI_CHAN2_INBUFH 0x0C00641C // Channel 2 Input Buffer High
#define SI_CHAN2_INBUFL 0x0C006420 // Channel 2 Input Buffer Low
#define SI_CHAN3_OUTBUF 0x0C006424 // Channel 3 Output Buffer
#define SI_CHAN3_INBUFH 0x0C006428 // Channel 3 Input Buffer High
#define SI_CHAN3_INBUFL 0x0C00642C // Channel 3 Input Buffer Low
#define SI_POLL 0x0C006430 // Poll Register
#define SI_COMCSR 0x0C006434 // Communication Control Status Register
#define SI_SR 0x0C006438 // Status Register
#define SI_EXILK 0x0C00643C // EXI Clock Lock (unused)
#define SI_COMBUF 0x0C006480 // Communication Buffer (128 bytes)
#define SI_POLL_REG si.poll
#define SI_COMCSR_REG si.comcsr
#define SI_SR_REG si.sr
// SI Poll Register mask
#define SI_POLL_X(reg) ((reg >>16) & 0x3ff)
#define SI_POLL_Y(reg) ((reg >> 8) & 0xff)
#define SI_POLL_EN0 (1 << 7)
#define SI_POLL_EN1 (1 << 6)
#define SI_POLL_EN2 (1 << 5)
#define SI_POLL_EN3 (1 << 4)
#define SI_POLL_VBCPY0 (1 << 3)
#define SI_POLL_VBCPY1 (1 << 2)
#define SI_POLL_VBCPY2 (1 << 1)
#define SI_POLL_VBCPY3 (1 << 0)
// SI Communication Control Status Register mask
#define SI_COMCSR_TCINT (1 << 31)
#define SI_COMCSR_TCINTMSK (1 << 30)
#define SI_COMCSR_COMERR (1 << 29)
#define SI_COMCSR_RDSTINT (1 << 28)
#define SI_COMCSR_RDSTINTMSK (1 << 27)
#define SI_COMCSR_OUTLEN(reg) ((reg >> 16) & 0x7f)
#define SI_COMCSR_INLEN(reg) ((reg >> 8) & 0x7f)
#define SI_COMCSR_CHAN(reg) ((reg >> 1) & 3)
#define SI_COMCSR_TSTART (1)
// SI Status Register mask
#define SI_SR_WR (1 << 31)
#define SI_SR_RDST0 (1 << 29)
#define SI_SR_WRST0 (1 << 28)
#define SI_SR_NOREP0 (1 << 27)
#define SI_SR_COLL0 (1 << 26)
#define SI_SR_OVRUN0 (1 << 25)
#define SI_SR_UNRUN0 (1 << 24)
#define SI_SR_RDST1 (1 << 21)
#define SI_SR_WRST1 (1 << 20)
#define SI_SR_NOREP1 (1 << 19)
#define SI_SR_COLL1 (1 << 18)
#define SI_SR_OVRUN1 (1 << 17)
#define SI_SR_UNRUN1 (1 << 16)
#define SI_SR_RDST2 (1 << 13)
#define SI_SR_WRST2 (1 << 12)
#define SI_SR_NOREP2 (1 << 11)
#define SI_SR_COLL2 (1 << 10)
#define SI_SR_OVRUN2 (1 << 9)
#define SI_SR_UNRUN2 (1 << 8)
#define SI_SR_RDST3 (1 << 5)
#define SI_SR_WRST3 (1 << 4)
#define SI_SR_NOREP3 (1 << 3)
#define SI_SR_COLL3 (1 << 2)
#define SI_SR_OVRUN3 (1 << 1)
#define SI_SR_UNRUN3 (1 << 0)
// ---------------------------------------------------------------------------
// hardware API
// SI state (registers and other data)
struct SIControl
{
volatile uint32_t out[4], shdw[4];// out + shadows
volatile uint32_t poll; // poll control
volatile uint32_t comcsr; // CSR
volatile uint32_t sr; // status
volatile uint32_t exilk; // EXILK dummy
uint8_t combuf[128+32]; // communication buffer (+ overrun protection)
PADState pad[4]; // PAD state (inbuf replacement)
bool rumble[4]; // rumble support flags for every controller
// filled when SI is inited, by checking PADSetRumble
bool log; // do debugger log output
int64_t pollingTime; // Saved Gekko TBR for polling
};
extern SIControl si;
void SIPoll();
void SIOpen();