This commit is contained in:
moonpower
2026-04-06 20:41:10 +02:00
parent 64da9ec8e1
commit 0936e14e1d
460 changed files with 436 additions and 95292 deletions
+78 -54
View File
@@ -13,9 +13,21 @@ static void psx_mcd_ensure_parent(const char* path) {
if (!path)
return;
#ifdef PSVITA_TARGET
const size_t path_len = strlen(path);
if (path_len == 0)
return;
char* tmp = malloc(path_len + 1);
if (!tmp)
return;
memcpy(tmp, path, path_len + 1);
#else
char tmp[PATH_MAX];
strncpy(tmp, path, sizeof(tmp) - 1);
tmp[sizeof(tmp) - 1] = '\0';
#endif
char* slash = strrchr(tmp, '/');
#ifdef _WIN32
@@ -23,20 +35,32 @@ static void psx_mcd_ensure_parent(const char* path) {
if (!slash || (bslash && bslash > slash))
slash = bslash;
#endif
if (!slash || slash == tmp)
if (!slash || slash == tmp) {
#ifdef PSVITA_TARGET
free(tmp);
#endif
return;
}
*slash = '\0';
struct stat st;
if (stat(tmp, &st) == 0)
if (stat(tmp, &st) == 0) {
#ifdef PSVITA_TARGET
free(tmp);
#endif
return;
}
#ifdef _WIN32
_mkdir(tmp);
#else
mkdir(tmp, 0755);
#endif
#ifdef PSVITA_TARGET
free(tmp);
#endif
}
psx_mcd_t* psx_mcd_create(void) {
@@ -84,35 +108,35 @@ int psx_mcd_init(psx_mcd_t* mcd, const char* path) {
return 0;
}
uint8_t psx_mcd_read(psx_mcd_t* mcd) {
switch (mcd->state) {
case MCD_STATE_TX_HIZ: mcd->tx_data = 0xff; break;
case MCD_STATE_TX_FLG:
if ((mcd->rx_data == 0x81) || (mcd->rx_data == 0x01)) {
mcd->tx_data_ready = 1;
mcd->tx_data = 0xff;
mcd->state = MCD_STATE_TX_HIZ;
break;
}
mcd->tx_data = mcd->flag;
mcd->flag = 0x00;
break;
case MCD_STATE_TX_ID1: mcd->tx_data = 0x5a; break;
case MCD_STATE_TX_ID2: {
mcd->tx_data_ready = 1;
mcd->tx_data = 0x5d;
switch (mcd->mode) {
case 'R': mcd->state = MCD_R_STATE_RX_MSB; break;
case 'W': mcd->state = MCD_W_STATE_RX_MSB; break;
case 'S': mcd->state = MCD_S_STATE_TX_ACK1; break;
default:
mcd->tx_data_ready = 0;
mcd->tx_data = 0xff;
mcd->state = MCD_STATE_TX_HIZ;
return mcd->tx_data;
}
uint8_t psx_mcd_read(psx_mcd_t* mcd) {
switch (mcd->state) {
case MCD_STATE_TX_HIZ: mcd->tx_data = 0xff; break;
case MCD_STATE_TX_FLG:
if ((mcd->rx_data == 0x81) || (mcd->rx_data == 0x01)) {
mcd->tx_data_ready = 1;
mcd->tx_data = 0xff;
mcd->state = MCD_STATE_TX_HIZ;
break;
}
mcd->tx_data = mcd->flag;
mcd->flag = 0x00;
break;
case MCD_STATE_TX_ID1: mcd->tx_data = 0x5a; break;
case MCD_STATE_TX_ID2: {
mcd->tx_data_ready = 1;
mcd->tx_data = 0x5d;
switch (mcd->mode) {
case 'R': mcd->state = MCD_R_STATE_RX_MSB; break;
case 'W': mcd->state = MCD_W_STATE_RX_MSB; break;
case 'S': mcd->state = MCD_S_STATE_TX_ACK1; break;
default:
mcd->tx_data_ready = 0;
mcd->tx_data = 0xff;
mcd->state = MCD_STATE_TX_HIZ;
return mcd->tx_data;
}
// printf("mcd read %02x\n", mcd->tx_data);
@@ -166,12 +190,12 @@ uint8_t psx_mcd_read(psx_mcd_t* mcd) {
return 'G';
} break;
/* Write states */
case MCD_W_STATE_RX_MSB: mcd->tx_data = 0x00; break;
case MCD_W_STATE_RX_LSB: mcd->tx_data = mcd->msb;
mcd->pending_bytes = 128; break;
case MCD_W_STATE_RX_DATA: {
--mcd->pending_bytes;
/* Write states */
case MCD_W_STATE_RX_MSB: mcd->tx_data = 0x00; break;
case MCD_W_STATE_RX_LSB: mcd->tx_data = mcd->msb;
mcd->pending_bytes = 128; break;
case MCD_W_STATE_RX_DATA: {
--mcd->pending_bytes;
mcd->buf[mcd->addr++] = mcd->rx_data;
@@ -187,12 +211,12 @@ uint8_t psx_mcd_read(psx_mcd_t* mcd) {
// log_fatal("mcd read %02x", mcd->rx_data);
// log_set_quiet(1);
return mcd->rx_data;
} break;
case MCD_W_STATE_RX_CHK: mcd->tx_data = mcd->rx_data; break;
case MCD_W_STATE_RX_CHK2: mcd->tx_data = mcd->rx_data; break;
case MCD_W_STATE_TX_ACK1: mcd->tx_data = 0x5c; break;
case MCD_W_STATE_TX_ACK2: mcd->tx_data = 0x5d; break;
return mcd->rx_data;
} break;
case MCD_W_STATE_RX_CHK: mcd->tx_data = mcd->rx_data; break;
case MCD_W_STATE_RX_CHK2: mcd->tx_data = mcd->rx_data; break;
case MCD_W_STATE_TX_ACK1: mcd->tx_data = 0x5c; break;
case MCD_W_STATE_TX_ACK2: mcd->tx_data = 0x5d; break;
case MCD_W_STATE_TX_MEB: {
mcd->tx_data_ready = 0;
mcd->state = MCD_STATE_TX_HIZ;
@@ -219,12 +243,12 @@ uint8_t psx_mcd_read(psx_mcd_t* mcd) {
return mcd->tx_data;
}
void psx_mcd_write(psx_mcd_t* mcd, uint8_t data) {
mcd->rx_data = data;
switch (mcd->state) {
case MCD_STATE_TX_FLG: mcd->mode = data; break;
case MCD_R_STATE_RX_MSB: mcd->msb = data; break;
void psx_mcd_write(psx_mcd_t* mcd, uint8_t data) {
mcd->rx_data = data;
switch (mcd->state) {
case MCD_STATE_TX_FLG: mcd->mode = data; break;
case MCD_R_STATE_RX_MSB: mcd->msb = data; break;
case MCD_R_STATE_RX_LSB: {
mcd->lsb = data;
mcd->addr = ((mcd->msb << 8) | mcd->lsb) << 7;
@@ -234,11 +258,11 @@ void psx_mcd_write(psx_mcd_t* mcd, uint8_t data) {
mcd->lsb = data;
mcd->addr = ((mcd->msb << 8) | mcd->lsb) << 7;
} break;
case MCD_W_STATE_RX_DATA: break;
case MCD_W_STATE_RX_CHK: /* Don't care */ break;
case MCD_W_STATE_RX_CHK2: /* Don't care */ break;
}
}
case MCD_W_STATE_RX_DATA: break;
case MCD_W_STATE_RX_CHK: /* Don't care */ break;
case MCD_W_STATE_RX_CHK2: /* Don't care */ break;
}
}
int psx_mcd_query(psx_mcd_t* mcd) {
return mcd->tx_data_ready;