2023-05-30 18:08:52 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "ps1/registers.h"
|
|
|
|
|
|
|
|
namespace io {
|
|
|
|
|
|
|
|
/* Register and bit definitions */
|
|
|
|
|
|
|
|
enum JAMMAInput : uint32_t {
|
|
|
|
// SYS573_JAMMA_MAIN
|
|
|
|
JAMMA_P2_LEFT = 1 << 0,
|
|
|
|
JAMMA_P2_RIGHT = 1 << 1,
|
|
|
|
JAMMA_P2_UP = 1 << 2,
|
|
|
|
JAMMA_P2_DOWN = 1 << 3,
|
|
|
|
JAMMA_P2_BUTTON1 = 1 << 4,
|
|
|
|
JAMMA_P2_BUTTON2 = 1 << 5,
|
|
|
|
JAMMA_P2_BUTTON3 = 1 << 6,
|
|
|
|
JAMMA_P2_START = 1 << 7,
|
|
|
|
JAMMA_P1_LEFT = 1 << 8,
|
|
|
|
JAMMA_P1_RIGHT = 1 << 9,
|
|
|
|
JAMMA_P1_UP = 1 << 10,
|
|
|
|
JAMMA_P1_DOWN = 1 << 11,
|
|
|
|
JAMMA_P1_BUTTON1 = 1 << 12,
|
|
|
|
JAMMA_P1_BUTTON2 = 1 << 13,
|
|
|
|
JAMMA_P1_BUTTON3 = 1 << 14,
|
|
|
|
JAMMA_P1_START = 1 << 15,
|
|
|
|
|
|
|
|
// SYS573_JAMMA_EXT1
|
|
|
|
JAMMA_P1_BUTTON4 = 1 << 16,
|
|
|
|
JAMMA_P1_BUTTON5 = 1 << 17,
|
|
|
|
JAMMA_TEST = 1 << 18,
|
|
|
|
JAMMA_P1_BUTTON6 = 1 << 19,
|
|
|
|
|
|
|
|
// SYS573_JAMMA_EXT2
|
|
|
|
JAMMA_P2_BUTTON4 = 1 << 20,
|
|
|
|
JAMMA_P2_BUTTON5 = 1 << 21,
|
|
|
|
JAMMA_UNKNOWN = 1 << 22,
|
|
|
|
JAMMA_P2_BUTTON6 = 1 << 23,
|
|
|
|
|
|
|
|
// SYS573_MISC_IN
|
|
|
|
JAMMA_COIN1 = 1 << 24,
|
|
|
|
JAMMA_COIN2 = 1 << 25,
|
|
|
|
JAMMA_PCMCIA_CD1 = 1 << 26,
|
|
|
|
JAMMA_PCMCIA_CD2 = 1 << 27,
|
|
|
|
JAMMA_SERVICE = 1 << 28
|
|
|
|
};
|
|
|
|
|
|
|
|
enum CartInputPin {
|
|
|
|
IN_1WIRE = 6
|
|
|
|
};
|
|
|
|
|
|
|
|
enum CartOutputPin {
|
|
|
|
OUT_SDA = 0,
|
|
|
|
OUT_SCL = 1,
|
|
|
|
OUT_CS = 2,
|
|
|
|
OUT_RESET = 3,
|
|
|
|
OUT_1WIRE = 4
|
|
|
|
};
|
|
|
|
|
|
|
|
enum MiscOutputPin {
|
|
|
|
MISC_ADC_MOSI = 0,
|
|
|
|
MISC_ADC_CS = 1,
|
|
|
|
MISC_ADC_SCK = 2,
|
|
|
|
MISC_COIN_COUNT1 = 3,
|
|
|
|
MISC_COIN_COUNT2 = 4,
|
|
|
|
MISC_AMP_ENABLE = 5,
|
|
|
|
MISC_CDDA_ENABLE = 6,
|
|
|
|
MISC_SPU_ENABLE = 7,
|
|
|
|
MISC_JVS_STAT = 8
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Inputs */
|
|
|
|
|
|
|
|
static inline void clearWatchdog(void) {
|
|
|
|
SYS573_WATCHDOG = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t getDIPSwitches(void) {
|
|
|
|
return SYS573_DIP_CART & 0xf;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool getCartInsertionStatus(void) {
|
2023-06-12 07:19:32 +02:00
|
|
|
return (SIO_STAT(1) / SIO_STAT_DSR) & 1;
|
2023-05-30 18:08:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool getCartSerialStatus(void) {
|
2023-06-12 07:19:32 +02:00
|
|
|
SIO_CTRL(1) |= SIO_CTRL_RTS;
|
|
|
|
return (SIO_STAT(1) / SIO_STAT_CTS) & 1;
|
2023-05-30 18:08:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Bitbanged I/O */
|
|
|
|
|
|
|
|
extern uint16_t _bankSwitchReg, _cartOutputReg, _miscOutputReg;
|
|
|
|
|
|
|
|
static inline bool getCartInput(CartInputPin pin) {
|
|
|
|
return (SYS573_DIP_CART >> (8 + pin)) & 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool getCartSDA(void) {
|
2023-06-12 07:19:32 +02:00
|
|
|
return (SYS573_MISC_IN / SYS573_MISC_IN_CART_SDA) & 1;
|
2023-05-30 18:08:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void setCartOutput(CartOutputPin pin, bool value) {
|
|
|
|
if (value)
|
|
|
|
_cartOutputReg |= 1 << pin;
|
|
|
|
else
|
|
|
|
_cartOutputReg &= ~(1 << pin);
|
|
|
|
|
|
|
|
SYS573_CART_OUT = _cartOutputReg;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void setCartSDADir(bool dir) {
|
|
|
|
if (dir)
|
|
|
|
_bankSwitchReg |= 1 << 6;
|
|
|
|
else
|
|
|
|
_bankSwitchReg &= ~(1 << 6);
|
|
|
|
|
|
|
|
SYS573_BANK_CTRL = _bankSwitchReg;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void setMiscOutput(MiscOutputPin pin, bool value) {
|
|
|
|
if (value)
|
|
|
|
_miscOutputReg |= 1 << pin;
|
|
|
|
else
|
|
|
|
_miscOutputReg &= ~(1 << pin);
|
|
|
|
|
|
|
|
SYS573_MISC_OUT = _miscOutputReg;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Digital I/O board driver */
|
|
|
|
|
|
|
|
// TODO: these do not seem to actually be LDC and HDC...
|
|
|
|
static inline bool isDigitalIOPresent(void) {
|
|
|
|
return (
|
|
|
|
(SYS573D_CPLD_STAT & (SYS573D_CPLD_STAT_LDC | SYS573D_CPLD_STAT_HDC))
|
|
|
|
== SYS573D_CPLD_STAT_HDC
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool getDIO1Wire(void) {
|
|
|
|
return (SYS573D_FPGA_DS2401 >> 12) & 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void setDIO1Wire(bool value) {
|
|
|
|
SYS573D_FPGA_DS2401 = (value ^ 1) << 12;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Other APIs */
|
|
|
|
|
|
|
|
void init(void);
|
|
|
|
uint32_t getJAMMAInputs(void);
|
2023-06-12 07:19:32 +02:00
|
|
|
uint32_t getRTCTime(void);
|
2023-05-30 18:08:52 +02:00
|
|
|
|
|
|
|
bool loadBitstream(const uint8_t *data, size_t length);
|
|
|
|
void initKonamiBitstream(void);
|
|
|
|
|
|
|
|
void i2cStart(void);
|
|
|
|
void i2cStartWithCS(int csDelay = 0);
|
|
|
|
void i2cStop(void);
|
|
|
|
void i2cStopWithCS(int csDelay = 0);
|
|
|
|
|
|
|
|
uint8_t i2cReadByte(void);
|
|
|
|
void i2cWriteByte(uint8_t value);
|
|
|
|
void i2cSendACK(bool ack);
|
|
|
|
bool i2cGetACK(void);
|
|
|
|
void i2cReadBytes(uint8_t *data, size_t length);
|
|
|
|
bool i2cWriteBytes(const uint8_t *data, size_t length, int lastACKDelay = 0);
|
|
|
|
|
|
|
|
uint32_t i2cResetX76(void);
|
|
|
|
uint32_t i2cResetZS01(void);
|
|
|
|
|
|
|
|
bool dsCartReset(void);
|
|
|
|
bool dsDIOReset(void);
|
|
|
|
uint8_t dsCartReadByte(void);
|
|
|
|
uint8_t dsDIOReadByte(void);
|
|
|
|
void dsCartWriteByte(uint8_t value);
|
|
|
|
void dsDIOWriteByte(uint8_t value);
|
|
|
|
|
|
|
|
}
|