Replace React Native frontend with FSUI integration

This commit is contained in:
moonpower
2026-04-04 22:08:46 +02:00
parent 4d520d1ccd
commit 01a308dd44
68 changed files with 3753 additions and 40832 deletions
+51 -2
View File
@@ -1,2 +1,51 @@
// To-do: Implement CHD support
#include "chd.h"
#include <stdlib.h>
#include "chd.h"
chd_t* chd_create(void) {
return (chd_t*)calloc(1, sizeof(chd_t));
}
void chd_init(chd_t* chd) {
(void)chd;
}
int chd_load(chd_t* chd, const char* path) {
(void)chd;
(void)path;
return 1;
}
int chd_read(chd_t* chd, uint32_t lba, void* buf) {
(void)chd;
(void)lba;
(void)buf;
return 0;
}
int chd_query(chd_t* chd, uint32_t lba) {
(void)chd;
(void)lba;
return TS_FAR;
}
int chd_get_track_number(chd_t* chd, uint32_t lba) {
(void)chd;
(void)lba;
return 0;
}
int chd_get_track_count(chd_t* chd) {
(void)chd;
return 0;
}
int chd_get_track_lba(chd_t* chd, int track) {
(void)chd;
(void)track;
return 0;
}
void chd_destroy(chd_t* chd) {
free(chd);
}
+6 -7
View File
@@ -13,7 +13,6 @@ const char* disc_cd_extensions[] = {
"cue",
"bin",
"iso",
"chd",
0
};
@@ -183,12 +182,12 @@ int psx_disc_open_as(psx_disc_t* disc, const char* path, int type) {
}
disc->udata = chd;
disc->read_sector = chd_read;
disc->query_sector = chd_query;
disc->get_track_number = chd_get_track_number;
disc->get_track_count = chd_get_track_count;
disc->get_track_lba = chd_get_track_lba;
disc->destroy = chd_destroy;
disc->read_sector = (read_sector_func)chd_read;
disc->query_sector = (query_sector_func)chd_query;
disc->get_track_number = (get_track_number_func)chd_get_track_number;
disc->get_track_count = (get_track_count_func)chd_get_track_count;
disc->get_track_lba = (get_track_lba_func)chd_get_track_lba;
disc->destroy = (destroy_func)chd_destroy;
} break;
default:
+10 -14
View File
@@ -424,14 +424,8 @@ void gpu_render_triangle(psx_gpu_t* gpu, vertex_t v0, vertex_t v1, vertex_t v2,
#define CLAMP(v, d, u) ((v) <= (d)) ? (d) : (((v) >= (u)) ? (u) : (v))
void gpu_render_rect(psx_gpu_t* gpu, rect_data_t data) {
if ((data.v0.x >= 1024) || (data.v0.y >= 512))
return;
if ((data.v0.x <= -1024) || (data.v0.y <= -512))
return;
uint16_t width, height;
void gpu_render_rect(psx_gpu_t* gpu, rect_data_t data) {
uint16_t width, height;
switch ((data.attrib >> 3) & 3) {
case RS_VARIABLE: { width = data.width; height = data.height; } break;
@@ -447,12 +441,14 @@ void gpu_render_rect(psx_gpu_t* gpu, rect_data_t data) {
int clutx = (data.clut & 0x3f) << 4;
int cluty = (data.clut >> 6) & 0x1ff;
/* Offset coordinates */
data.v0.x += gpu->off_x;
data.v0.y += gpu->off_y;
/* Calculate bounding box */
int xmax = data.v0.x + width;
/* Offset coordinates */
data.v0.x += gpu->off_x;
data.v0.y += gpu->off_y;
data.v0.x = SE10(data.v0.x);
data.v0.y = SE10(data.v0.y);
/* Calculate bounding box */
int xmax = data.v0.x + width;
int ymax = data.v0.y + height;
xmax = CLAMP(xmax, -1024, 1024);
+52 -33
View File
@@ -84,20 +84,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: 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;
}
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);
@@ -151,12 +166,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 = 127; 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;
@@ -172,11 +187,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_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;
@@ -203,10 +219,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) {
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;
@@ -216,10 +234,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: mcd->rx_data = data; break;
case MCD_W_STATE_RX_CHK: /* 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;
+9 -8
View File
@@ -22,13 +22,14 @@ enum {
MCD_R_STATE_TX_DATA,
MCD_R_STATE_TX_CHK,
MCD_R_STATE_TX_MEB,
MCD_W_STATE_RX_MSB,
MCD_W_STATE_RX_LSB,
MCD_W_STATE_RX_DATA,
MCD_W_STATE_RX_CHK,
MCD_W_STATE_TX_ACK1,
MCD_W_STATE_TX_ACK2,
MCD_W_STATE_TX_MEB,
MCD_W_STATE_RX_MSB,
MCD_W_STATE_RX_LSB,
MCD_W_STATE_RX_DATA,
MCD_W_STATE_RX_CHK,
MCD_W_STATE_RX_CHK2,
MCD_W_STATE_TX_ACK1,
MCD_W_STATE_TX_ACK2,
MCD_W_STATE_TX_MEB,
MCD_S_STATE_TX_ACK1,
MCD_S_STATE_TX_ACK2,
MCD_S_STATE_TX_DAT0,
@@ -61,4 +62,4 @@ int psx_mcd_query(psx_mcd_t*);
void psx_mcd_reset(psx_mcd_t*);
void psx_mcd_destroy(psx_mcd_t*);
#endif
#endif
+19 -17
View File
@@ -292,23 +292,25 @@ void psx_pad_detach_joy(psx_pad_t* pad, int slot) {
pad->joy_slot[slot] = NULL;
}
int psx_pad_attach_mcd(psx_pad_t* pad, int slot, const char* path) {
return 0; // seems to loop forever
if (!path)
return 1;
if (pad->mcd_slot[slot])
psx_pad_detach_mcd(pad, slot);
psx_mcd_t* mcd = psx_mcd_create();
int r = psx_mcd_init(mcd, path);
if (r) {
psx_pad_detach_mcd(pad, slot);
return r;
}
int psx_pad_attach_mcd(psx_pad_t* pad, int slot, const char* path) {
if (!path)
return 1;
if (pad->mcd_slot[slot])
psx_pad_detach_mcd(pad, slot);
psx_mcd_t* mcd = psx_mcd_create();
if (!mcd)
return 1;
int r = psx_mcd_init(mcd, path);
if (r) {
psx_mcd_destroy(mcd);
return r;
}
pad->mcd_slot[slot] = mcd;