mirror of
https://github.com/ARMSX2/ARMSX1.git
synced 2026-08-24 16:53:35 -07:00
Replace React Native frontend with FSUI integration
This commit is contained in:
+51
-2
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user